當(dāng)前位置:首頁(yè) > IT技術(shù) > 數(shù)據(jù)庫(kù) > 正文

SQL之查詢
2022-04-25 23:13:54

1. SQL之模糊查詢

例如查詢姓名時(shí),不用輸入全名,僅僅輸入其中的一部分

語(yǔ)法: select 列名 from 表名 where 列名 like 匹配串

其中 匹配串用英文的單引號(hào)括起來

四種匹配模式:

(1)% 匹配任意字符 (2) _ 匹配單個(gè)字符 (3)[ ] 在中括號(hào)中有多個(gè)字符,匹配其中的一個(gè)字符 (4)[ ^] 不在括號(hào)所有字符之內(nèi)的單個(gè)字符

---首先,往表Dept(DeptId,DeptName)中插入數(shù)據(jù),其中DeptId為主鍵和標(biāo)識(shí)列,所以插入時(shí),標(biāo)識(shí)列不用手動(dòng)輸入
insert into Dept(DeptName)
values('部門1'),('部門2'),('部門3'),('部門4')--采用批量插入
---此時(shí)表格如圖:

--1.% 匹配任意字符  
------三種形式:  '%ab%' 包含于   '%ab'以某字符/字符串結(jié)尾   'ab%'以某字符/字符串開頭
select* from Dept where DeptName like '%1%'
select* from Dept where DeptName like '部門%'

--2.  _  匹配單個(gè)字符 :常用來限制表達(dá)式的字符長(zhǎng)度
select* from Dept where DeptName like '部_4%'

--3. [ ] 在中括號(hào)中有多個(gè)字符,匹配其中的一個(gè)字符 字符可以全部寫出,也可以寫一個(gè)起點(diǎn)和終點(diǎn),中間用橫線連接,標(biāo)識(shí)范圍
select* from Dept where DeptName like '部門[123]%'
select* from Dept where DeptName like '部門[1-3]%'

--4. [^] 不在括號(hào)所有字符之內(nèi)的單個(gè)字符
select* from Dept where DeptName like '部門[^123]%'
select* from Dept where DeptName like '部門[^1-3]%'

2. SQL之范圍查詢

 
---1. 通過 where子句的條件指定查詢的范圍
---(1)比較運(yùn)算符
select * from Dept 
where DeptId<=5  
---(2)in  和 not in
select * from Dept 
where DeptId in (2,3,4)  

select * from Dept 
where DeptId not in (2,3,4)  

---后面跟子查詢
select * from Dept 
where DeptId in (select DeptId from Dept where DeptId<5 ) 

---(3)between and 等價(jià)于 >= and <=
select * from Dept 
where DeptId  between 2 and 5 

---2. 查詢前面多少條,或者 百分比
----(1)查詢表的前面10行
select top 10 * from Dept
----(2) 查詢表的前面占比整張表總行數(shù)的50%行
select top 50 percent * from Dept

3. 聚合函數(shù)

(1)對(duì)一組值執(zhí)行計(jì)算并返回單一的值

---------已知在Dept表中共有8條記錄(行)
select count(*) from Dept---結(jié)果8

select count(1) from Dept---結(jié)果8
--因?yàn)楸碇袥]有列名為1的,所以count(1) 是偽造列,我們統(tǒng)計(jì)總記錄數(shù)用count(1) ,比count(*)效率高

結(jié)果如圖:

無列名
1 8

(2)5種聚合函數(shù)

count(列名) 統(tǒng)計(jì)一列中值的個(gè)數(shù)

sum(列名) 統(tǒng)計(jì)一列中值的和

avg(列名) 統(tǒng)計(jì)一列中值的平均

max(列名) 統(tǒng)計(jì)一列中值的 最大值

min(列名) 統(tǒng)計(jì)一列中值的 最小值

---------已知在Dept表中共有8條記錄(行)

select sum(DeptId) from Dept ---36

select avg(DeptId) from Dept ---4

select max(DeptId) from Dept ---8

select min(DeptId) from Dept ---1

4. 分組查詢

group by 與聚合函數(shù)聯(lián)合使用,根據(jù)一個(gè)列或者多個(gè)列對(duì)查詢結(jié)果集合進(jìn)行分組。

