serversql數據庫的查詢操做

sql數據庫html

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]

外鏈接

外鏈接: 指錶鏈接時除了返回符合鏈接條件的數據外,同時返回不符合鏈接條件的數據git

  • 左外鏈接:
    • 是以左側表爲主,除返回符合鏈接條件的數據外,還返回左側表不符合鏈接條件的數據
  • 右外鏈接:
    • 是以右側表爲主,除返回符合鏈接條件的數據外,還返回右側表不符合鏈接條件的數據
  • 全外鏈接:github

    • 除返回符合鏈接條件的數據外,還同時返回全部不符合鏈接條件的數據
  • 語法:web

 

select  column_list
from    table_name1
[left|right|full]   [outer] join table_name2    #表之間的鏈接條件經過 xx join 實現
on  condition                                   #表之間的鏈接條件
[...n]

自鏈接

指對同一個表的鏈接,要執行一個內鏈接,必須使用不一樣的別名來區分sql

 

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語句沒法完成查詢要求canvas

這時候須要在select語句中內部嵌入另外的select語句,這條嵌入的select語句稱爲子查詢ruby

子查詢除了能夠應用到select語句中,也能夠應用到insert、update、delete語句中markdown

  • 單行子查詢
    • 只返回一行一列數據的子查詢稱爲單行子查詢
    • 外部查詢可以使用比較運算符: = 、> 、>= 、 < 、<= 、<> 操做符
  • 多行子查詢
    • 返回多行單列數據的子查詢稱爲多行子查詢
    • 外部查詢可以使用:in、not in 、any、all操做符
  • 關聯子查詢
    • 子查詢引用外部查詢中包含的一列或多列,查詢的執行依賴外部查詢
    • 針對每行外部查詢數據,都將執行一次子查詢
    • 外部查詢可以使用 exists、not exists 操做符

單行子查詢

單行子查詢不向外部的SQL語句返回結果,或者只返回一行app

單行子查詢可應用於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
    結果:返回兩表共有行
相關文章
相關標籤/搜索