查詢陳述句
1.基礎查詢:
SELECT * FROM 表
決議:此陳述句會將表中所有的欄位查詢出來,SQL執行的順序:FROM 表 (找到表)=>SELECT * (查詢所有欄位*代表所有欄位)
SELECT ID,NAME FROM 表
決議:此陳述句會將表中所有的欄位查詢出來,SQL執行的順序:FROM 表 (找到表)=>SELECT ID,NAME (查詢 ID和NAME欄位)
2.帶條件的查詢
SELECT * FROM 表 WHERE ID=1
決議:此陳述句找到表中ID欄位等于1的資料
SELECT * FROM 表 WHERE ID>1
決議:此陳述句找到表中ID欄位大于1的資料
SELECT * FROM 表 WHERE ID<1
決議:此陳述句找到表中ID欄位小于1的資料
SELECT * FROM 表 WHERE ID IN (1,2,3)
決議:此陳述句找到表中ID欄位等于1或者2或者3的資料
SELECT * FROM 表 WHERE ID NOT IN (1,2,3)
決議:此陳述句找到表中ID欄位不等于1或者2或者3的資料
SELECT * FROM 表 WHERE NAME LIKE '%內容%'
決議:此陳述句找到表中NAME欄位出現內容資料,這個%代表任意內容,放在前面代表前面可以出現或者不出現任意內容,比如:
NAME LIKE '%內容%',NAME中的資料是“這個內容是123” 他找到了內容就匹配了,
如果是NAME LIKE '內容%' 那就只能找內容開頭的比如:NAME中的資料是“內容是123”,他就匹配了,
如果是NAME LIKE '%內容' 那就只能找內容結尾的比如:NAME中的資料是“這個內容”,他就匹配了
SELECT * FROM 表 WHERE ID BETWEEN 1 AND 10
決議:此陳述句找到表中ID欄位1--10的內容,BETWEEN 是范圍 1到10范圍的資料 一般用于資料取范圍
3.AND和OR
在我們查詢的程序中有時候不僅僅只有一個調整 那么上述的條件都可以通過AND或者OR組合起來,如:
SELECT * FROM 表 WHERE NAME LIKE '%內容%' AND ID BETWEEN 1 AND 10
決議:AND 是且的意思 代表此查詢既要滿足NAME LIKE '%內容%' 又要滿足ID BETWEEN 1 AND 10
SELECT * FROM 表 WHERE NAME LIKE '%內容%' OR ID BETWEEN 1 AND 10
決議:OR是或的意思 代表此查詢只要滿足NAME LIKE '%內容%' 或者ID BETWEEN 1 AND 10 其中一個就行
SELECT * FROM 表 WHERE (NAME LIKE '%內容%' OR NAME LIKE '%123%' ) AND ID BETWEEN 1 AND 10
決議:AND 和OR也可以搭配使用,此陳述句代表除了滿足了ID BETWEEN 1 AND 10 還要滿足 NAME LIKE '%內容%' 和 NAME LIKE '%123%' 其中一個
4.多表聯查
多表聯查分為三類:內連接(inner join )、左連接(left join)、右連接(right join )
4.1內連接(inner join 、join )
SELECT * FROM 表A as a inner join 表B as b ON a.連接欄位=b.連接欄位
決議:inner join 和ON 是內連接的關鍵詞,內連接是取得表A和表B能通過連接欄位關聯起來的資料,
連接欄位可以有多個,用and或者or 關聯 如:ON a.連接欄位1=b.連接欄位1 and a.連接欄位2=b.連接欄位2 or a.連接欄位3=b.連接欄位3
PS: as 是給表A,表B取個別名的方便ON關鍵詞后面指定那張表的連接欄位,也可以不用as,直接表A.連接欄位,如:
SELECT * FROM 表A inner join 表B ON 表A.連接欄位=表B.連接欄位
示例:學生表student
課程表Course
select* from Student s inner join Course c ON s.Id=c.StudentId

通過student表的id和Course表的StudentId 取到了能關聯的張三李四王五的記錄、趙六關聯不上所以沒有記錄
4.2左連接(left join)
SELECT * FROM 表A as a left join 表B as b ON a.連接欄位=b.連接欄位
決議:left join和ON 是左連接的關鍵詞,左連接是以左邊表A為主表,表B為子表,先查詢出表A中的資料,然后關聯表B如果關聯上了就將資料查詢出來,如果表B中沒有關聯上資料則對應欄位為null,
示例:學生表student

課程表Course

select* from Student s left join Course c ON s.Id=c.StudentId

