子查詢就相當於巢狀查詢,在一個select裏面巢狀一個甚至多個查詢,可以是多級巢狀。
分爲三種情況:
查詢所有學生的資訊並顯示老師的名字
select *,(
select name from teacher where id=teacher_id
) as teacher_name from student ;
注意:
select後面的子查詢只能表示一列內容,寫上表與表之間的關係。
使用子查詢 對成績劃分等級, 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;
注意:
因爲子查詢優先被執行,所以你想要呼叫子查詢裏面的內容,要給子查詢加別名,用別名點呼叫
在不知道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 形式
select *
from teacher tea
inner join student stu on tea.id = stu.teacher_id;
join 中常與on 連用,on 後面書寫表與表之間的聯繫列。
在使用 join 連線查詢 時,on和where條件的區別:
注意:
使用內連線的話,會以左邊表爲基準(student),生成新檢視的時候,先生成左邊表中的數據,然後再去匹配右邊表中是否有符合條件的,沒有的話,就不生成這一行
同時左表中有的,右表中沒有的數據,都不會生成
右表中有的,左表中沒有的也一樣不會生成,所以 左表和右表就算換了位置,數據行數不會變多
但是會丟失數據,不符合條件的數據不會查詢出來。
多表查詢是有左右表之分的,一般左表是主表,以左邊爲主
查詢結果,顯示小紅,但是不顯示孫老師
select * from student s
left join teacher t on s.teacher_id = t.id;
以左邊的表爲基準,左表中數據都有,右表中不符合條件的就沒有,就在指定列上用null代替
生成檢視的時候,也是先生成左表的數據
查詢結果,顯示孫老師,但是不顯示小紅
select * from student s
right join teacher t on s.teacher_id = t.id;
以右表爲基準,右表中數據都有,左表中不符合條件的就沒有,就在指定列上用null代替
但是檢視生成的時候,還是會先生成左表數據
當使用join時,能用inner(內連線)的儘量不用left/right(外連線) ,而right最少用,因爲他是原理和left差不多隻要把left的表置換一下位置就行。
外來鍵與表連線沒有任何關係。
外來鍵是爲了保證你不能隨便刪除/插入/修改數據,是數據完整性的一種約束機制 機製。
表連線是因爲一張表的欄位無法滿足業務需求(你想查的欄位來自於2張甚至多張表)
一個是爲了增刪改,一個是爲了查,它倆之間沒有聯繫。