MySQL:子查詢,常用函數,連線查詢

2020-08-08 14:08:29

子查詢

子查詢就相當於巢狀查詢,在一個select裏面巢狀一個甚至多個查詢,可以是多級巢狀。

分爲三種情況:

  • 子查詢在select後面from前面,表示一列
  • 子查詢在from後面where判斷條件前面,表示一個表
  • 子查詢在where判斷條件後,常與in或者=連用,常用在判斷篩選

select後面

查詢所有學生的資訊並顯示老師的名字
select *,(
        		select name from teacher where id=teacher_id   
    		) as teacher_name from student ;

注意
select後面的子查詢只能表示一列內容,寫上表與表之間的關係。

from後面

使用子查詢 對成績劃分等級, score<60 ,評級C 並且是差,score>=60 且 score<80 評級B並且是良,score>=80 評級是A並且是優
select *,
case rank
when 'A' then '優'
when 'B' then '良'
when 'C' then '差'
end rank_ch
from (
select *,
case 
when score < 60 then 'C' 
when score >=60 and score <80 then 'B' 
when score >=80 then 'A' 
end as rank 
from student
) a;

注意
因爲子查詢優先被執行,所以你想要呼叫子查詢裏面的內容,要給子查詢加別名,用別名點呼叫

where後面

 在不知道teacher_id 和 老師名字的對應關係的情況下,想查詢出張老師下面 下麪的所有學生資訊
select * from student where teacher_id in (
select id from teacher where name='張老師'
);

注意
此時的子查詢裏面的select裏面只能查一列,
如果select裏面只有一行的話,子查詢括號外面可以用=,如果是多行必須用in

常用函數

	select version() ;顯示當前MySQL軟體的版本
	select database();顯示當前所處數據庫是哪個
	select  char_length('中國');返回字元個數。
	select  length('中國');返回字元所佔位元組數,MySQL中,一個UTF8編碼的漢字佔3個位元組
	select  concat(  'a',  'b',  'c',  'd');返回  'abcd'。字串拼接函數
	select  concat_ws(  '=',  'a',  'b',  'c');返回  'a=b=c'。字串拼接函數,第一個是拼接間隔符
	select   upper('abcd');返回ABCD。將參數中所有小寫字母轉換爲大寫
	select  lower('ABCD');返回abcd。將參數中所有大寫字母轉換爲小寫
	select  substring(  '系統資訊類',  1,  3  );返回  系統信。第2個參數代表從1開始的第幾個字元,第3個參數代表擷取字元個數
	select  trim('  abc  ');返回 abc。用於刪去參數左右的所有空格
	select  curdate();返回當前日期
	select  curtime();返回當前時間
	select  now();返回當前日期時間
	select  unix_timestamp();返回當前日期時間對應的時間戳(單位秒)
	select  unix_timestamp('2018-05-24 20:00:00');返回參數指定的日期時間對應的時間戳(單位秒)
	select  from_unixtime(1527163397);返回參數指定時間戳(單位秒)對應的日期時間
	select  datediff(  '2018-05-23',  now()  );返回兩個參數對應日期相差的天數(用第一個參數減第二個參數)
	select  adddate( now(), -2 );返回指定天數前/後的日期時間(第一個參數是日期時間,第二個參數是天數,向後加是正數,向前減是負數)
	select year('2019-02-24');返回2019 獲得年份
	select month('2019-02-24')  返回2 獲得月份
	select day('2019-02-24')  返回 24 獲取日
	select  if(  <判斷條件>,  <條件爲真時的返回值>,  <條件爲假時的返回值>  );相當於Java中的三目運算子<判斷條件>  ?  <條件爲真的返回值>  :  <條件爲假的返回值>。
	如select  if(1=1,  2,  3);返回2。
	select  ifnull(<表達式或者欄位>,  <表達式或者欄位爲NULL時的返回值>);通常用於給有可能有NULL的情況下的提供預設值。
	select ifnull(null,'無名氏') ; null這裏可以寫列名 就會把該列值爲null的 以無名氏顯示
	select ifnull(name,'無名氏') from teacher ;

連線查詢

在用多表查詢時,可以用子查詢形式去查詢,也可以用連線查詢的方式去查,連線查詢時如果不用限制條件而是直接使用from然後逗號隔開兩個甚至多個表名,那麼會發生笛卡爾乘積,這是會很消耗記憶體的運算的,這裏我們可以用根據尋求選擇inner/left/right…join 形式

inner join

select *
from teacher tea
inner join student stu on tea.id = stu.teacher_id;

join 中常與on 連用,on 後面書寫表與表之間的聯繫列。

在使用 join 連線查詢 時,on和where條件的區別:

  1. on條件是在生成臨時表時使用的條件,需要和鏈接查詢一起使用。
  2. where條件是在臨時表生成好後,再對臨時表進行過濾的條件。這時已經沒有join的含義(必須返回左邊表的記錄)了,條件不爲真的就全部過濾掉。

注意

使用內連線的話,會以左邊表爲基準(student),生成新檢視的時候,先生成左邊表中的數據,然後再去匹配右邊表中是否有符合條件的,沒有的話,就不生成這一行
同時左表中有的,右表中沒有的數據,都不會生成
右表中有的,左表中沒有的也一樣不會生成,所以 左表和右表就算換了位置,數據行數不會變多
但是會丟失數據,不符合條件的數據不會查詢出來。
多表查詢是有左右表之分的,一般左表是主表,以左邊爲主

left join

	查詢結果,顯示小紅,但是不顯示孫老師
	select * from student s
    left join teacher t on s.teacher_id = t.id;

以左邊的表爲基準,左表中數據都有,右表中不符合條件的就沒有,就在指定列上用null代替
生成檢視的時候,也是先生成左表的數據

right join

	查詢結果,顯示孫老師,但是不顯示小紅
	select * from student s
    right join teacher t on s.teacher_id = t.id;

以右表爲基準,右表中數據都有,左表中不符合條件的就沒有,就在指定列上用null代替
但是檢視生成的時候,還是會先生成左表數據

注意:

當使用join時,能用inner(內連線)的儘量不用left/right(外連線) ,而right最少用,因爲他是原理和left差不多隻要把left的表置換一下位置就行。

外來鍵與表連線沒有任何關係
外來鍵是爲了保證你不能隨便刪除/插入/修改數據,是數據完整性的一種約束機制 機製。
表連線是因爲一張表的欄位無法滿足業務需求(你想查的欄位來自於2張甚至多張表)
一個是爲了增刪改,一個是爲了查,它倆之間沒有聯繫。