通過student表的id和Course表的StudentId 取到了能關聯的張三李四王五的記錄、趙六關聯不上所以Course表對應的記錄為null
4.3右連接(right join)
SELECT * FROM 表A as a right join 表B as b ON a.連接欄位=b.連接欄位
決議:right join和ON 是右連接的關鍵詞,右連接是以右邊表B為主表,表A為子表,先查詢出表B中的資料,然后關聯表A如果關聯上了就將資料查詢出來,如果表A中沒有關聯上資料則對應欄位為null,
示例:學生表student

課程表Course

select* from Student s right join Course c ON s.Id=c.StudentId

這里之所以資料和內連接(inner join )資料一致,是因為右邊表B所有的資料都能關聯到左邊,如果將student表放置在右邊(Course c right join Student s)則和左連接一致
4.4三個表以上連接查詢
SELECT * FROM 表A as a right join 表B as b ON a.連接欄位=b.連接欄位 INNER JOIN 表C as c ON c.連接欄位=a.連接欄位
4.5連接查詢如果待條件陳述句:
SELECT * FROM 表A as a right join 表B as b ON a.連接欄位=b.連接欄位 WHERE a.條件欄位=條件
5.排序(order by)
5.1單欄位排序
SELECT * FROM 表 order by id asc SELECT * FROM 表 order by id
決議:上述2個語法效果一致,order by 和asc 是排序的關鍵字,代表著以ID欄位正序(數字從小到大,a-z)排序
PS:第二條是簡寫語法,默認排序是正序所以可以不寫asc
SELECT * FROM 表 order by id asc
決議:order by 和desc 是排序的關鍵字,代表著以ID欄位倒序(數字從大到小,z-a)排序
5.2多欄位排序
SELECT * FROM 表 order by id asc,Name desc SELECT * FROM 表 order by id,Name desc
決議:上述2個語法效果一致,首先我們以ID 進行正序排列,如果出現ID 相同的情況如:三個ID 為1,那么這三條資料將以Name 倒敘排列:
示例:課程表Course

select * from Course order by StudentId desc,CourseName

先以studentId 欄位倒敘排列,如果studentId相同,則以CourseName欄位正序排列
6.分組(group by)
group_by的意思是根據by對資料按照對應欄位進行分組,所謂的分組就是將一個“資料集”劃分成若干個“小區域”,然后針對若干個“小區域”進行資料處理,
select 查詢欄位 from 表名 group by 分組欄位
決議:簡單點來說就是以 “分組欄位” 為依據進行聚合操作,比如:很多門課和很多個學生,你如果想取得每個學生上了多少門客,那么我就以每個學生分組 ,來求課程數
示例:課程表Course

select StudentId,Count(*)CourseNumber from Course GROUP BY StudentId

