查詢語句
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 是關鍵詞,此語法將從數據庫中刪除整個表的結構,也就是說無法在寫入或者更新刪除數據了,此表將不在數據庫中存在了。