select ....where....group by ...order by...

---往表Stu(UserId,UserName,UserPwd,CreateTime,DeptId,Age)中插入數(shù)據(jù),批量插入數(shù)據(jù);其中UserId是主鍵和標(biāo)識(shí)列,無需手動(dòng)插入
insert into Stu
values('dio','abc',getdate(),1,11),
('xiao','abc',getdate(),1,11),
('xili','ab',getdate(),2,15),
('liao','ac',getdate(),3,18),
('aa','abcd',getdate(),2,19),
('bb','abcde',getdate(),4,22),
('cc','abcef',getdate(),1,13)

---查詢每一個(gè)部門下有多少個(gè)用戶???
select DeptId ,count(1)用戶數(shù)            ----此處可用count(UserId)
from  Stu
group by DeptId

結(jié)果如下圖:

DeptId 用戶數(shù)
1 1 3
2 2 2
3 3 1
4 4 1
  1. 若還想要對(duì)分組過后的結(jié)果進(jìn)行篩選,在group by 語(yǔ)句后面加上 having
select DeptId ,count(UserId)用戶數(shù)
from  Stu
where Age<=18
group by DeptId
having DeptId>1
DeptId 用戶數(shù)
1 2 1
2 3 1
  1. order by 語(yǔ)句對(duì)結(jié)果按照某一列或多列進(jìn)行排序顯示

    select DeptId ,count(UserId)用戶數(shù)
    from  Stu
    group by DeptId
    having DeptId>1
    ------order by Age desc  此處報(bào)錯(cuò):ORDER BY 子句中的列 "Stu.Age" 無效,因?yàn)樵摿袥]有包含在聚合函數(shù)或 GROUP BY 子句中。
    order by DeptId desc
    

    強(qiáng)調(diào):select后面出現(xiàn)的列名,必須包含在group by之后,或者包含在聚合函數(shù)之中

DeptId 用戶數(shù)
1 4 1
2 3 1
3 2 2

5. 連接查詢

連接查詢就是根據(jù)兩個(gè)或多個(gè)表之間的關(guān)系,從這些表中查詢數(shù)據(jù)。實(shí)現(xiàn)多表查詢;

分為內(nèi)連接,外連接,全連接,交叉連接

1. 內(nèi)連接 :

(1)使用比較運(yùn)算符 = > >= < <= <> 進(jìn)行表間的比較,查詢與條件相匹配的數(shù)據(jù)。

(2)多數(shù)使用等值連接 = 其余的稱作非等值連接

(3)結(jié)果:相匹配的數(shù)據(jù)查詢出來,若沒有匹配上,就沒有結(jié)果

(4) 顯式寫法: inner join 表名 on 連接條件 ; 隱式寫法:from 表名1,表名2 where ...

表Stu:

UserId UserName UserPwd CreateTime DeptId Age
1 dio abc 2022-04-19 15:22:47.100 1 11
2 xiao abc 2022-04-19 15:22:47.100 1 11
3 xili ab 2022-04-19 15:22:47.100 2 15
4 liao ac 2022-04-19 15:22:47.100 3 18
5 aa abcd 2022-04-19 15:22:47.100 2 19
6 bb abcde 2022-04-19 15:22:47.100 4 22
7 cc abcef 2022-04-19 15:22:47.100 1 13

表Dept :

DeptId DeptName
1 部門1
2 部門2
3 部門3
4 部門4
5 部門1
6 部門2
7 部門3
8 部門4
--表  Stu(UserId,UserName,UserPwd,CreateTime,DeptId,Age) 和 表 Dept(DeptId,DeptName)建立聯(lián)系
select UserId,UserName,u.DeptId,DeptName
from Stu u ---給表起別名
inner join Dept d on u.DeptId = d.DeptId----等值連接
where Age>18
---先建立連接,再寫where條件語(yǔ)句?。。?
-- DeptId在兩個(gè)表中都有,DeptId是Stu的外鍵,是表Dept是主鍵,實(shí)現(xiàn)了關(guān)聯(lián)
--我們也可以在上述的on后面人為地建立關(guān)聯(lián)條件

