1. SQL之模糊查詢
例如查詢姓名時(shí),不用輸入全名,僅僅輸入其中的一部分
語法: 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 |
- 若還想要對(duì)分組過后的結(jié)果進(jìn)行篩選,在group by 語句后面加上 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 |
-
order by 語句對(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條件語句!?。?
-- 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/