serversql資料庫的查詢操作
阿新 • • 發佈:2018-12-15
sql資料庫
sql資料庫的執行順序
5. select 檢視結果集中的哪個列,或列的計算結果
1. from 需要從哪個資料表檢索資料
2. where 過濾表中資料的條件
3. group by 如何將上面過濾的資料分組
4. having 對已分組的資料進行過濾的條件
6. order by 按照不同排序方式返回資料
下述查詢中所用的資料表
- 部門表dept資料
did | dname | dmgr |
---|---|---|
1 | 銷售部 | 1001 |
2 | 研發部 | 1005 |
3 | 服務部 | 1008 |
- 員工表emp資料
id | name | gender | age | salary | dno | mgrid |
---|---|---|---|---|---|---|
1001 | 趙偉 | 男 | 38 | 6000 | 1 | |
1002 | 李萍蘭 | 女 | 26 | 3000 | 1 | 1001 |
1003 | 秦曉 | 女 | 30 | 4000 | 1 | 1001 |
1004 | 趙曉輝 | 男 | 32 | 4200 | 1001 | |
1005 | 張嵐 | 男 | 40 | 8000 | 2 | |
1006 | 李秋平 | 女 | 24 | 4000 | 2 | 1002 |
1007 | 顧世剛 | 男 | 30 | 6000 | 2 | 1002 |
1008 | 段大宇 | 男 | 36 | 5000 | 3 |
sql聯表
- 內連線
- 指返回資料完全滿足連線條件
- 外連線
- 指返回資料除了包含完全滿足連線條件的資料,還包括不滿足連線條件的資料
- 左外連線、右外連線、全連線
- 自連線
- 指連線的表是自身
- 交叉連線
- 表連線時沒有連線條件,返回結果是兩個表資料的笛卡爾積
內連線
- 連線語法一
select column_list
from table_name1,table_name2 #表之間通過逗號隔開
where codition #表之間的連線條件
- 連線語法二
select column_list
from table_name1
[inner] join table_name2 #表之間的連線通過 join實現
on condition; #表之間的連線條件
[...n]
外連線
外連線: 指表連線時除了返回符合連線條件的資料外,同時返回不符合連線條件的資料
- 左外連線:
- 是以左側表為主,除返回符合連線條件的資料外,還返回左側表不符合連線條件的資料
- 右外連線:
- 是以右側表為主,除返回符合連線條件的資料外,還返回右側表不符合連線條件的資料
-
全外連線:
- 除返回符合連線條件的資料外,還同時返回所有不符合連線條件的資料
-
語法:
select column_list
from table_name1
[left|right|full] [outer] join table_name2 #表之間的連線條件通過 xx join 實現
on condition #表之間的連線條件
[...n]
自連線
指對同一個表的連線,要執行一個內連線,必須使用不同的別名來區分
select e1.name 員工姓名,e2.name 上級主管
from emp e1,emp e2
where e1.mgrid=e2.id
交叉連線
在多表查詢時,如果沒有連線條件,則一個表的所有行將會和另一個表的所有行都會進行連線,連線的結果稱為笛卡爾積
- 連線語法一:
select column_list
from table_name1,table_name2[...n]
- 連線語法二:
select column_list
from table_name1
cross join table_name2[...n]
子查詢
在前面使用的查詢語句都是隻包含一條select語句,而有些情況下依靠單條select語句無法完成查詢要求
這時候需要在select語句中內部嵌入另外的select語句,這條嵌入的select語句稱為子查詢
子查詢除了可以應用到select語句中,也可以應用到insert、update、delete語句中
- 單行子查詢
- 只返回一行一列資料的子查詢稱為單行子查詢
- 外部查詢可使用比較運算子: = 、> 、>= 、 < 、<= 、<> 操作符
- 多行子查詢
- 返回多行單列資料的子查詢稱為多行子查詢
- 外部查詢可使用:in、not in 、any、all操作符
- 關聯子查詢
- 子查詢引用外部查詢中包含的一列或多列,查詢的執行依賴外部查詢
- 針對每行外部查詢資料,都將執行一次子查詢
- 外部查詢可使用 exists、not exists 操作符
單行子查詢
單行子查詢不向外部的SQL語句返回結果,或者只返回一行
單行子查詢可應用於select語句的where字句、having字句中
- 在where字句中使用
- 子查詢作為條件判斷的一方,位於小括號中(...)
- 查詢年齡最小的員工資訊
select * from emp
where age=(select min(age) from emp)
結果:查詢到一條
- 查詢大於最小年齡的員工資訊
select * from emp
where age>(select min(age) from emp)
結果:查詢到多條資訊
- 在having字句中使用
- 查詢部門員工平均年齡小於所有員工平均年齡的部門和該部門員工平均年齡
select dno 部門編號,avg(age) 平均年齡 from emp
group by dno
having avg(age)<(select avg(age) from emp)
多行子查詢
多行子查詢通常返回一條或多條記錄,多行子查詢結果用於where語句時
判斷可以使用in、any、all操作符
-查詢負責管理其他員工的員工資訊 --in
select * from emp
where id in (select mgrid from emp where mgrid is not null)
- 查詢年齡大於所有部門最大年齡的員工資訊 --all
select * from emp
where age > all(select max(age) from emp group by dno)
- 查詢年齡大於任意部門最大年齡的員工資訊 --any
select * from emp
where age > any(select max(age) from emp group by dno)
關聯子查詢
子查詢中引用父查詢資訊,稱為關聯子查詢
關聯子查詢對於外部查詢中的每一行都會執行一次
-查詢每個部門年齡最小員工
select * from emp o
where age=(select min(age) from emp i where i.dno=o.dno)
-查詢負責管理其他員工的員工資訊
select * from emp e1
where exists (select 1 from emp e2 where e2.mgrid=e1.id)
-查詢不負責管理其他員工的員工資訊
select * from emp e1
where not exists (select 1 from emp e2 where e2.mgrid=e1.id)
高階查詢
操作符 | 說明 |
---|---|
union all | 並運算。返回各個查詢檢索出的所有行,包括重複行 |
union | 並運算。返回各個查詢檢索出的所有行,不包括重複行 |
intersect | 交運算。返回兩個查詢檢索的共有行 |
except | 差運算。從左查詢中返回右查詢沒有找到的所有的所有非重複值 |
union all 操作
union all 操作只合並結果集,不去除重複資料
- 查詢所有產品
select * from prod1
union all
select * from prod2
結果可能含有重複行
union操作
union操作合併結果集後去除重複資料
-查詢所有產品
select * from prod1
union
select * from prod2
結果:無重複行
intersect操作
intersect操作返回結果集間的交集,也就是共有部分
-查詢兩個產品表的共有產品
select * from prod1
intersect
select * from prod3
結果:返回兩表共有行