決議:首先我以學生ID 進行的分組,那么所有學生ID相同的資料都是一個組,然后我在組內進行取行數【count(*)】,然后的給個別名CourseNumber
這里要注意使用使用了group by 就不能用*,只能使用group by的欄位,因為select的陳述句執行的先后順序是先group by 再select ,這個時候其實資料已經分組了,所以你的“查詢欄位”里面只能出現【分組欄位】和【分組聚合函式】
select 欄位 from 表名 where 過濾條件 group by 欄位 having 過濾條件
決議:having是分組之后再進行條件篩選的關鍵詞,和where不同的是 where條件在分組之前執行和having條件在分組之后執行
7.常用聚合函式介紹
7.1求和 sum()
select sum(求和欄位) from 表名 where 條件 select 分組欄位,sum(求和欄位) from 表名 where 條件 group by 分組欄位
7.2平均值 avg()
select avg(求平均值欄位) from 表名 where 條件 select 分組欄位,avg(求平均值欄位) from 表名 where 條件 group by 分組欄位
7.3個數統計 count()
select count( ) from 表名 --包括空值 select count(*) from 表名 --不包括空值 select 分組欄位,count(*) from 表名 where 條件 group by 分組欄位
7.4最大值 max()
select max(取最大值欄位) from 表名 select 分組欄位,max(取最大值欄位) from 表名 where 條件 group by 分組欄位
7.5最小值min()
select min(取最小值欄位) from 表名 select 分組欄位,min(取最小值欄位) from 表名 where 條件 group by 分組欄位
8.查詢去重
distinct去重
select DISTINCT * from 表
決議:distinct去重很簡單只用在查詢欄位前面加入distinct關鍵字就行,但此做法有一個問題,就是必須要所有的查詢欄位一模一樣才能去重,如果其中有一個欄位不重復就無法去重
group by 去重
select 查詢欄位 from 表 where id in(select max(id) from 表 group by 去重分組欄位)
決議:首先以要去重的欄位分組 取得組內最大的id 然后根據id 查詢的對應的資訊就好,此方法需要有唯一欄位,如:主鍵Id
沒有唯一鍵group by 去重
select identity(int,1,1) as id,* into newtable(臨時表) from 表 select * from newtable where id in (select max(id) from newtable group by 去重分組欄位)
drop table newtable
決議:先將表into 寫入到臨時表newtable并加入自增Id,后續操作和group by 去重一致,然后洗掉(drop table)臨時表
9.高級開窗函式row_number() over()和row_number() over(partition by)【mysql5.7及以下不支持,mysql8.0及sqlserver支持】
平常一般我們主鍵Id來進行排序,但是如果洗掉了資料,那么會導致Id不連貫,如果我們進行分頁取資料的話那或導致資料出現少的情況,通過使用row_number() over()你將得到一個連續的列
select row_number() over(order by a.id)rowid,* from Student a inner join Course b ON a.Id=b.StudentId
決議:row_number() over(order by a.id) 這個是此語法的關鍵詞,以表a(Student)的id正序構建以個新的連續唯一(每條自增+1)的欄位,別名為rowid
select row_number() over(partition by b.StudentId order by b.id)rowid,* from Student a inner join Course b ON a.Id=b.StudentId
決議:與上面不同不同的是此陳述句加入了partition by 這代表組內排序,以b.StudentId分組,如果studentId 相同則 以b.id 正序排序【連續唯一(每條自增+1)】,如果組內只有一條則就是1
10.WITH AS 子查詢部分【mysql5.7及以下不支持,mysql8.0及sqlserver支持】
子查詢部分的好處是部分查詢,不如有三個表連接在一條陳述句種出現多次
單個子查詢部分
with a as (select * from Student a inner join Course b ON a.Id=b.StudentId )select * from a
決議:這樣在此陳述句種每次查詢a都是查詢了student和course表的聯查集合
多個查詢部分語法
with a as (select * from Student), b as (select * from Course) select * from a inner join b on a.Id=b.StudentId
決議:這個多個查詢部分語法的寫法,原理和單個查詢部分一致
11.UNION 和UNION ALL 資料連接查詢
UNION 和UNION ALL 都表示將2個資料集拼接(說白了就是將后面查詢的結果拼接到前面查詢結果的尾部),但union是去掉重復的和distinct一樣union all 是不去重的,
PS:2個查詢結果集的欄位名稱和每個欄位的型別要保持一致 不要一個int型別一個varchar型別
select `Id`,`Name` from Student union select `Id`,CourseName `Name` from Course select `Id`,`Name` from Student union all select `Id`,CourseName `Name` from Course
新增
1.單條引數新增
insert into 表(欄位1,欄位2)value (欄位1值,'欄位2值')
決議:insert into 和 value 是此新增語法的關鍵字 然后欄位和值一一對應
注意字串型別欄位的值使用單引號括起來
2.單條引數新增
insert into 表(欄位1,欄位2)values (欄位1值,'欄位2值'), (欄位1值,'欄位2值'), (欄位1值,'欄位2值')
決議:insert into 和 values 是此新增語法的關鍵字 與單個新增不一樣的是values 多了個復數s 代表能寫入多個值
3.查表新增
insert into 表a(欄位1,欄位2)select 欄位1,欄位2 表b where id=1
決議:此語法會將select 陳述句查詢的結果寫入到表b對應的欄位中,要注意此陳述句的欄位順序和查詢結果欄位順序需要保持一致并且型別要保持一致,where和查詢的where一致用于篩選資料
修改
1.單表修改
update 表 set 欄位1='123',欄位2='helloword' update 表 set 欄位1='123',欄位2='helloword' where id=1 update 表 set 欄位1=欄位2,欄位2='helloword' where id=1
決議:update和set 是此語法的關鍵字,where和查詢的where一致用于篩選資料,多個欄位更新用逗號(,)隔開,也可以將另一欄位的值更新到此欄位直接寫欄位名就行,
2.多表修改
update 表1 set 欄位1=b.欄位2,b.欄位2=a.欄位2 from 表1 a,表2 b where a.id=b.id and a.id=1 update 表1 set 欄位1=(select 欄位1對應欄位 from 表2 b where 表1.id=b.id ) where a.id=1
決議:update和set from 是此語法的關鍵字,多表語法在于多個表逗號分隔( 表1 a,表2 b)通過得到where a.id=b.id 條件進行關聯表1和表2,where 條件后面也可以帶其他條件
PS:語法有好幾種每個資料庫支持的語法不一樣請大家具體嘗試
洗掉
1.洗掉表中資料
delete table 表 delete table 表 where id=1
決議:delete table是此語法的關鍵詞,代表洗掉表中的資料,where和查詢的where一致用于篩選資料,特別要注意:此語法一般要帶上where條件,如果不帶將洗掉整個表的資料
2.洗掉表
drop table 表
決議:drop table 是關鍵詞,此語法將從資料庫中洗掉整個表的結構,也就是說無法在寫入或者更新洗掉資料了,此表將不在資料庫中存在了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/286095.html
標籤:SQL Server