---上述寫法稱為顯式寫法,還可以隱式寫法:(比較多地使用?。。。。。?select UserId,UserName,u.DeptId,DeptName
from Stu u , Dept d  
where u.DeptId = d.DeptId and Age>18

結(jié)果如下表:

UserId UserName DeptId DeptName
1 5 aa 2 部門2
2 6 bb 4 部門4

2. 外連接

(1)分類:左外連接(左連接),右外連接(右連接),全外連接(全連接)

(1)左連接 : 左表 left join 右表 on 關(guān)聯(lián)條件

返回左表的所有行,右表有的列若沒有匹配上,右表這個(gè)列值在左表的顯示出null

select *
from Dept d  left join Stu u on  u.DeptId = d.DeptId
--左表是Dept 右表Stu 
DeptId DeptName UserId UserName UserPwd CreateTime DeptId Age
1 1 部門1 1 dio abc 2022-04-19 15:22:47.100 1 11
2 1 部門1 2 xiao abc 2022-04-19 15:22:47.100 1 11
3 1 部門1 3 xili ab 2022-04-19 15:22:47.100 2 15
4 2 部門2 4 liao ac 2022-04-19 15:22:47.100 3 18
5 2 部門2 5 aa abcd 2022-04-19 15:22:47.100 2 19
6 3 部門3 6 bb abcde 2022-04-19 15:22:47.100 4 22
7 4 部門4 7 cc abcef 2022-04-19 15:22:47.100 1 13
8 5 部門5 NILL NILL NILL NILL NILL NILL
9 6 部門6 NILL NILL NILL NILL NILL NILL
10 7 部門7 NILL NILL NILL NILL NILL NILL
11 8 部門8 NILL NILL NILL NILL NILL NILL

(2)右連接 : 左表 right join 右表 on 關(guān)聯(lián)條件

返回右表的所有行,左表有的列若沒有匹配上,左表這個(gè)列值在右表的顯示出null

select *
from Dept d  right join Stu u on  u.DeptId = d.DeptId
--左表是Dept 右表Stu  返回右表中的所有行
DeptId DeptName UserId UserName UserPwd CreateTime DeptId Age
1 1 部門1 1 dio abc 2022-04-19 15:22:47.100 1 11
2 1 部門1 2 xiao abc 2022-04-19 15:22:47.100 1 11
3 1 部門1 3 xili ab 2022-04-19 15:22:47.100 2 15
4 2 部門2 4 liao ac 2022-04-19 15:22:47.100 3 18
5 2 部門2 5 aa abcd 2022-04-19 15:22:47.100 2 19
6 3 部門3 6 bb abcde 2022-04-19 15:22:47.100 4 22
7 4 部門4 7 cc abcef 2022-04-19 15:22:47.100 1 13

(3) 全連接 full join

返回左表和右表中的所有行,當(dāng)某一行在另一個(gè)表中沒有匹配,則另一個(gè)表中的列寫null

select *
from Stu u 
full join Dept d on  u.DeptId = d.DeptId

3. 交叉連接 cross join

也稱笛卡爾積 ,若不帶where 子句時(shí),返回被連接的行數(shù)是兩個(gè)表的行數(shù)之積, 就是兩個(gè)表的笛卡爾積

select *
from Stu u 
cross join Dept d  ---返回7*8=56 行

若帶where 子句時(shí),就等價(jià)于內(nèi)連接

select *
from Stu u /
cross join Dept d    
where u.DeptId = d.DeptId
DeptId DeptName UserId UserName UserPwd CreateTime DeptId Age
1 1 部門1 1 dio abc 2022-04-19 15:22:47.100 1 11
2 1 部門1 2 xiao abc 2022-04-19 15:22:47.100 1 11
3 1 部門1 3 xili ab 2022-04-19 15:22:47.100 2 15
4 2 部門2 4 liao ac 2022-04-19 15:22:47.100 3 18
5 2 部門2 5 aa abcd 2022-04-19 15:22:47.100 2 19
6 3 部門3 6 bb abcde 2022-04-19 15:22:47.100 4 22
7 4 部門4 7 cc abcef 2022-04-19 15:22:47.100 1 13

本文摘自 :https://www.cnblogs.com/

開通會(huì)員,享受整站包年服務(wù)立即開通 >