數據庫存儲數據結構
網狀結構
層次結構
二維表結構:二維表結構可以清晰的將數據與數據之間的關系表述清楚
數據庫管理系統
oracle:大型數據庫管理系統
mysql:中小型
DB2:中小型
Acess:小型
Sql Server:大型數據庫
oracle的服務:(需要開啟的服務)
orcaleServiceorcl:orcale啟動服務
OracleOraDb11g_home1TNSListener:oracle監聽器服務
OracleDBConsoleorcl:控制台服務
oracle賬戶:
sys:超級管理員
system:管理員
scott:普通用戶 默認密碼:tiger
oracle修改密碼:
層次結構
二維表結構:二維表結構可以清晰的將數據與數據之間的關系表述清楚
數據庫管理系統
oracle:大型數據庫管理系統
mysql:中小型
DB2:中小型
Acess:小型
Sql Server:大型數據庫
oracle的服務:(需要開啟的服務)
orcaleServiceorcl:orcale啟動服務
OracleOraDb11g_home1TNSListener:oracle監聽器服務
OracleDBConsoleorcl:控制台服務
oracle賬戶:
sys:超級管理員
system:管理員
scott:普通用戶 默認密碼:tiger
oracle修改密碼:
在cmd命令行中使用命令:sqlplus / as sysdba 然后使用命令: alter user 用戶名 identified by 新密碼; 在cmd命令行中使用命令:sqlplus /nolog 然后使用命令:conn as sysdba 然后輸入一個已知的用戶名和密碼 然后使用命令: alter user 用戶名 identified by 新密碼;
oracle目錄及卸載
1、oracle的目錄介紹:
oradata:數據庫存儲文件的目錄
db_home:
network >admin:配置網絡服務和監聽器服務
jdk:oracle自帶jdk
deinstall:卸載命令
jdbc:與java交互的jar包
2、oracle的卸載:
使用oracle自帶的程序卸載
刪除app目錄
刪除注冊表
刪除環境變量
oradata:數據庫存儲文件的目錄
db_home:
network >admin:配置網絡服務和監聽器服務
jdk:oracle自帶jdk
deinstall:卸載命令
jdbc:與java交互的jar包
2、oracle的卸載:
使用oracle自帶的程序卸載
刪除app目錄
刪除注冊表
刪除環境變量
使用別名
as可以省略不寫,如果有特殊字符獲取空格使用雙引號添加別名
select ename 姓名,job 工作,sal*12 年資,sal*12+3000 年薪 from emp 直接在字段后面添加別名 select ename "姓名",job 工作,sal*12 ’年資’,sal*12+3000 年薪 from emp 使用雙引號添加別名,不能使用單引號 select ename as 姓名,job "工作",sal*12 年資,sal*12+3000 年薪 from emp 使用as關鍵字添加別名 select ename "姓 名",job 工作,sal*12 年資,sal*12+3000 年薪 from emp 如果別名中有空格或者其他特殊字符,使用雙引號
使用鏈接符:
select ename,job,sal from emp; select ename||job,sal from emp; 使用||符號進行字符鏈接 select ename||' 的工作是 '||job||' 並且月工資是 '||sal from emp; 字符鏈接,普通字符使用單引號
去除重復 distinct
select * from emp;
select job from emp--發現工作是重復的,而工作種類是需要去除重復的
排序
select 字段名,字段名...from 表名 order by 字段名 select ename,job,sal from emp order by sal; 使用order by排序 select ename,job,sal from emp order by sal desc; 使用desc關鍵從大到小排序 select ename,job,sal from emp order by sal asc; 使用asc關鍵從小到大排序,默認是從小到大排序 select * from emp order by sal,ename 多字段作為排序條件的時候,優先按照第一個字段排序,然后依次按照其他字段排序。 select ename,job,sal 工資 from emp order by 工資 使用別名 select ename,job,sal from emp order by sal*12 使用算術表達式
簡單的where子句
使用where條件進行結果篩選
語法:select * from 表名 where 條件;注意:條件中字段值區分大小寫,字段名不區分大小寫,字段值使用單引號括起來
1、在where中使用算術表達式 = ,< , > ,>= ,<= ,<>
2、使用order by 對篩選結果進行排序,order by 出現在where后面
查看工資等於1250的員工信息 select * from emp where sal='1250'--篩選條件是個數字也可以使用單引號 查看工作等於CLERK的員工信息 select * from emp where job='CLERK'--在篩選條件中字段值如果是字符需要加上單引號 select * from emp where job='clerk'--在sql語句中字段的值是區分大小寫的 select * from emp where JOB='CLERK'--在sql中字段是不區分大小寫的 查看工資大於1250的員工姓名和工作 select ename,job ,sal from emp where sal>'1250' order by sal--使用order by 對篩選結果進行排序,order by 出現在where后面 查看工資大於等於2000的員工信息 select * from emp where sal>=2000; 查看工資小於等於2000的員工信息; select * from emp where sal<=2000 查看工資不等於1500的員工信息 select * from emp where sal<>1500 order by sal 查看入職日期在81年后的員工信息 select * from emp where hiredate>'1981年12月31號' select * from emp where hiredate>'1981/12/31' select * from emp where hiredate>'31-12月-1981'--使用日期的默認格式查詢符合要求的數據,日-月-年
where子句使用關鍵字
1、and 用於多條件的與篩選:select * from 表名 where 條件 and 條件 and 條件....
2、or 用於多條件的或篩選: select * from 表名 where 條件 or 條件 or 條件....
3、in 用於多條件的或篩選: select * from 表名 where 字段名 in(值,值,值....)
4、like用於模糊查詢: select * from 表名 where 字段名 like '%值%' 包含
5、is null 和is not null 用來判斷字段是否為空 select * from 表名 where 字段名 is null
--查詢工資在2000-3000之間的員工信息 select * from emp where sal>=2000 and sal<=3000--使用and關鍵字進行"與"的多條件篩選; select * from emp where sal between 2000 and 3000;--使用between and 關鍵字進行篩選; --查詢工作為SALESMAN,ANALYST,MANAGER的員工信息 select * from emp where job='SALESMAN' or job='ANALYST' or job='MANAGER'--使用or關鍵字進行"或"的多條件篩選 select * from emp where job in('SALESMAN','ANALYST','MANAGER');--使用in關鍵字進行"或"的多條件篩選 select * from emp where job='ANALYST' --查詢姓名中包含s的,以s開頭的,以s結尾的,第二個字符為A的。 select * from emp where ename like '%S%';--使用like關鍵字,姓名中包含S的,%代表任意多個字符 select * from emp where ename like 'S%';--使用like關鍵字,以S開頭的 select * from emp where ename like '%S';--以S結尾的 select * from emp where ename like '_A%'--使用"_"指定位置包含指定字符的信息,"_"代表任意一個字符 --------------查詢名字中包含下划線的用戶信息 select * from emp where ename like '%A_%'escape 'A';--使用escape關鍵字將普通字符設置成為轉譯字符。 --查詢有津貼的員工信息 select * from emp where comm is not null; select * from emp where comm is null;--查詢沒有津貼的員工信息
函數
--查詢工作為SALESMAN,MANAGER並且工資大於2500的員工信息
--1、使用小括號提升where篩選條件的執行優先級別
--2、and的優先級別高於or
select * from emp
select * from emp where job='SALESMAN' or job='MANAGER' and sal>2500
select * from emp where (job='SALESMAN' or job='MANAGER') and sal>2500
-----------------------------------------------------------------------------------------------------------
使用函數 單行函數 多行函數 轉換函數 其他函數
--單行函數:不改變原始數據,只改變結果
---1、字符函數
select * from emp;
select INITCAP(ename) from emp;--initcap函數將首字母大寫
select lower(ename)from emp;--lower 字母小寫
select replace(ename,'S','M') from emp;--replace 替換
--2、數值函數--Math
----偽表 dual
select * from dual
select abs(-3) 絕對值,ceil(3.1415926)向上取整,floor(3.1415926)向下取整,power(2,3)冪,round(3.4)四舍五入 from dual
--3、日期函數
select months_between('13-12月-2016','13-10月-2016') from dual--months_between兩個日期之間的月份數
多行函數
max: max(字段名) 返回此字段的最大值
min:min(字段名) 返回此字段的最小值
avg:avg(字段名) 返回平均值
sum:sum(字段名) 返回字段的和
count:count
--count(*),用來查詢表中有多少條記錄
--count(字段名),用來查詢某個字段有值的個數
--count(distinct 字段名),可以先去除重復再計數。
注意:
--多行函數不能和普通字段直接出現在查詢語句中,除非group by
--多行函數和單行函數不能直接出現在查詢語句中,除非group by
查看員工的最高工資
select max(sal),ename from emp--多行函數不能和普通字段直接出現在查詢語句中,除非group by
select max(sal),lower(ename) from emp--多行函數和單行函數不能直接出現在查詢語句中,除非group by
select ename from emp
查看員工的最低工資
select min(sal) from emp
查看員工的平均工資
select avg(sal) from emp
查看所有的員工工資之和
select sum(sal) from emp
查詢公司有多少員工
select * from emp
select count(*) from emp--使用count(*)來查看一張表中有多少條記錄
查詢有津貼的員工人數
select count(comm) from emp--使用count(字段名),查詢該字段有值的記錄數
select count(ename) from emp
查詢公司有多少工作種類
select count(job) from emp
select count(distinct job) from emp
轉換函數:在轉換的時候改變的是數據的類型,數據內容不會改變,可以指定格式。
1、to_number:將數字字符轉換為數字類型的數值,to_number(數字字符)
2、to_char:將數字轉換為字符類型,將日期轉換為字符類型 to_char(數字/日期)
3、to_date:將字符類型的日期轉換為日期類型: to_date(char)
--------------------------------------------------------------------------------------
number-->char 轉換的時候使用的是默認格式,
select to_char(123) from dual--將數字轉換為字符類型,使用to_char(number)
select sal, to_char(sal) from emp
number-->char 使用指定的格式
to_char(number,'格式'),格式:
$代表美元符,9代碼數字占位。例如,L999,999,999表示三位一組的顯示方式L代表人民幣符號,0代表保留數字個數,不足使用0補充。
select to_char(sal),to_char(sal,'L999,999,999') from emp
select to_char(sal),to_char(sal,'L0000.00') from emp
char--->number to_number(數字字符)
select to_number('123') from dual
char--->date,轉換的字符必須是日期格式的字符串,默認格式 dd-mm-yyyy
注意:因為字符串有很多,所以在字符轉換為日期的時候,需要指定格式,因為日期是具備一定格式的字符組合。
字符轉換為日期的時候,指定的格式為字符的日期順序,無需指定間隔符。
yyyy:表示年 mm:表示月 dd表示日
select to_date('05-12月-2016') from dual;
select to_date('2016-05-12','yyyy-mm-dd') from dual--使用指定的格式將指定的日期字符串轉換為日期
select to_date('12-05-2016','mm/dd/yyyy') from dual
date--->char
注意:因為日期本身就具備一定的格式在不是指定格式的情況下會默認使用dd-mm-yyyy格式顯示數據
指定的格式會作為日期轉換為字符串類型的顯示格式存在。例如:
yyyy-mm-dd' ‘2016-12-05’
yyyy/mm/dd' '2016/12/05'
yyyy"年"mm"月"dd"日"' 2016年12月05日
select hiredate,to_char(hiredate) from emp--日期轉換為字符的時候,不指定格式使用默認格式:dd-mm-yyyy
select hiredate,to_char(hiredate,'yyyy-mm-dd') from emp;--使用指定格式將日期轉換為字符串類型
select hiredate,to_char(hiredate,'yyyy/mm/dd') from emp;--使用指定格式將日期轉換為字符串類型
select hiredate,to_char(hiredate,'yyyy"年"mm"月"dd"日"') from emp;--使用指定格式將日期轉換為字符串類型
查詢入職日期在81年10月20日后的員工信息
第一種:自動轉型
select * from emp where hiredate>'20-10月-1981'
第二種:將日期轉換為字符串
select * from emp where to_char(hiredate,'yyyy-mm-dd')>'1981-10-20'
第三種:
select * from emp where hiredate>to_date('1981-10-20','yyyy/mm/dd')
其他函數:
1、nvl():nvl(字段名,執行)--相當於java中的if條件判斷
2、nvl2():nvl2(字段名,值,值)--相當於java中的If(){}else{}判斷
3、decode():decode(字段名,條件1,執行內容1,條件2,執行內容2,條件3,執行內容3,默認執行內容)
相當於java中if(){}else if(){}else if(){}...else{}
查詢所有員工的月薪及姓名和工作
select * from emp
select ename,sal 基本工資,comm 績效,sal+comm 月薪 from emp
select ename,sal 基本工資,comm 績效,sal+nvl(comm,0)月薪 from emp
查詢所有員工的月薪及姓名和工作
select ename,sal 基本工資,comm 績效,nvl2(comm,sal+comm,sal)月薪 from emp
顯示員工的職稱
select ename,job,decode(job,'MANAGER','經理','SALESMAN','銷售人員','普通員工') from emp
使用group by分組
在多行函數中不能直接使用普通字段,除非group by
在多行函數中不能直接使用單行函數,除非group by
---1、使用group by進行數據分組 select 多行函數,分組字段 from 表名 group by 分組字段
---2、多字段進行分組的時候,按照字段順序進行分組,第一條件分組完成后,繼續使用其他條件依次分組。
---3、group by依然可以和order by 聯合使用
---4、可以和單行函數聯合進行分組,注意使用了單行函數那么在查詢語句中必須也要使用
查詢最高工資和員工數
select max(sal),count(*) from emp
查詢不同部門的最高工資
select * from emp order by deptno
select deptno,max(sal) from emp group by deptno--使用group進行分組查詢,分組的字段可以出現在查詢中,其他字段依然不可以
查詢不同工作崗位的員工數
select * from emp for update
select lower(job),count(*) from emp group by lower(job)--使用單行函數進行分組
查詢不同部門的不同工作崗位的人數
select deptno,job ,count(*) from emp group by deptno,job--使用多字段組合進行分組
select deptno,job ,count(*) from emp group by deptno,job order by deptno
查詢不同部門的不同工作崗位的並且人數大於1的信息
select count(*) from emp where count(*)>3 group by deptno
select deptno,job ,count(*) from emp where count(*)>1 group by deptno,job order by deptno
查詢部門號大於10的不同部門的不同工作崗位的人數
select deptno,job ,count(*) from emp where deptno>10 group by deptno,job order by deptno
使用having進行分組后篩選
--1、使用group by分組后在進行數據篩選的時候,where中不能出現多行函數,所以使用新的關鍵字having進行條件篩選
--2、where條件篩選的執行順序:from-->where--->group -->select
--3、having條件篩選的執行順序:from-->group by -->having-->select
--4、where的執行效率比having要高,能使用where的情況下盡量不要使用having
查詢不同部門的不同工作崗位的並且人數大於1的信息
使用where語句進行篩選
where條件語句sql執行順序:from-->where--->group -->select
select count(*) from emp where count(*)>1 group by deptno,job
使用having語句進行篩選
having條件語句的執行順序:from-->group by -->having-->select
select deptno, count(*) from emp group by deptno having count(*)>5
select deptno,job ,count(*) from emp group by deptno,job having deptno>10 order by deptno
插入數據學習及數據的備份
1、插入數據 insert into 表名(字段1,字段2,字段3,....)values('值1','值2','值3'.....)
2、主鍵:用來唯一標識一條數據的字段通常設置主鍵,主鍵是唯一不可以重復的
3、如果插入的數據是全字段數據,字段可以省略不寫。部分字段,必須加上字段說明和字段值,但是主鍵不能為空
4、事務的提交:如果一個事件是由多個動作組成,只要有一個動作沒有執行成功則自動將數據回滾到原始狀態,此們技術稱之為事務
保證數據的安全和完整
事物的提交:
使用第三放插件的提交按鈕
使用commit語句
select * from dept for update
在北京新建了一個名為LOL學院的新部門,請插入
insert into dept(deptno,dname,loc)values('50','lol學院','北京');
主鍵是唯一不可以重復的
insert into dept(deptno,dname,loc)values('50','教學部','北京');
如果插入的數據是全字段數據,字段可以省略不寫。部分字段,必須加上字段說明和字段值,但是主鍵不能為空
insert into dept values('80','教學部','北京');
insert into dept values('90','教學部','北京');
insert into dept values(100','教學部','北京');
insert into dept values('110','教學部','北京');
創建數據的備份
(1)create table 表名 as 查詢語句,創建的是和查詢結果一樣的表,查詢結果是什么就會備份一個相同的表
(2)insert into 表名 查詢語句,注意:查詢出來的結果在結構上必須和插入數據的表相同,字段個數必須相同
(3)注意:備份表只有字段和數據相同,並不會備份約束。
1、備份完整的數據和表
select * from dept;
create table tdept as select * from dept;--備份dept表和數據,只能備份數據和字段
select * from tdept
2、備份完整表
create table tdept1 as select * from dept where 1>2--備份表,不備份數據。
3、備份部分數據和表.create table 表名 as 查詢語句,創建的是和查詢結果一樣的表,查詢結果是什么就會備份一個相同的表
create table tdept2 as select dname,loc from dept
select *from tdept2
4、給備份表添加數據 insert into 表名 查詢語句,注意:查詢出來的結果在結構上必須和插入數據的表相同,字段個數必須相同
select * from tdept1
insert into tdept1 select dname,loc from dept where deptno>40
select *from tdept2
create table tdept2 as select dname,loc from dept
select *from tdept2
4、給備份表添加數據 insert into 表名 查詢語句,注意:查詢出來的結果在結構上必須和插入數據的表相同,字段個數必須相同
select * from tdept1
insert into tdept1 select dname,loc from dept where deptno>40
select *from tdept2
insert into tdept2 select dname,loc from dept where deptno>40
數據的更新和刪除:
更新數據:update
語法結構:update 表名 set 字段名1='字段值1',字段名2='字段值2',...where 條件
將部門70的名字改為教學部2
update dept set dname='教學部2' where deptno='70'
update dept set dname='教學部2',loc='上海' where deptno='70'
select * from dept
刪除數據:delete
1)刪除語句:delete 表名 where 條件
--刪除部門標號為70的數據
delete dept where deptno='70'---刪除指定數據
select * from dept
delete tdept---清空表數據
truncate table tdept---清空表數據建議使用truncate關鍵字,但是此關鍵字不能回滾數據
sql的聯合查詢(多表查詢)
--1、sql92標准
----笛卡爾積:一件事情的完成需要很多步驟,而不同的步驟有很多種方式,完成這件事情的所有方式稱之為笛卡爾積
select * from emp--14
select * from dept--7
select * from emp,dept order by ename--7*14=98
等值鏈接,鏈接條件。等值鏈接的時候字段的名字可以不相同,但是字段的值要相同。
--查詢員工姓名,工作,薪資,部門名稱
select * from emp,dept where emp.deptno=dept.deptno--使用等值鏈接進行結果篩選
select ename,job,sal,dname from emp,dept where emp.deptno=dept.deptno;--使用等值鏈接查詢指定字段數據
select ename,job,sal,emp.deptno,dname from emp,dept where emp.deptno=dept.deptno;--多表查詢的時候,查看相同字段的值,必須聲明所在表
select emp.ename,emp.job,emp.sal,emp.deptno,dept.dname from emp,dept where emp.deptno=dept.deptno;--在查詢指定字段值的時候,加上表名提高查詢效率
select e.ename,e.job,e.sal,e.deptno,d.dname from emp e,dept d where e.deptno=d.deptno;--多表查詢中使用別名進行表的區分
select e.ename,e.job,e.sal,e.deptno,d.dname from emp e,dept d where e.deptno=d.deptno order by deptno;--還可以使用order by 排序
非等值鏈接
---查詢員工姓名,工作,工資,工資等級
select * from salgrade
select * from emp,salgrade order by ename
select * from emp,salgrade where sal>losal and sal<hisal
select e.ename,e.job,e.sal,s.grade from emp e,salgrade s where e.sal>s.losal and e.sal<s.hisal;
自連接:使用頻率不是很高,因為自連接的條件要求不同信息共存在一張里,其實就兩張相同的表的等值鏈接。
--查詢員工姓名,工作,薪資,及上級領導姓名
select * from emp for update
create table temp as select * from emp
select * from emp e,temp t where e.mgr=t.empno
sql99
交叉鏈接
select * from emp cross join dept(笛卡爾積)
自然鏈接:natural join
(1)、 自然鏈接會自動使用多表中所有相同字段(不但值相同,名字也要相同)進行篩選
前提:多表一定要有同名同值的字段
注意:自然連接會自動使用所有的相同字段進行結果篩選
(2)、使用using關鍵字可以指定字段進行鏈接查詢,但是必須是同名字段 inner join
(3)、使用on關鍵字可以直接在其后書寫鏈接條件,沒有限制 inner join
查詢員工及員工所在的部門信息
select * from dept natural join emp
select * from dept d,emp e where d.deptno=e.deptno
問題1:假如在鏈接查詢的時候不想使用所有相同字段進行篩選怎么辦?
----使用using關鍵字
---查詢員工及員工所在的部門信息
select * from dept join emp using(deptno)
問題2:假如在鏈接查詢中沒有同名字段,但是有同值字段怎么篩選?
使用on關鍵字
查詢員工及員工所在的部門信息
select * from dept inner join emp on dept.deptno=emp.deptno
查詢部門及部門的城市信息
select * from dept inner join city on dept.loc=city.cid
外鏈接
(1)、左外鏈接 left outer join
(2)、右外鏈接 right outer join
(3)、全外鏈接 full outer join
左外鏈接
查詢沒有部門的員工信息及員工和部門信息
select * from emp e,dept d where d.deptno(+)=e.deptno--sql92
update dept set dname='教學部2' where deptno='70'
update dept set dname='教學部2',loc='上海' where deptno='70'
select * from dept
刪除數據:delete
1)刪除語句:delete 表名 where 條件
--刪除部門標號為70的數據
delete dept where deptno='70'---刪除指定數據
select * from dept
delete tdept---清空表數據
truncate table tdept---清空表數據建議使用truncate關鍵字,但是此關鍵字不能回滾數據
sql的聯合查詢(多表查詢)
--1、sql92標准
----笛卡爾積:一件事情的完成需要很多步驟,而不同的步驟有很多種方式,完成這件事情的所有方式稱之為笛卡爾積
select * from emp--14
select * from dept--7
select * from emp,dept order by ename--7*14=98
等值鏈接,鏈接條件。等值鏈接的時候字段的名字可以不相同,但是字段的值要相同。
--查詢員工姓名,工作,薪資,部門名稱
select * from emp,dept where emp.deptno=dept.deptno--使用等值鏈接進行結果篩選
select ename,job,sal,dname from emp,dept where emp.deptno=dept.deptno;--使用等值鏈接查詢指定字段數據
select ename,job,sal,emp.deptno,dname from emp,dept where emp.deptno=dept.deptno;--多表查詢的時候,查看相同字段的值,必須聲明所在表
select emp.ename,emp.job,emp.sal,emp.deptno,dept.dname from emp,dept where emp.deptno=dept.deptno;--在查詢指定字段值的時候,加上表名提高查詢效率
select e.ename,e.job,e.sal,e.deptno,d.dname from emp e,dept d where e.deptno=d.deptno;--多表查詢中使用別名進行表的區分
select e.ename,e.job,e.sal,e.deptno,d.dname from emp e,dept d where e.deptno=d.deptno order by deptno;--還可以使用order by 排序
非等值鏈接
---查詢員工姓名,工作,工資,工資等級
select * from salgrade
select * from emp,salgrade order by ename
select * from emp,salgrade where sal>losal and sal<hisal
select e.ename,e.job,e.sal,s.grade from emp e,salgrade s where e.sal>s.losal and e.sal<s.hisal;
自連接:使用頻率不是很高,因為自連接的條件要求不同信息共存在一張里,其實就兩張相同的表的等值鏈接。
--查詢員工姓名,工作,薪資,及上級領導姓名
select * from emp for update
create table temp as select * from emp
select * from emp e,temp t where e.mgr=t.empno
sql99
交叉鏈接
select * from emp cross join dept(笛卡爾積)
自然鏈接:natural join
(1)、 自然鏈接會自動使用多表中所有相同字段(不但值相同,名字也要相同)進行篩選
前提:多表一定要有同名同值的字段
注意:自然連接會自動使用所有的相同字段進行結果篩選
(2)、使用using關鍵字可以指定字段進行鏈接查詢,但是必須是同名字段 inner join
(3)、使用on關鍵字可以直接在其后書寫鏈接條件,沒有限制 inner join
查詢員工及員工所在的部門信息
select * from dept natural join emp
select * from dept d,emp e where d.deptno=e.deptno
問題1:假如在鏈接查詢的時候不想使用所有相同字段進行篩選怎么辦?
----使用using關鍵字
---查詢員工及員工所在的部門信息
select * from dept join emp using(deptno)
問題2:假如在鏈接查詢中沒有同名字段,但是有同值字段怎么篩選?
使用on關鍵字
查詢員工及員工所在的部門信息
select * from dept inner join emp on dept.deptno=emp.deptno
查詢部門及部門的城市信息
select * from dept inner join city on dept.loc=city.cid
外鏈接
(1)、左外鏈接 left outer join
(2)、右外鏈接 right outer join
(3)、全外鏈接 full outer join
左外鏈接
查詢沒有部門的員工信息及員工和部門信息
select * from emp e,dept d where d.deptno(+)=e.deptno--sql92
select * ---sql99
from emp e
left join dept
using(deptno)
--右外鏈接
select * from emp e,dept d where d.deptno=e.deptno(+)--sql92
from emp e
left join dept
using(deptno)
--右外鏈接
select * from emp e,dept d where d.deptno=e.deptno(+)--sql92
select * ---sql99
from emp e
right outer join dept d
on e.deptno=d.deptno
--全外鏈接
select *
from emp e
full outer join dept d
on e.deptno=d.deptno
自連接及三表聯合查詢
sql99三表聯合查詢
查詢員工姓名,工作,薪資,部門名稱,城市名稱
sql92實現:
select e.ename,e.job,e.sal,d.dname,c.cname
from emp e,dept d,city c
where e.deptno=d.deptno and d.loc=c.cid
sql99實現:
select e.ename,e.job,e.sal,d.dname,c.cname
from emp e
inner join dept d
on e.deptno=d.deptno
inner join city c
on d.loc=c.cid
from emp e
right outer join dept d
on e.deptno=d.deptno
--全外鏈接
select *
from emp e
full outer join dept d
on e.deptno=d.deptno
自連接及三表聯合查詢
sql99三表聯合查詢
查詢員工姓名,工作,薪資,部門名稱,城市名稱
sql92實現:
select e.ename,e.job,e.sal,d.dname,c.cname
from emp e,dept d,city c
where e.deptno=d.deptno and d.loc=c.cid
sql99實現:
select e.ename,e.job,e.sal,d.dname,c.cname
from emp e
inner join dept d
on e.deptno=d.deptno
inner join city c
on d.loc=c.cid
查詢工資高於2000的員工姓名,工作,薪資,部門名稱,城市名稱
sql92實現:
select e.ename,e.job,e.sal,d.dname,c.cname
from emp e,dept d,city c
where e.deptno=d.deptno and d.loc=c.cid and sal>2000
sql92實現:
select e.ename,e.job,e.sal,d.dname,c.cname
from emp e,dept d,city c
where e.deptno=d.deptno and d.loc=c.cid and sal>2000
sql99實現:
select e.ename,e.job,e.sal,d.dname,c.cname --查詢內容
from emp e --查詢表
inner join dept d --鏈接表
on e.deptno=d.deptno --鏈接條件
inner join city c --鏈接表
on d.loc=c.cid --鏈接條件
where e.sal>2000 --篩選條件
select e.ename,e.job,e.sal,d.dname,c.cname --查詢內容
from emp e --查詢表
inner join dept d --鏈接表
on e.deptno=d.deptno --鏈接條件
inner join city c --鏈接表
on d.loc=c.cid --鏈接條件
where e.sal>2000 --篩選條件
單行子查詢
子查詢(單行子查詢、多行子查詢)
單行子查詢
select 內容 from 表名 where 子查詢語句
1、什么時候使用單行子查詢?
--在不能直接獲取有效信息的時候,考慮使用子查詢
2、單行子查詢的注意事項?
---子查詢的結果必須只有一個值
---可以直接使用算術鏈接符
---子查詢出現在where中,一般出現在條件語句的右邊
問題:查詢所有比雇員“CLARK”工資高的員工信息
解讀1:查詢雇員CLARK的工資
select sal from emp where ename='CLARK'
解讀2:查詢工資大於2450的員工信息
select * from emp where sal>'2450'
使用子查詢
select * from emp where sal>(select sal from emp where ename='CLARK')
select * from emp where (select sal from emp where ename='CLARK')<sal
查詢工資高於平均工資的員工的名字和工資
select * from emp where sal>(select avg(sal) from emp) order by sal
查詢和soctt屬於同一部門且工資比他低的員工資料
select * from emp where deptno=(select deptno from emp where ename='SCOTT') and sal<(select sal from emp where ename='SCOTT')
查詢工資最高的員工資料
select * from emp where sal=(select max(sal) from emp)
查詢職務和scott相同,雇佣時間早的員工信息
select * from emp where job=(select job from emp where ename='SCOTT') and hiredate<(select hiredate from emp where ename='SCOTT')
查詢工資比scott高或者雇佣時間早的員工編號和名字
select empno,ename from emp where sal>(select sal from emp where ename='SCOTT') or hiredate<(select hiredate from emp where ename='SCOTT')
查詢工資高於任意一個CLERK的所有員工信息
select * from emp where sal>(select min(sal) from emp where job='CLERK') and job<>'CLERK'
select * from emp where sal>(select min(sal) from emp where job='CLERK') and job<>'CLERK'
多行子查詢
多行子查詢學習:其實就使用使用關鍵字:any all in
注意:子查詢返回多個值建議使用多行子查詢,返回的單個值使用單行子查詢
select * from emp where sal> any (select sal from emp where job='CLERK') and job<>'CLERK'
查詢工資高於所有SALESMAN的員工信息
select * from emp where sal>(select max(sal) from emp where job='SALESMAN')--單行子查詢的寫法
select * from emp where sal>all (select sal from emp where job='SALESMAN';
查詢部門20中同部門10的雇員工作一樣的雇員信息
select * from emp where deptno='20' and (job='MANAGER' or job='PRESIDENT' or job='CLERK')
select * from emp where deptno='20' and job in ('MANAGER', 'PRESIDENT' , 'CLERK')
select * from emp where deptno='20' and job in (select job from emp where deptno='10')
select * from emp where deptno='20' and job= any (select job from emp where deptno='10')
select job from emp where deptno='10'
用戶創建
創建用戶
當前用戶介紹:權限級別的分配
-------system:系統賬戶
-------sys:超級管理員
-------scott:普通用戶
1、 創建自定義用戶: create user 用戶名 identified by 密碼;
普通用戶不具備創建用戶的權限,需要使用system賬戶進行創建
直接創建好的用戶不能登錄,還需要使用system進行權限的分配(角色:一系列權限的集合)
create user zyp identified by 123456;
給創建的用戶賦予角色。 grant 角色名,角色名...to 用戶名;
grant connect to zyp;--賦予鏈接庫權限
grant resource to zyp;--賦予操作資源權限
grant dba to zyp;--賦予DBA角色
grant dba to zyp
刪除用戶權限
revoke dba from zyp
revoke connect from zyp
2、 刪除用戶
drop user zyp
普通用戶不具備創建用戶的權限,需要使用system賬戶進行創建
直接創建好的用戶不能登錄,還需要使用system進行權限的分配(角色:一系列權限的集合)
create user zyp identified by 123456;
給創建的用戶賦予角色。 grant 角色名,角色名...to 用戶名;
grant connect to zyp;--賦予鏈接庫權限
grant resource to zyp;--賦予操作資源權限
grant dba to zyp;--賦予DBA角色
grant dba to zyp
刪除用戶權限
revoke dba from zyp
revoke connect from zyp
2、 刪除用戶
drop user zyp
創建表和字段講解
--創建表學習
1、 創建表的基本語句:create table 表名(字段名 類型,字段名 類型,字段名 類型....)
創建學生表:學號,姓名,性別,年齡,qq號,郵箱。
create table student(
snum number(10),---指定學號的數字長度為10
sname varchar2(100),---指定姓名的存儲上限為100個字節
sex char(4),
age number,
qq number,
sal number(6,2),--指定工資的整數位為6和小數位為2
mail varchar2(50)
)
2、字段類型
number類型:數字類型,用來聲明存儲數字的字段。 number(指定數字的整數長度,指定數字的小數位長度)
varchar2類型:字符類型,用來聲明存儲字符的字段。會根據存儲的數據自動增長大小,varchar2(存儲上限)
char類型:字符類型,用來聲明存儲字符的字符。會開辟指定大小的內存來存儲數據。
區別1:char的存儲效率高於varchar2
區別2:char是開辟指定大小的內存空間,varchar2是根據數據大小來開辟空間的大小
date類型:存儲日期類型
修改表
修改表
在命令窗口查看表結構 desc 表名
添加新字段 alter table 表名 add 字段名 類型
alter table student add phone number(11)
修改字段類型 alter table 表名 modify 字段名 類型
alter table student modify sname varchar2(200)
刪除字段 alter table 表名 drop column 字段名
alter table student drop column phone
修改表名 rename 表名 to 新的表名
rename student to stu
rename stu to student
刪除表 drop table 表名
drop table student
約束學習
約束學習:
create table student(
snum number(10),--primary key,--使用主鍵約束 系統自動分配主鍵名
sna varchar2(100), --not null,
sex char(4), --default '男' check(sex='男' or sex='女') not null,
age number check(age>0 and age<120),
qq number, --unique,
sal number(6,2),
mail varchar2(50)
-- constraints pk_student_snum primary key(snum)
-- constraints ck_student_sna check(sna is not null)
-- constraints ck_student_sex check(sex ='男' or sex='女')
--constraints uk_student_qq unique(qq)
)
alter table student add constraints pk_student_snum primary key(snum);--在創建表后添加主鍵
alter table student drop constraints pk_student_snum--刪除主鍵
alter table student modify sna varchar2(100) not null;--添加非空約束
alter table student modify sna varchar2(100) null;--修改字段為空
alter table student modify sna varchar2(100) null;--修改字段為空
alter table student add constraints ck_student_sex check(sex='男' or sex='女')--添加檢查約束
alter table student drop constraints ck_student_sex --刪除檢查約束
alter table student drop constraints ck_student_sex --刪除檢查約束
alter table student add constraints uk_student_qq unique(qq)
alter table student drop constraints uk_student_qq
alter table student drop constraints uk_student_qq
drop table student
問題1:學號重復了,數據還可以插入成功
使用主鍵約束:學號是唯一標識一條數據的,所以必須唯一且不能為空
---(1)、在確定為主鍵的字段后添加 primary key關鍵字 系統自動分配主鍵名
---(2)、在創建表的后面使用:constraints pk_表名_字段名 primary key(字段名)
--(3)、在創建表后使用 alter table 表名 add constraints pk_表名_字段名 primary key(字段名);
--刪除主鍵:alter table 表名 drop constraints pk_表名_字段名
問題2:姓名可以為空。
使用非空約束
---(1)、創建表的時候在字段后面添加not null
---(2)、在創建表字段后使用 constraints ck_表名_字段名 check(字段名 is not null) 了解
--(3)、在創建表后使用alter table 表名 modify 字段名 類型 not null;
---(4)、修改字段可以存儲空值:alter table 表名 modify 字段名 類型 null;
問題3:性別不但可以為空,還可以為其他不知道的字符
使用檢查約束
---(1)、創建表的時候在字段后使用 default 值 check(條件),
---------但是會允許空值的出現,並且默認值只有在字段不聲明的情況下生效
---(2)、在創建表所有字段后使用:constraints ck_表名_字段名 check(條件)
---(3)、在創建表后使用:alter table 表名 add constraints ck_表名_字段名 check(條件)
問題4:年齡可以超過200
--使用檢查約束條件
問題5:qq號一致
使用唯一約束
--(1)、在字段后直接使用unique關鍵字
--(2)、在所有字段后使用:constraints uk_表名_字段名 unique(字段名)
--(3)、 alter table 表名 add constraints uk_表名_字段名 unique(字段名)
--刪除唯一約束:alter table 表名 drop constraints uk_表名_字段名
問題1:學號重復了,數據還可以插入成功
使用主鍵約束:學號是唯一標識一條數據的,所以必須唯一且不能為空
---(1)、在確定為主鍵的字段后添加 primary key關鍵字 系統自動分配主鍵名
---(2)、在創建表的后面使用:constraints pk_表名_字段名 primary key(字段名)
--(3)、在創建表后使用 alter table 表名 add constraints pk_表名_字段名 primary key(字段名);
--刪除主鍵:alter table 表名 drop constraints pk_表名_字段名
問題2:姓名可以為空。
使用非空約束
---(1)、創建表的時候在字段后面添加not null
---(2)、在創建表字段后使用 constraints ck_表名_字段名 check(字段名 is not null) 了解
--(3)、在創建表后使用alter table 表名 modify 字段名 類型 not null;
---(4)、修改字段可以存儲空值:alter table 表名 modify 字段名 類型 null;
問題3:性別不但可以為空,還可以為其他不知道的字符
使用檢查約束
---(1)、創建表的時候在字段后使用 default 值 check(條件),
---------但是會允許空值的出現,並且默認值只有在字段不聲明的情況下生效
---(2)、在創建表所有字段后使用:constraints ck_表名_字段名 check(條件)
---(3)、在創建表后使用:alter table 表名 add constraints ck_表名_字段名 check(條件)
問題4:年齡可以超過200
--使用檢查約束條件
問題5:qq號一致
使用唯一約束
--(1)、在字段后直接使用unique關鍵字
--(2)、在所有字段后使用:constraints uk_表名_字段名 unique(字段名)
--(3)、 alter table 表名 add constraints uk_表名_字段名 unique(字段名)
--刪除唯一約束:alter table 表名 drop constraints uk_表名_字段名
外鍵約束:
創建學生表
create table stu(
snum number(10) primary key,
sname varchar2(100) not null,
sex char(4) check(sex='男' or sex='女'),
cinfo number(10)-- references clazz(cid)--外鍵
-- constraints fk_stu_cinfo foreign key(cinfo) references clazz(cid)
)
alter table stu add constraints fk_stu_cinfo foreign key(cinfo) references clazz(cid) on delete cascade--添加外鍵
alter table stu add constraints fk_stu_cinfo foreign key(cinfo) references clazz(cid) on delete set null--添加外鍵
alter table stu drop constraints fk_stu_cinfo --刪除外鍵
drop table stu
創建班級表
create table clazz(
cid number(10) primary key,
cname varchar2(100) not null,
cdesc varchar2(500)
)
創建班級表數據
insert into clazz values(1,'軟件01班','最厲害的班級');
insert into clazz values(2,'軟件02班','掛科最多的班級');
insert into clazz values(3,'508班','大牛和最帥的班級');
select * from clazz
delete from clazz where cid=1
創建學生數據
insert into stu values(1002,'張三','男',1);
insert into stu values(1003,'李四','女',2);
insert into stu values(1004,'王五','男',3);
insert into stu values(1005,'趙四','男',4);
select * from stu
問題1:在插入學生信息的時候,出現了不存在的班級信息?
使用外鍵約束
--(1)、在字段后使用 references 參照表表名(參照字段)
--(2)、在所有字段后使用 constraints fk_表名_字段名 foreign key(字段名) references 參照表名(參照字段名)
--(3)、在創建表后使用alter table 表名 add constraints fk_表名_字段名 foreign key(字段名) references 參照表名(參照字段名)
--刪除外鍵 alter table 表名 drop constraints fk_表名_字段名
創建班級表數據
insert into clazz values(1,'軟件01班','最厲害的班級');
insert into clazz values(2,'軟件02班','掛科最多的班級');
insert into clazz values(3,'508班','大牛和最帥的班級');
select * from clazz
delete from clazz where cid=1
創建學生數據
insert into stu values(1002,'張三','男',1);
insert into stu values(1003,'李四','女',2);
insert into stu values(1004,'王五','男',3);
insert into stu values(1005,'趙四','男',4);
select * from stu
問題1:在插入學生信息的時候,出現了不存在的班級信息?
使用外鍵約束
--(1)、在字段后使用 references 參照表表名(參照字段)
--(2)、在所有字段后使用 constraints fk_表名_字段名 foreign key(字段名) references 參照表名(參照字段名)
--(3)、在創建表后使用alter table 表名 add constraints fk_表名_字段名 foreign key(字段名) references 參照表名(參照字段名)
--刪除外鍵 alter table 表名 drop constraints fk_表名_字段名
select table_name from all_all_tables where owner='SCOTT'
問題2:在刪除父表數據的時候需要先刪除子表數據?
解決方式1:先解除主外鍵關聯,然后刪除數據,再然后添加主外鍵關聯
解決方式2:在創建外鍵的時候使用級聯操作。
--在創建外鍵時 on delete cascade
--在創建外鍵時 on delete set null
怎么選取外鍵?
一般將主表的主鍵作為子表的外鍵
外鍵的值能為 not null? 不建議在外鍵后使用非空約束
解決方式1:先解除主外鍵關聯,然后刪除數據,再然后添加主外鍵關聯
解決方式2:在創建外鍵的時候使用級聯操作。
--在創建外鍵時 on delete cascade
--在創建外鍵時 on delete set null
怎么選取外鍵?
一般將主表的主鍵作為子表的外鍵
外鍵的值能為 not null? 不建議在外鍵后使用非空約束
序列
select cid from clazz order by cid
insert into clazz values(4,'402班級','老師最污的班');
insert into clazz values(10,'402班級','老師最污的班');
--問題1:如果數據量比較大,插入新的數據的時候id怎么選取才能避免重復?
使用序列
1、創建序列 create sequence 序列名
特點:默認沒有初始值的,nextval的值默認從1開始,默認每次自增+1
特點:可以使用 序列名.nextval坐為主鍵使用
create sequence cnum;
select cnum.currval from dual---獲取當前序列值
select cnum.nextval from dual---序列自增后返回當前值
truncate table clazz
select * from clazz
insert into clazz values(cnum.nextval,'402班級','老師最污的班');--將序列作為主鍵
問題2:如果當前表中已有很多數據,但是接下來需要使用序列進行主鍵自增?
創建序列時指定序列初始值及步長
create sequence cc
start with 90---設定序列初始值
increment by 5---設定步長
insert into clazz values(cc.nextval,'402班級','老師最污的班');
--問題1:如果數據量比較大,插入新的數據的時候id怎么選取才能避免重復?
使用序列
1、創建序列 create sequence 序列名
特點:默認沒有初始值的,nextval的值默認從1開始,默認每次自增+1
特點:可以使用 序列名.nextval坐為主鍵使用
create sequence cnum;
select cnum.currval from dual---獲取當前序列值
select cnum.nextval from dual---序列自增后返回當前值
truncate table clazz
select * from clazz
insert into clazz values(cnum.nextval,'402班級','老師最污的班');--將序列作為主鍵
問題2:如果當前表中已有很多數據,但是接下來需要使用序列進行主鍵自增?
創建序列時指定序列初始值及步長
create sequence cc
start with 90---設定序列初始值
increment by 5---設定步長
insert into clazz values(cc.nextval,'402班級','老師最污的班');
select max(cid) from clazz
--
select cc.nextval from dual
select cc.currval from dual
select * from clazz
刪除序列
drop sequence cc
----------------完整的序列格式-----------------------------------
create sequence aa--序列名
start with 20 --設置序列初始值
increment by 10 --設置步長
maxvalue 10000---設置最大值
cache 10 -----設置緩存
--
select cc.nextval from dual
select cc.currval from dual
select * from clazz
刪除序列
drop sequence cc
----------------完整的序列格式-----------------------------------
create sequence aa--序列名
start with 20 --設置序列初始值
increment by 10 --設置步長
maxvalue 10000---設置最大值
cache 10 -----設置緩存
索引
select * from emp order by sal
select * from emp where sal=3000
問題:當表中數據量比較大的時候,使用條件查詢就會出現效率的問題
使用索引進行解決
1、原理:類似於java中數組的折半查找,在數據庫中數據使用B樹形結構進行數據的存儲,
--這樣可以對外提供快速的數據查找方式。
2、創建索引 create index 表名_index_字段名 on 表名(字段名)
特點:顯示的創建,隱式的執行.在數據中會給主鍵默認創建索引。
create index emp_index_sal on emp(sal)--創建查詢索引
select * from emp where sal=3000
select * from emp order by sal
create index emp_index_sal_desc on emp(sal desc);--創建單排序索引
select * from emp order by sal,job
create index emp_index_sal_desc2 on emp(sal desc,job asc);--創建多條件排序索引
3、刪除索引 drop index 索引名
drop index emp_index_sal_desc