尚矽谷Mysql基礎(一)筆記----黎曼的思想分享的視訊
阿新 • • 發佈:2020-10-22
注意:這裡面很有可能一些圖片的結果與sql語句不一致,是因為上傳時,出現了錯誤,並不是sql語句本身的錯誤!!!
mysql基礎
1.將myemployees資料庫匯入Linux上的mysql
點選右鍵---》執行SQL指令碼--->選擇電腦中儲存myemployees資料的地方
---加入成功
2.使用資料庫的好處:
1.實現資料的持久化
2.使用完整的管理系統統一管理資料,易於查詢
3.DB,DBMS,SQL
DB:資料庫(database),用於儲存一組有組織的資料容器
DBMS:資料庫管理系統(DataBase Management System),又稱資料庫軟體,用於管理DB中的資料
SQL:結構化查詢語言(Structure Query Language),用於和DBMS進行通訊
4.資料庫的特點
1.將資料放入表中,再將表放入庫中 (資料---->表---->庫)
2.一個數據庫可以有多個表(表名具有唯一性)
3.表具有一些特性,定義了資料在表中怎樣儲存,類似於Java中的"類"
4.表包含多列,每一列也稱為欄位,每一列代表一個屬性,類似於Java中的"屬性"
5.資料在表中按每行進行儲存,類似於Java中的“物件”
5.DBMS分為兩種:
1.基於共享檔案系統
2.基於客戶端--伺服器的DBMS
6.在服務端進行啟動
1.[ [email protected]~】# msyql -u root -p
entrning password: root---因為密碼設定為"root"
2.使用某一個數據庫----如:myemployees
mysql > use myemployees;
3.查看錶
mysql > show tables;
4.檢視版本號
mysql > select mysql();
7.mysql的語言規範
1.不區分大小寫,但建議關鍵字大寫,表名和列名小寫
2.每條命令以分號結束
3.每條命令可以根據需要進行縮排
4.註釋:
1.單行: #或者--
2.多行:/*....*/
8.DQL,DML,DDL,TCL
1.DQL:資料查詢語言
2.DML:資料操作語言
3.DDL:資料定義語言
4.TCL:事務控制語言
9.DQL
進階1:基礎查詢
語法:select 查詢列表 from表名;----類似於Java中System.out.pritnln("dfjfkj");
查詢列表:欄位,常量值,表示式,函式
查詢出來的是一個虛擬表
案例:
1.查詢表中的某一個欄位---如:employees表中的last_name;
mysql > select last_name from employees;
2.查看錶中的多個欄位---如:employees中的first_name和last_name
mysql> select first_name,last_name from employees;
3.查看錶中的所有欄位
mysql > select * from employees;
4.檢視常量值----注意:字元型和日期型需要使用雙引號引起來,數值型不需要
mysql > select 100;
5.查看錶達式----注意:不支援自增和自減
mysql > 100*100;
6.檢視函式---注意:1.必須有select 2.必須有返回值
mysql > select concat(first_name,last_name) from employees;---concat:將兩個欄位進行拼接
1.幫查詢欄位起別名
1.使用as
mysql > selsect last_name as姓,first_name as名from employees;----as後面跟著別名
2.使用空格
mysql > select last_name姓,first_name名 from employees;-----使用空格代替as,然後後面跟著別名
注意:
起別名儘量不要起中間有空格的名字,比如out put
如果起了,解決方法:out put上面打雙引號 "out put"
2.去重---distinct
案例:查詢員工表中涉及到的所有部門編號
mysql >SELECT DISTINCT(department_id) FROM employees;
mysql > select distinct dartment_id from employees;----也可以這樣寫(建議這樣寫)
注意:
1.只能返回它的目標欄位,而無法返回其他欄位
案例:
mysql > select distinct department_id, department_name from deprtments;----可以去重
mysql > select distinct department_id,distinct department_name from departments;-----報錯
2.必須放在要查詢欄位的開頭
3.所以一般用來查詢不重複記錄的條數-----count(distinct department_id)
3."+"
1.java中的"+"
a.當左右為數值型----加法
b.當左右有一邊為字串-----連線
2.mysql中的“+”----只做運算子
1.兩邊為數值型----加法
2.一邊為字串
a.如果字串可以轉換為數值型---加法
b.如果字串不能轉換為數值型---將其設為0,再做加法
3.左右兩邊有一邊為Null,則不管另一邊為什麼,返回的都是null
案例:
mysql >SELECT "dfsjf" + "eir";
4.concat----字串的連結
mysql > select concat(first_name,last_name) from employees;
5.ifnull(表示式1,表示式2)----到表示式1為Null時,使用表示式2代替
案例:----employees表中沒有獎學金的用“沒有獎學金”代替
mysql >SELECT DISTINCT(IFNULL(commission_pct,"沒有獎學金")) AS 獎學金 FROM employees;
6.isnull(表示式)----判斷表示式是否為空,如果是則返回1,否則返回0
案例:
mysql > select last_name,commission_pct ,isnull(commission_pct)獎金情況 from employees;
進階2:條件查詢
語法:select查詢列表 from表名 where篩選條件
執行順序:from---> where---->select
分類:
1.按條件表示式查詢----“< >不等於(<>),等於(=),>=,<=”
案例:查詢工資 > 12000的員工姓名
mysql >SELECT CONCAT(first_name,last_name) 姓名 FROM employees WHERE salary > 12000;
2.按邏輯表示式篩選---用於諒解表示式-----"&&(and),||(or),!(not)"
案例:查詢工資在10000到20000至今的員工名,工資以及獎金
mysql > select last_name姓名,salary工資,commission_pct獎金 from employees where salary > 10000 and salary < 20000;
-----有14行數字,沒有全部列舉出
3.模糊查詢
1.like:一般和萬用字元“%和_”一起使用,%表示任意多個字元,_表示任意一個單字元
2.between and
3.in
4.is null或is not null
like:
案例:查詢員工名中包含字元a的員工資訊
mysql >select * from employees where concat(first_name,last_name) like "%a%";------從這裡可以看出,函式可以使用在where的後面
案例:查詢員工名中第二個字元為_的員工資訊
mysql > select * from employees where concat(first_name,last_name) like "_\_%";-----當查詢的是_,需要進行轉義"或者使用下面:
mysql > select * from employees where concat(first_name,last_name) like "_a_%" escape 'a';-----這裡的a表示轉義字元,這裡的a可以是b,c,d,.....任意字元
between and:
案例:查詢員工編號在100到120之間的員工資訊
mysql > select * from employees where employee_id between 100 and 120;
1.使用between and可以提高語言的簡潔度
2.包括臨界值
3.兩個臨界值不能調換順序
in:
案例:查詢員工工種編號IT_PROG,AD_VP,AD_PRES中的一個員工名和工種編號
mysql > select last_name,job_id from employees where job_id in('IT_PROG','AD_VP','AD_PRES');
1.使用in提高語句的簡潔讀
2.in中的列表中的值必須一致或者相容
is null或is not null:
案例:查詢沒有獎學金的員工名和獎金
mysql > select last_name, commission_pct from employees where commission_pct is null;
注意:
完全等於<=>
1.is null:僅僅可以判斷null值,可讀性高,建議使用
2.<=>:即可以判斷null的值,又可以判斷普通的值,可讀性低
案例:
mysql > select last_name,commission_pct from employees where commission_pct <=> null;
mysql > select last_name,salary from employees where salary <=> 12000;
進階3:排序查詢
1.語法:
select查詢列表from表名 【where篩選條件】order by [asc(升序,預設),desc(降序)]
2.執行順序:from ---->where-----> select----->order by
案例:按年薪的高低顯示員工的資訊和年薪
mysql >SELECT *,salary * 12 *(1 + IFNULL(commission_pct,0)) 年薪 FROM employees ORDER BY 年薪 DESC;
----別名也可以用在order by中,條件語句中不可以使用別名
案例:按姓名的長度顯示員工的姓名和工資
mysql > select length(concat(first_name,last_name))姓名,salary as工資 from employees order by姓名 asc;
3.總結:
1.order by字句匯中可以支援單個欄位,多個欄位,表示式,函式,別名
2.orderby字句一般放置在查詢語句的最後,limit字句除外
案例:
1.查詢員工的姓名和部門編號和年薪,按年薪降序,按姓名升序
mysql > select concat(first_name,last_name)姓名,salary * 12 * (1 + ifnull(commission_pct,0)) as年薪,department_id部門編號 from employees order by年薪 asc,姓名 desc;
2.選擇工資不在8000到12000的員工的姓名和工資,按工資降序
mysql > select concat(first_name,last_name)姓名,salary工資 from employees where salary between 8000and12000 order by salary desc;
3.查詢郵箱中包含e的員工資訊,並選擇郵箱的位元組降序,再按部門編號升序
mysql > select * from employees where email like '%e%' order by length(email) desc,department_id asc;
進階4:常函式----類似於Java中的方法,將一組邏輯語句封裝到方法體中,對外暴露方法名
1.好處:隱藏實現細節 ,提高程式碼的重用性
2.語法:select函式(引數列表) [from表名]
3.分類:
1.單行字元:
1.字元函式
1.length----計算字元的位元組長度
案例:員工表中員工姓名的長度
msql >selectconcat(first_name,last_name) as姓名,length(concat(first_name,last_name))名字的長度 from employees;
----一個字元佔一個長度
案例:
mysql > select length("張三丰hahahhaha");
----一個漢字佔三個位元組
2.concat---拼接,上面案例
3.upper,lower----字元全轉大寫,全轉小寫
案例:將員工表中的姓名全傳大寫,全轉小寫
mysql > select upper(concat(first_name,last_name)) 姓名 from employees;
mysql > select lower(concat(first_name,last_name))姓名 from employees;
4.substr,substring----擷取,mysql中索引都是從1開始
案例:
mysql > select substr("李莫愁愛上了陸展元",7);
mysql > select substr("李莫愁愛上了陸展元",1,3);
-----包含1,3指的是長度
mysql > select substring("李莫愁愛上了陸展元",7);
mysql > select substring("李莫愁愛上了陸展元",1,3);
5.instr---返回子字串第一次出現索引,如果沒有則返回0
案例:
mysql > select instr("楊不悔愛上了殷六俠","殷六俠");
6.trim--去掉首尾的空格或者指定字元
案例:
msyql > select trim(" 趙翠三 adjfkfjk ");
案例:
msyql > select trim('a' from "aaaaaaaaaaaaaaaa張aaaaaaaaaaaaaaaa翠aaaaaaaaa山aaaaaaaaaaa") as output ;
7.lpad---使用指定的字元左填充指定長度
案例:
mysql > select lpad("殷素素“,10,"*");----字串小於10個字元時,左邊使用“*"來填充
mysql > select lpad('殷素素',2,'*');-------當指定長度小於原有的字串長度時,擷取原有的字串長度
8.rpad-----用指定的字元右填充指定長度
案例:
msyql >SELECT RPAD('殷素素',10,'你是一個笨蛋淡淡的');
9.replace----使用指定字元來替代字串中的字串或者字串本身
案例:
mysql > select replace('張無忌愛上了周芷若','周芷若','趙敏');
-----使用趙敏來替代周芷若
2.數學函式
1.round---四捨五入
案例:
mysql > select round(1.65);
mysql > select round(-1.65);
mysql > select round(1.45678,3);-----3表示保留幾位小數
2.ceil----向上取整(返回>=該引數的最小整數)
案例:
mysql > select ceil(1.002);
mysql > select ceil(-1.02);
3.floor---向下取整(返回<=該數的最大整數)
案例:
mysql > select floor(-9.99);
4.truncate---擷取----不四捨五入
案例:
mysql >select truncate(1.68888,3);----3表示小數點保留3位,不四捨五入
mysql > select truncate(666666666,3);
---對整數不起作用
5.mod(a,b)---取餘----(a-a/b*b)---a為負數,則結果為負數,a為正數,則結果為正數
案例:
mysql > select mod(-10,-3);------(-10-(-10/-3)*(-3)) = -10 - 3*(-3) = -1
3.日期函式
1.now()---表示返回當前日期,時間
案例:
mysql > select now();
2.curdate----顯示當前的日期,不包括時間
案例:
mysql > select curdate();
3.curtime---顯示時間,不包括日期
案例:
mysql > select curtime();
4.獲得指定部分---year(),month(),monthname(),day(),hour(),minute(),second()
案例:
mysql > select year(hiredate)入職年份 from employees;
案例:
mysql > select month(now());
mysql > select day("2020-9-24");
5.str_to_date----將字元通過指定的格式轉換成日期
案例:查詢入職日期為1992-4-2的員工的姓名,月薪
mysql > select concat(first_name,last_name)姓名,salary月薪 from employees where hiredate = str_to_date('4-3-1992','%c-%d-%Y');
6.date_formate----將日期轉換為字串
案例:查詢有獎金的員工的姓名和入職日期(xx月/xx日/xx年
mysql > select concat(first_name,last_name)姓名,date_format(hiredate,"%m/%d/%y") as入職日期 from employees where commission_pct is not null;
注意:
%Y---四位數的年份
%y---2位數的年份
%m--月份(01,02,....12)
%c---月份(1,2,3,4....12)
%d---日
%H---小時(24小時制)
%h---小時(12小時制)
%i----分鐘
%s----秒
7.日期函式-----datediff(表示式1,表示式2)----返回表示式1-表示式2的值
案例:查詢員工表中最大的入職時間和最小的入職時間的相差天數
mysql > select max(hiredate)最晚的入職時間, min(hiredate)最早的入職時間,datediff(max(hiredate),min(hiredate))相差天數 from employees;
4.其他函式
version(),database()---檢視當前的庫,user()------檢視當前的使用者
5.流程控制函式
1.if(表示式1,表示式2,表示式3)函式-------相當於Java中的三元運算子,表示式1為真,則返回表示式2,否則返回表示式3
案例:
mysql > select concat(first_name,last_name)姓名,commission_pct獎金, if(commission_pct,"有獎金","沒獎金")獎金情況 from employees;
----commission_pct為null時,表示為假,返回表示式3
2.case函式
1.語法:-----相當於Java中的switch case的效果
case要判斷的欄位或表示式
when常量1 then要顯示的值1或語句1;
when常量2 then要顯示的值2或語句2;
.......
else要顯示的值n或語句n;
end
注意:
1.上面黃色的部分:
1.如果case放置在select的後面使用,相當於一個表示式,那麼黃色的部分就不能是一個表示式了,只能是一個值,並且沒有分號";"
2.如果case放置在儲存過程就可以將其當做語句使用,可以不搭配select使用,這是黃色部分放的是語句,需要加上分號";"
案例:
部門號 = 30,顯示工資為1.1倍
部門號 = 40,顯示工資為1.2倍
部門號 = 50,顯示工資為1.3倍
其他 原工資
顯示這些員工的姓名,原工資,上漲的工資
mysql > select concat(first_name,last_name)姓名,department_id部門號,salary原工資,
case department_id
when 30 then salary * 1.1
when 40 then salary * 1.2
when 50 then salary * 1.3
else salary
end
as新工資
from employees;
2. 語法:-----類似於Java中的多重if
case
when條件1 then要顯示的值1或語句1;
when條件2then要顯示的值2或語句2;
.........
else要顯示的值n或語句n;
end
案例:
部門員工的工作情況:
如果工資 > 20000,顯示A
如果工資 > 15000顯示B
如果工資 > 10000顯示C
其他顯示D
mysql > select concat(first_name,last_name)姓名,salary工資,
case
when salary > 20000 then 'A'
when salary between 15000 and 20000 then 'B'
when salary between 10000 and 15000 then 'C'
else 'D'
end
as工資級別
from employees;
2.分組函式
1.功能:用作統計使用,又稱為聚合函式或統計函式或組函式
2.分類:
sum--求和,avg---平均,max---最大值,min---最小值,count---計算個數
3.簡單使用:
mysql > select sum(salary)總工資,avg(salary)平均工資,max(salary)最大的工資,min(salary)最小的工資,count(salary)員工個數 from employees;
4.引數型別支援哪些型別
1.sum,avg只支援數值型別
2.max,min,count支援任意型別
5.是否忽略null
sum,avg,max,min,count都忽略null,count計算的是非空個數
6.可以和distinct搭配使用起到去重計算的效果
mysql > select sum(distinct salary) from employees;
----與上面的總工資相比,達到了去重的效果
7.count函式的詳細介紹
1. mysql > select count(commisssion_pct) from employees;
2.mysql > select count(*) from employees;
3.mysql > select count(1) from employees;
總結:
1).1中的結果與2,3的結果不一樣,因為1中會忽略null
2).count(*)中的“*”表示任意欄位,在每一行中,如果有一個欄位不為Null,那就代表這一行不為null,要計1行
3).count(1)這相當於在表中增加了一個虛擬欄位,其值都為1,所以其結果與count(salary)一樣(這是因為salary中沒有null)
4)效率:在mysam儲存引擎中,count(*)效率最高,在innodb儲存引擎中,count(*)和count(10的效率差不多,比count(欄位)要高一些
8.和分組函式一同查詢的欄位有限制-----要求是group by後的欄位
mysql > select avg(salary),employee_id from employees;-------avg(salary)一行,employee_id為107行
進階5:分組
1.group by---將表中的所有資料按照要求分成若干個組
2.語法:
select查詢列表------【分組函式,列(出現在grop by的後面)】
from表名
[where篩選條件]
group by分組的列名
[order by子句]
注意:查詢列表特殊,要求是分組函式和group by後出現的欄位
案例:
1.查詢每個工種的最高工資
mysql > select max(salary)最高工資,job_id as工種編號 from employees group by job_id;
2.查詢每個位置上的部門個數
mysql > select count(*)部門個數,loacation_id as位置號 from departments group by location_id;
3.新增篩選條件----分組前,使用where
案例:查詢郵箱中包含a字元的每個部門的平均工資
msyql > select avg(salary)平均工資,department_id 部門編號 from employees where email like '%a%' group by department_id;
查詢有獎金的每個領導手下員工的最高工資
mysql > select max(salary)最高工資,manager_id領導編號 from employees where commission_pct is not null group by manager_id;
4.新增複雜的篩選條件---分組後,使用having
案例:查詢那個部門的員工個數>2
mysql > select department_id部門編號,count(*)員工個數 from employees group by department_id having count(*) > 2;
查詢每個工種有獎金的員工的最高工資>12000的工種編號和最高工資
mysql > select job_id工種編號,max(salary)最高工資 from employees where commission_pct is not null group by job_id having max(salary) > 12000;
查詢領導編號>102的每個領導手下的最低工資>5000的領導編號以及最低工資
mysql > select manager_id領導編號,min(salary)最低工資 from employees where manager_id > 102 group by manager_id having min(salary) > 5000;
比較:
分組查詢中的篩選條件分為兩種情況:
資料來源 位置 關鍵字
分組前篩選 原始表 group by字句之前 where
分組後篩選 分組後的結果集 group by字句之後 having
1.分組函式做條件肯定是放在having子句中
2.分組前篩選的,就優先考慮使用分組前篩選
3.where子句作用於表和檢視,having子句作用於組
4.where在分組和聚集計算之前選取輸入行(因此,它控制哪些行進入聚集計算),而having在分組和聚集之後選取分組的行。因此,where子句不能包含聚集函式;因為試圖用聚集函式判斷那些行輸入給聚集運算時沒有意義的。想反,having子句總是包含聚集函式(嚴格來說,可以不使用聚集的having子句,但這樣做是沒有意義的,同樣的條件可以更有效的用於where階段)
5.having一般跟在group by之後,執行記錄組選擇的一部分來工作的,where則是執行所有資料來工作的,再者having可以用來聚合函式
5.按表示式或函式分組
案例:按員工姓名的長度分組,查詢每一組的員工個數,篩選員工個數>5的有哪些
mysql > select count(*)員工個數,length(concat(first_name,last_name)) 姓名長度 from employees group by length(concat(first_name,last_name)) having count(*) > 5;
6.按多個欄位分組----逗號隔開
案例:查詢每個部門每個工種的員工的平均工資
mysql > select avg(salary)平均工資,department_id部門編號,job_id工種編號 from employees group by department_id,job_id ;
7.新增排序
案例:查詢每個部門每個工種的員工的平均工資,並且按平均工資的高低顯示
msyql > select avg(salary)平均工資,department_id部門編號,job_id工種編號 from employees group by department_id,job_id order by平均工資 desc;
總結:
1.group by子句支援單個欄位分組,多個欄位分組(多個欄位之間使用逗號隔開,沒有順序要求),表示式或函式
2.也可以新增排序(排序放在整個分組查詢的最後)
案例:查詢各job_id的員工工資的最大值,最小值,平均值,總和,並按Job_id升序
mysql > select job_id工種編號 max(salary)最高工資,min(salary)最小工資,avg(salary) as平均工資,sum(salary)總和 from employeesgroup by job_id order by job_id asc;
案例:查詢各個管理者手下員工的最低工資,其中最低工資不能低於6000,沒有管理者的員工不計算在內
mysql > select min(salary)最低工資,manager_id領導編號 from employees where manager_id is not null group by manager_id having最低工資 > 6000;
案例:查詢所有部門的編號,員工數量,工資平均值,並按平均工資降序
mysql > select count(*)員工個數,avg(salary)平均工資,department_id部門編號 from employees group by department_id order by平均工資 desc;
進階6:連線查詢
1.含義:又稱為多表查詢,當查詢的欄位不在同一個表時,就會用到連線查詢
2.笛卡爾積現象:表1有m行,表2有n行,結果為m*n行
3.發生原因:沒有有效的連線條件
4.如何避免:新增有效的連線條件
5.分類:
1.sql92標準----只支援內連線
2.sql99標準----支援內連線,外連線,互動連線
6.按功能分為:
內連線:等值連線,非等值連線,自連線
外連線:左外連線,右外連線,全外連線(mysql不支援)
互動連線
sql92標準
1.等值連線
案例:查詢女神和對應的男神名
mysql > use girls;
mysql >SELECT beauty.name 女神名,boyName 男神名 FROM beauty ,boys WHERE beauty.`boyfriend_id` = boys.id;
-----使用的是表名.欄位
2.為表起別名----與欄位起別名一樣,兩種方法,好處為:提高語句的簡潔度,區分重名欄位
案例:查詢員工名,工種名,工種號
mysql > use myemployees;
mysql >SELECT CONCAT(first_name,last_name) 員工姓名,e.job_id 工種號,job_title 工種名 FROM employees e,jobs j WHERE e.`job_id` = j.`job_id`;
---兩個好處都體現了,在該案例中
注意:
1.欄位e.job_id這裡如果表已經起了別名,就不能再使用beauty.boy_id,因為在執行一條sql語句時,總是從from表名開始的
2.在where中不能使用別名,在group by ,order by中可以使用別名
3.兩個表之間的順序是任意的
4.可以篩選
案例:查詢有獎金的員工名,部門名
mysql > select concat(first_name,last_name)員工名,department_name部門名 from employees as e,departments as d where e.department_id = d.department_id andcommission_pct is not null;
案例:查詢城市名中第二個字元為o的部門名和城市名
msyql > select department_name部門名,city城市名 from departments d,locations l where d.location_id = l.location_id and city like '_o%';
5.可以加分組
案例:查詢每個城市的部門個數
mysql > select count(d.department_id)部門個數,city城市名 from locations l,departments d where d.location_id = l.location_id group by city;
---count(department_id)可以使用count(*)來代替
案例:查詢有獎金的某個部門的部門名和部門的領導編號和該部門的最低工資
mysql > select min(salary)最低工資,department_name部門名,manager_id領導編號 from employees e,departments d
where d.department_id = e.department_idand commission_pct is not null group d.department_id;
6.可以加排序
案例:查詢每個工種的工種名和員工個數,並且按員工個數降序
mysql > select j.job_title as工種名, count(*)員工個數 from employees as e,jobs j where e.job_id = j.job_id group by j.job_id order by count(*) desc;
7.多表連結
案例:查詢員工名,部門名,所在的城市
mysql > select concat(first_name,last_name) as員工名,department_name部門名,city城市名 from employees e,
departments d,locations l where e.department_id = d.department_id and d.location_id = l.location_id;
等值連線總結:
1.多表等值連線的結果為多表的交集部分
2.n表連線,需要n-1個連線條件
3.多表沒有順序要求
4.一般需要為各個表起別名
5.可以搭配前面介紹的所有子句使用,比如排序,分組,篩選
2.非等值連線-----除了不為“=”,都為非等值
案例:查詢員工的工資和工資級別
mysql > select salary工資,grade_level工資級別 from employees,job_grades where salary between lowest_sal and highest_sal;
3.自連線
案例:查詢員工名和上級名稱
mysql > select concat(e1.first_name,e1.last_name)員工名,concat(e2.first_name,e2.last_name)上級名 from employees e1,employees e2 where e1.manager_id = e2.employee_id;
sql 99:
1.內連線:等值,非等值,自連線
2.外連線:左外連線,右外連線,完全連線(mysql不支援)
3.互動連線
1.等值連線-----與sql 92標準一樣
語法:select查詢列表from表1 [as]別名,表2 [as]別名 where表1的別名.key =表2的別名.key [and篩選條件] [group by分組條件] [ having分組後的篩選條件] [ order by排序實現]
特點:
1.一般為表起別名
2.多表的順序可以調換
3.n個表連線需要n-1個條件
4.等值連線為多表的交集部分
2.非等值連線----上面的where中的“=”換成“非=”
3.自連線
案例:
1.顯示所有員工的姓名,部門名和部門號
mysql > select concat(first_name,last_name)員工姓名,department_name部門名, d.department_id部門號 from employees e,departments d where e.department_id = d.department_id;
2.查詢90號部門員工的job_id和90號部門的location_id
mysql > select job_id 工種號, location_id區域編號 from employees e,departments d where e.department_id = d.department_id and d.department_id = 90;
3.選擇所有有獎金的員工的last_name,department_name,location_id,city
mysql > select last_name姓名,d.department_name部門名,l.location_id區域號,city城市名 from employees e,departments d,locations l where e.department_id = d.department_id and d.location_id = l.location_id and commission_pct is not null;
4.選擇city在Toronto工作的員工的last_name,job_id department_id ,department_name
mysql > select last_name姓名,job_id工種號,d.department_id部門編號,department_name部門名 from employees e,departments d,locations l where e.department_id = d.department_id and d.location_id = l.location_id and city = 'Toronto';
5.查詢每個工種,每個部門的部門名,工種名和最低工資
mysql > select department_name部門名,job_title工種名, min(salary)最低工資 from employees e,departments d,jobs j where e.department_id = d.department_id and e.job_id = j.job_id group by j.job_id,d.department_id;
6.查詢每個國家下個部門個數大於2的國家編號
mysql > select count(*)部門個數,country_id國家編號 from departments d,locations l where d.location_id = l.location_id group by country_id having count(*) > 2;
7.選擇指定員工的姓名,員工號以及他的管理者的姓名和員工號,結果類似於下面的格式
employees Emp# manager mgr#
kochhar 101 King 100
mysql > select e1.last_name員工姓名,e1.employee_id員工號,e2.last_name管理者姓名,e2.employee_id 管理者編號 from employees e1,employees e2 wherw e1.manager_id = e2.employee_id and e1.last_name = 'kochhar';
SQL99
1.語法:
select查詢列表from表1別名 [連線型別] join表2別名 on連線條件 [where篩選條件] [ group by分組] [having篩選條件] [ order by排序列表]
2.連線型別
1.內連線 inner
2.外連線
左外(left [outer]) 右外(right [outer])全外(full [outer])
3.互動連線 cross
3.內連線
1.語法:
select查詢列表from表1別名 inner joinon連線條件 ......
2.等值
分類:
1.等值
案例:查詢員工名,部門名
mysql > select concat(first_name,last_name)員工姓名,department_name部門名 from employees e inner join departments d on e.department_id = d.department_id;
案例:查詢名稱中包含e的員工名和工種名---新增條件
mysql > select concat(first_name,last_name)員工名,job_title工種名 from employees e inner join jobs j on e.job_id = j.job_id whereconcat(first_name,last_name) like '%e%';
案例:查詢部門個數 > 3的城市名和部門個數---新增分組+篩選
mysql > select count(*)部門個數,city城市名 from departments d inner join locations l on d.location_id = l.location_id group by city having count(*) > 3;
案例:查詢那個部門的員工個數 > 3的部門名和員工個數,並按個數降序---新增排序
mysql > select count(*)員工個數, department_name部門名 from employees e inner join departments d on e.department_id = d.department_id group by department_name having員工個數 > 3 order by員工個數 desc;
案例:查詢員工名,部門名,工種名,並按部門名降序----多表聯合查詢
mysql > select concat(last_name,first_name)員工名,department_name部門名,job_title工種名 from employees e inner join departments d inner join jobs j on e.department_id = d.department_id and e.job_id = j.job_id order by department_name desc;
這個案例這樣做是錯的
mysql > selectconcat(last_name,first_name)員工名,department_name部門名,job_title工種名from employees e
inner join departments d one.department_id = d.department_id
ininer jobs j on e.job_id = j.job_id order by department_name desc;
先藍色部分得到交集,再用這交集的部分與紅色的部分進行交集,得到結果
特點:
1.可以新增排序,分組,篩選
2.inner可以省略
3.篩選條件咋where之後,連線條件在on之後,提高了程式碼的複用性,用於閱讀
4.inner join連線和sql92語法中的等值效果是一樣的,都是查詢交集
2.非等值連線
案例:查詢員工的工資級別
mysql > select concat(first_name,last_name)員工姓名,salary工資,grade_level as員工的工資級別 from employees e inner join job_grades on salary betweenlowest_sal andhighest_sal;
案例:查詢工資級別的個數大於20,並且按工資級別降序
mysql > select count(*)個數 from employees inner join job_grades on salary between lowest_sal and highest_sal group by grade_level having count(*) > 20 order by grade_level;
3.自連線
案例:查詢員工名,上級的名字
mysql > select concat(e1.first_name,e2.last_name)員工名字,concat(e2.first_name,e2.last_name)上級名字 from employees e1 inner join employees e2 on e1.manager_id = e2.employee_id;
4.外連線
引入:查詢沒有男朋友的女神名
應用場景:用於查詢一個表中有,另一個表中沒有的記錄
特點:
1.外連線的查詢結果為主表中所有的記錄
1.如果從表中有和它匹配的,則顯示匹配的值
2.如果從表中沒有和它匹配的,則顯示null
3.外連線查詢的結果 =內連線結果 +主表中有而從表中沒有的記錄
2.左外---左邊的表是主表,右外---右邊的表示主表,即要查詢的資訊來自哪個表,那個表就是主表
3.左外和右外交換兩個表的順序,可以實現同樣的效果
案例;查詢男朋友不在男神表中的女神名
mysql >use girls;
msyql >SELECT b.name 女神名,bo.boyName FROM beauty b LEFT JOIN boys bo ON b.`boyfriend_id` = bo.`id` WHERE bo.`id` IS NULL;
總結:
案例:查詢哪個部門沒有員工
mysql >select count(*)員工個數,department_id部門編號 from employees group by department_id having count(*) = 0;---
完全錯誤,完全不理解題意
mysql > select d.department_id部門編號,employee_id員工編號 from departments d left join employees e on d.department_id = e.department_id where employee_id is null;
5.全外連線
全外連線 =內連線的結果 + 表1中有但表2中沒有 +表1中沒有但表2中有
6.交叉連線--笛卡爾積
A = {1,2}
B = {a,b,c}
A * B = {(1,a),(1,b),(1,c),(2,a),(2,b),(2,c)}
案例
1.查詢編號 > 3的女神名的男朋友的資訊,如果有則列出詳細,如果沒有,則null填充
mysql > use grils;
mysql > select b.name女神姓名, bo.* from beauty b left join boys bo on b.boyfriend_id = bo.id where b.id > 3;
1.查詢哪個城市沒有部門
mysql > select city城市,department_name部門名 from departments d right join locations l on d.location_id = l.location_id where d.department_id is null;
3.查詢部門名為SAL或IT的員工資訊
mysql >select department_name部門名,e.* from departments d left join employees e on d.department_id = e.department_id where department_name in ('SAL','IT');