SQL 語句解析


查詢語句

1.基礎查詢:

SELECT * FROM

解析:此語句會將所有的字段查詢出來,SQL執行的順序:FROM(找到)=>SELECT *  (查詢所有字段*代表所有字段)

 

SELECT ID,NAME FROM

解析:此語句會將中所有的字段查詢出來,SQL執行的順序:FROM  (找到)=>SELECT  ID,NAME (查詢 ID和NAME字段)

 

 

2.帶條件的查詢

SELECT * FROMWHERE ID=1

 解析:此語句找到ID字段等於1的數據 

 

SELECT * FROMWHERE ID>1

解析:此語句找到表中ID字段大於1的數據

 

SELECT * FROMWHERE ID<1

解析:此語句找到表中ID字段小於1的數據

 

SELECT * FROMWHERE ID IN (1,2,3)

解析:此語句找到表中ID字段等於1或者2或者3的數據

 

SELECT * FROMWHERE ID NOT IN (1,2,3)

解析:此語句找到表中ID字段等於1或者2或者3的數據 

 

SELECT * FROMWHERE NAME LIKE  '%內容%'

解析:此語句找到表中NAME字段出現內容數據,這個%代表任意內容,放在前面代表前面可以出現或者不出現任意內容,比如:

  NAME LIKE  '%內容%',NAME中的數據是“這個內容是123”   他找到了內容就匹配了,

  如果是NAME LIKE  '內容%'   那就只能找內容開頭的比如:NAME中的數據是“內容是123”,他就匹配了,

  如果是NAME LIKE  '%內容'   那就只能找內容結尾的比如:NAME中的數據是“這個內容”,他就匹配了

 

SELECT * FROMWHERE ID  BETWEEN 1 AND 10

解析:此語句找到表中ID字段1--10的內容,BETWEEN 是范圍 1到10范圍的數據  一般用於數據取范圍

 

 

3.AND和OR

在我們查詢的過程中有時候不僅僅只有一個調整  那么上述的條件都可以通過AND或者OR組合起來,如:

SELECT * FROMWHERE NAME LIKE  '%內容%'  AND  ID  BETWEEN 1 AND 10 

解析:AND 是的意思  代表此查詢既要滿足NAME LIKE  '%內容%'  又要滿足ID  BETWEEN 1 AND 10  

 

SELECT * FROMWHERE NAME LIKE  '%內容%' OR ID  BETWEEN 1 AND 10 

解析:OR是的意思  代表此查詢只要滿足NAME LIKE  '%內容%'  或者ID  BETWEEN 1 AND 10 其中一個就行

 

SELECT * FROMWHERE (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 * FROMorder by id asc
SELECT * FROMorder by id

解析:上述2個語法效果一致,order by 和asc 是排序的關鍵字,代表着以ID字段正序(數字從小到大,a-z)排序

PS:第二條是簡寫語法,默認排序是正序所以可以不寫asc

 

SELECT * FROMorder by id asc

解析:order by 和desc 是排序的關鍵字,代表着以ID字段倒序(數字從大到小,z-a)排序

 

5.2多字段排序

SELECT * FROMorder by id asc,Name desc
SELECT * FROMorder 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 查詢字段 fromwhere  id in(select max(id) fromgroup by 去重分組字段)

解析:首先以要去重的字段分組 取得組內最大的id  然后根據id 查詢的對應的信息就好,此方法需要有唯一字段,如:主鍵Id

 

沒有唯一鍵group by 去重

select identity(int,1,1) as id,* into newtable(臨時表) fromselect * 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.單表修改

updateset 字段1='123',字段2='helloword'
updateset 字段1='123',字段2='helloword' where id=1 
updateset 字段1=字段2,字段2='helloword' where id=1

 解析:updateset 是此語法的關鍵字,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

解析:updateset   from 是此語法的關鍵字,多表語法在於多個表逗號分隔( 表1 a,表2 b)通過得到where a.id=b.id 條件進行關聯表1和表2,where 條件后面也可以帶其他條件

PS:語法有好幾種每個數據庫支持的語法不一樣請大家具體嘗試

 

刪除

1.刪除表中數據

delete tabledelete tablewhere id=1

解析:delete table是此語法的關鍵詞,代表刪除中的數據,where和查詢的where一致用於篩選數據,特別要注意:此語法一般要帶上where條件,如果不帶將刪除整個表的數據

 

2.刪除表

drop table

解析:drop table 是關鍵詞,此語法將從數據庫中刪除整個表的結構,也就是說無法在寫入或者更新刪除數據了,此表將不在數據庫中存在了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM