MySQL入門基礎,mysql基礎視頻+數(shù)據(jù)庫實戰(zhàn),老杜帶你學

mysql day01課堂筆記
1、什么是數(shù)據(jù)庫?什么是數(shù)據(jù)庫管理系統(tǒng)?什么是SQL?他們之間的關系是什么?
數(shù)據(jù)庫:
英文單詞DataBase ,簡稱DB。按照一定格式存儲數(shù)據(jù)的一些文件的組合。
顧名思義:存儲數(shù)據(jù)的倉庫,實際上就是一堆文件。這些文件中存儲了具有特定格式的數(shù)據(jù)。
數(shù)據(jù)庫管理系統(tǒng):
DataBaseManagement ,簡稱DBMS。
數(shù)據(jù)庫管理系統(tǒng)是專門用來管理數(shù)據(jù)庫中數(shù)據(jù)的,數(shù)據(jù)庫管理系統(tǒng)可以對數(shù)據(jù)庫當中的數(shù)據(jù)進行增刪改查。
常見的數(shù)據(jù)庫管理系統(tǒng):?MySQL、Oracle、MS?SqlServer、DB2、sybase等。
SQL:結構化查詢語言
程序員需要學習SQL語句,程序員通過編寫SQL語句,然后DBMS負責執(zhí)行SQL語句,最終來完成數(shù)據(jù)庫中數(shù)據(jù)的增刪改查操作。
SQL是一套標準,程序員主要學習的就是SQL語句,這個SQL在mysql中可以使用,同時在oracle中也可以使用,在DB2中也可以使用。
三者之間的關系?
DBMS--執(zhí)行-->SQL--操作-->DB
先安裝數(shù)據(jù)庫管理系統(tǒng)MySQL,然后學習SQL語句怎么寫,編寫SQL語句之后,DBMS
對SQL語句進行執(zhí)行,最終來完成數(shù)據(jù)庫的數(shù)據(jù)管理。
2、安裝MySQL數(shù)據(jù)庫管理系統(tǒng)。|
第一步:先安裝,選擇“經典版”
第二步:需要進行MySQL數(shù)據(jù)庫實例配置。
注意:一路下一步就行了?。?/span>
需要注意的事項?
端口號:
端口號port是任何一個軟件/應用都會有的,端口號是應用的唯一代表。
端口號通常和IP地址在一塊,IP地址用來定位計算機的,端口號port
是用來定位計算機上某個服務的/某個應用的!
在同一臺計算機上,端口號不能重復。具有唯一性。
mysql數(shù)據(jù)庫啟動的時候,這個服務占有的默認端口號是3306
這是大家都知道的事兒。記住。
字符編碼方式?
設置mysql數(shù)據(jù)庫的字符編碼方式為UTF8
一定要注意:先選中第3個單選按鈕,然后再選擇utf8字符集。
服務名稱?
默認是:MySQL不用改。
選擇配置環(huán)境變量path:
如果沒有選擇怎么辦?你可以手動配置
path=其它路徑:C:\Program?Files(x86)\MySQL\MySQL?Server?5.5\bin
mysql超級管理員用戶名不能改,一定是:root
你需要設置mysql數(shù)據(jù)庫超級管理員的密碼。
我們設置為123456
設置密碼的同時,可以激活root賬戶遠程訪問。
激活:表示root賬號可以在外地登錄。
不激活:表示root賬號只能在本機上使用。
我這里選擇激活了!
3、MySQL數(shù)據(jù)庫的完美卸載!
第一步:雙擊安裝包進行卸載刪除。
第二步:刪除目錄:
把C:\ProgramData下面的MySQL目錄干掉。
把C:\Program?Files?(x86)下面的MySQL目錄干掉。
這樣就卸載結束了!
4、看一下計算機上的服務,找一找MySQL的服務在哪里?
計算機—>右鍵—>管理—>服務和應用程序—>服務—>找mysql服務
MySQL的服務,默認是“啟動”的狀態(tài),只有啟動了mysql才能用。
默認情況下是“自動”啟動,自動啟動表示下一次重啟操作系統(tǒng)的時候自動啟動該服務。
可以在服務上點擊右鍵:
啟動
重啟服務
停止服務
........
還可以改變服務的默認配置:
服務上點擊右鍵,屬性,然后可以選擇啟動方式:
自動(延遲啟動)
自動
手動
禁用
5、在windows操作系統(tǒng)當中,怎么使用命令來啟動和關閉mysql服務呢?
語法:
Net?stop?服務名稱;
Net?start服務名稱;
其它服務的啟停都可以采用以上的命令。
6、mysql安裝了,服務啟動了,怎么使用客戶端登錄mysq1數(shù)據(jù)庫呢?
使用bin目錄下的mysql.exe命令來連接mysql數(shù)據(jù)庫服務器
本地登錄(顯示編寫密碼的形式):
C:\Users\Administrator>mysql -uroot -p123456
Welcome to the MySQL monitor.Commands end with;or \g.
Your MySQL connection id is 1
Server version: 5.5.36 MySQL Community Server (GPL)
Copyright (c) 2000,2014,Oracle and/or its affiliates.All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or
Its affiliates. Other names may be trademarks of their respective owners.
Type ‘help;’or‘\h' for help.Type‘\c’to clear the current input statement.
mysql>
本地登錄(隱藏密碼的形式):
C:\Users\Administrator>mysql?-urcot?-p
Enter?password:*******
Welcome?to?the?MySQL?monitor.?Commands?endwith;or\g.
Your?MySQL?connection?id is?2
Server?version:?5.5.36?MySQL?Community?Server(GPL)
Copyright?(c)?2000,2014,Oracle?and/or?itsaffiliates.All?rights?reserved.?Oracle?is?a?registeredtrademark?of?Oracle?Corporation?and/or?itsaffiliates.other?names?may?be?trademarks?of?theirrespective?owners?.
Type‘?help;’or‘\h'for?help.?Type?‘\c'?to?clear?thecurrent?input?statement.
mysql>
7、mysql常用命令:
退出mysql:exit
查看mysql中有哪些數(shù)據(jù)庫?
Show?databases;
注意:?以分號結尾,分號是英文的分號。
mysql>?show?databases;
mysql默認自帶了4個數(shù)據(jù)庫。
怎么選擇使用某個數(shù)據(jù)庫呢?
mysql>?use?test;
Database?changed
表示正在使用一個名字叫做test的數(shù)據(jù)庫。
怎么創(chuàng)建數(shù)據(jù)庫呢?
mysql>?create?Database?bjpowernode;
Query?OK,?1?row?affected?(0.00?sec)
mysql>?show?databases;
查看某個數(shù)據(jù)庫下有哪些表?
Mysql>show tables;
注意:以上的命令不區(qū)分大小寫,都行。
查看mysql數(shù)據(jù)庫的版本號:
Mysql>select version();
查看當前使用的是哪個數(shù)據(jù)庫?
注意:mysql是不見“;”不執(zhí)行,“;”表示結束!
mysql>?show
\c
mysql>
\c用來終止一條命令的輸入。
8、數(shù)據(jù)庫當中最基本的單元是表:Table
什么是表table?為什么用表來存儲數(shù)據(jù)呢?
姓名???性別???年齡(列:?字段)
張三???男????20?????????---->行(記錄)
李四???女????21?????????---->行(記錄)
王五???男????22?????????---->行(記錄)
數(shù)據(jù)庫當中是以表格的形式表示數(shù)據(jù)的。
因為表比較直觀。
任何一張表都有行和列:
行(row):?被稱為數(shù)據(jù)/記錄。
列(column):?被稱為字段。
姓名字段、性別字段、年齡字段。
了解一下:
每一個字段都有:字段名、數(shù)據(jù)類型、約束等屬性。
字段名可以理解,是一個普通的名字,見名知意就行。
數(shù)據(jù)類型:字符串,數(shù)字,日期等,后期講。
約束:約束也有很多,其中一個叫做唯一性約束,
這種約束添加之后,該字段中的數(shù)據(jù)不能重復。
9、關于SQL語句的分類?
SQL語句有很多,最好進行分門別類,這樣更容易記憶。
分為:
DQL:
數(shù)據(jù)查詢語言(凡是帶有select關鍵字的都是查詢語句)
select......
DMI:
數(shù)據(jù)操作語言(凡是對表當中的數(shù)據(jù)進行增刪改的都是DML)
Insert?delete?update
Insert?增
Delete?刪
Update?改
這個主要是操作表中的數(shù)據(jù)data.
DDL:
數(shù)據(jù)定義語言凡是帶有create、drop、alter的都是DDL。
DDL主要操作的是表的結構。不是表中的數(shù)據(jù)。
create:新建,等同于增
drop:刪除
alter:修改
這個增刪改和DML不同,這個主要是對表結構進行操作。
TCL:不是王牌電視。
是事務控制語言
包括:
事務提交:commit;
事務回滾:rollback;
DCL:是數(shù)據(jù)控制語言。
例如:授權grant、撤銷權限revoke。
10、導入一下提前準備好的數(shù)據(jù):
bjpowernode.sql這個文件中是我提前為大家練習準備的數(shù)據(jù)庫表。
怎么將sql文件中的數(shù)據(jù)導入呢?
mysql>source?D:\course\03-MySQL\document\bjpowernode.sql
注意:路徑中不要有中文!!!
11、關于導入的這幾張表?
mysql>show?tables;
?
dept是部門表
emp是員工表
salgrade是工資等級表
怎么查看表中的數(shù)據(jù)呢?
Select*from?表名;//統(tǒng)一執(zhí)行這個SQL語句。
mysql>?select*from?emp;
mysql>select*from?dept;
mysql>select*from?salgrade;
12、不看表中的數(shù)據(jù),只看表的結構,有一個命令;
Desc 表名;
MySQL>desc dept;
mysql>desc salgrade;
describe縮寫為:desc
mysql>describe dept;
13、簡單查詢
13.1、查詢一個字段?
select字段名from表名:其中要注意:
select和from都是關鍵字。字段名和表名都是標識符。
?
強調:
對于SQL語句來說,是通用的,所有的SQL語句以";"結尾。
另外SQL語句不區(qū)分大小寫,都行。
查詢部門名字?
mysql>select dname from dept;
4 rows in set (0.00?sec)
mysql>SELECT DNAME FROM DEPT;
13.2、查詢兩個字段,或者多個字段怎么辦?
使用逗號隔開","
查詢部門編號和部門名?
select deptno,dnamefrom dept;
13.3、查詢所有字段怎么辦?
第一種方式:可以把每個字段都寫上
select a,b,c,d,e,f...from tablename;
第二種方式:可以使用*
Select?*?from dept;
這種方式的缺點:1、效率低
2、可讀性差。
在實際開發(fā)中不建議,可以自己玩沒問題。
你可以在D0S命令窗口中想快速的看一看全表數(shù)據(jù)可以采用這種方式。
13.4、給查詢的列起別名?
mysql>select deptno,dname as deptname from dept;
使用as關鍵字起別名。
注意:只是將顯示的查詢結果列名顯示為deptname,原表列名還是叫:dname記住:select語句是永遠都不會進行修改操作的。(因為只負責查詢)
as關鍵字可以省略嗎?可以的
mysql>select deptno,dname deptname from dept;
假設起別名的時候,別名里面有空格,怎么辦?
mysql>select deptno,dname?dept name?from dept;
DBMS看到這樣的語句,進行SQL語句的編譯,不符合語法,編譯報錯。
怎么解決?
select deptno,dname?'dept name'from?dept;??//加單引號
select deptno,dname?"dept name"from dept;??//加雙引號
注意:在所有的數(shù)據(jù)庫當中,字符串統(tǒng)一使用單引號括起來,單引號是標準,雙引號在oracle數(shù)據(jù)庫中用不了。但是在mysql中可以使用。
再次強調:數(shù)據(jù)庫中的字符串都是采用單引號括起來,這是標準的,雙引號不標準。
?
13.5、計算員工年薪?sa1*12
mysql>select ename,sal from emp;
mysq1>select ename,sal*12 from emp;//結論:字段可以使用數(shù)學表達式!
mysq1>select ename,sal*12 as‘年薪’,from emp;//別名是中文,用單引號括起來。
14.條件查詢
條件查詢需要用到where語句,where必須放到from語句表的后面。支持如下運算符:
14.1、什么是條件查詢?
不是將表中所有數(shù)據(jù)都查出來。是查詢出來符合條件的。語法格式:
select
字段1,字段2,字段3....
from
表名
where
條件;
14.2、都有哪些條件?
1.=?等于
查詢薪資等于800的員工姓名和編號?
select empno,ename from emp where sal=800;
查詢SMITH的編號和薪資?
?
select empno,sal from emp where ename='SMITH';//字符串使用單引號
2.<>或!=不等于
查詢薪資不等于800的員工姓名和編號?
select empno,ename from emp where sal !=800;
select empno,ename from emp where sal<>800;//小于號和大于號組成的不等號
3.<小于
查詢薪資小于2000的員工姓名和編號?
mysql>select empno,ename,sal from emp where sal<2000;
4.<=小于等于
查詢薪資小于等于3000的員工姓名和編號?
select empno,ename,sal from emp where sal <=3000;
5.>大于
查詢薪資大于3000的員工姓名和編號?
select empno,ename,sal from emp where sal >3000;
6.>=大于等于
查詢薪資大于等于3000的員工姓名和編號?
select empno,ename,sal from emp where sal >=3000;
7.Between?...and?...兩個值之間,等同于>=and<=
查詢薪資在2450和3000之間的員工信息?包括2450和3000
第一種方式:>=and<=(and是并且的意思)
select empno,ename,sal from emp where sal>=2450 and sa1<=3000;
第二種方式:between...and?...
select??empno,ename,sal?from?emp?wheresalL between 2450 and 3000;
注意:使用between and的時候,必須遵循左小右大。between and是閉區(qū)間,包括兩端的值。
8.Is?nu11為nul1(is not nul1不為空)查詢哪些員工的津貼/補助為nu11?
mysql>select empno,ename,sal,comm from emp where?comm=nu11;
Empty set (0.00 sec)
mysql>select empno,ename,sal,comm from emp where comm is null;
10 rowsin set (0.00 sec)
注意:在數(shù)據(jù)庫當中nu1l不能使用等號進行衡量。需要使用is?nul1因為數(shù)據(jù)庫中的nu11代表什么也沒有,它不是一個值,所以不能使用等號衡量。
查詢哪些員工的津貼/補助不為nul1?
select empno,ename,sal,comm from emp where comm is not null;
9.and并且
查詢工作崗位是ANAGER并且工資大于2500的員工信息?
Select
?empno,ename,job,sal?
from
emp
Where
job=?'MANAGER'and sal?>2500;
10.Or?或者
查詢工作崗位是MANAGER和SALESMAN的員工?
select empno,ename,job from emp wherejob=‘MANAGER’;
select empno,ename,job from emp?wherejob=‘SALESMAN’;
select
empno,ename,job
from
emp
where
Job=?'MANAGER'or job =‘SALESMAN’
and和or同時出現(xiàn)的話,有優(yōu)先級問題嗎?
查詢工資大于2500,并且部門編號為10或20部門的員工?
select
*
from
emp
where
Sal>?2500 and deptno?=10 or deptno?=20;
分析以上語句的問題?
and優(yōu)先級比or高。以上語句會先執(zhí)行and,然后執(zhí)行or。
以上這個語句表示什么含義?
找出工資大于2500并且部門編號為10的員工,或者20部門所有員工找出來。
select
*
from
emp
where
sal?>2500 and (deptno=10 or deptno?=20);
and和or同時出現(xiàn),and優(yōu)先級較高。如果想讓or先執(zhí)行,需要加"小括號"。以后在開發(fā)中,如果不確定優(yōu)先級,就加小括號就行了。
11.in包含,相當于多個or?(not in不在這個范圍中)
查詢工作崗位是MANAGER和SALESMAN的員工?
select empno,ename,job from emp where job='MANAGER'or job='SALESMAN''
Select?empno,ename,job?from emp where job in('MANAGER',’SALESMAN');
注意:in不是一個區(qū)間。in后面跟的是具體的值。
查詢薪資是800和5000的員工信息?
select ename,sal from emp where sal =800 or sal =5000;
select ename,sa1 from emp where sal in(800,5000);//這個不是表示800到5000都找出來
?
select ename,sal from emp where sal in(800,5000,3000);
//not in表示不在這幾個值當中的數(shù)據(jù)。
select ename,sal from emp where sal not in(800,5000,3000);
not可以取非,主要用在is或in中
is null
is not null
In
not in?
like稱為模糊查詢,支持%或下劃線匹配匹配任意多個字符下劃線:任意一個字符。(%號是一個特殊的符號,下劃線也是一個特殊符號)
找出名字中含有o的?
mysql>select ename from emp where ename like’%o%’;
找出名字以T結尾的?
select ename from emp where ename like?‘%T’;
找出名字以K開始的?
select ename from emp where ename like'K%';
找出第二個字每是A的?
select ename from emp where ename like'_A%';
找出第三個字母是R的?
select ename from emp where ename like'__R%';
T_student學生表
找出名字中有"_"的?
select name from t_student where name like'%_%';//這樣不行。
mysql>select name from t student where name like'%\_%';//\轉義字符。
15、排序
15.1、查詢所有員工薪資,排序?
Select??ename,sal??from??Emp??order by?sa1;//默認是升序?。?!
指定降序:
Select??ename,sal?from??emp??order??by?saldesc;
指定升序?
Select??ename,sal??from??emp??order by??sal?asc;
15.3、可以兩個字段排序嗎?或者說按照多個字段排序?
查詢員工名字和薪資,要求按照薪資升序,如果薪資一樣的話,再按照名字升序排列。
Select??ename,sal??from??emp??order by?sal asc,ehame asc;//sal在前,起主導,只有sal相等的時候,才會考慮啟用ename排序。
15.4、了解:根據(jù)字段的位置也可以排序
select ename,sal from emp order by?2;//2表示第二列。第二列是sal!
按照查詢結果的第2列sa1排序。
了解一下,不建議在開發(fā)中這樣寫,因為不建議。
因為列的順序很容易發(fā)生改變,列順序修改之后,2就廢了。
16、綜合一點的案例:
找出工資在1250到3000之間的員工信息,要求按照薪資降序排列。Select??ename,sal?from??emp??where??sal between 1250 and 3000?order by??sal desc;
關鍵字順序不能變:
Select
from
where
order by
以上語句的執(zhí)行順序必須掌握:
第一步:from
第二步:where
第三步:select
第四步:order by(排序總是在最后執(zhí)行?。?/strong>
7、數(shù)據(jù)處理函數(shù)/單行處理函數(shù)
17、數(shù)據(jù)處理函數(shù)
17.1、數(shù)據(jù)處理函數(shù)又被稱為單行處理函數(shù)
單行處理函數(shù)的特點:一個輸入對應一個輸出。
和單行處理函數(shù)相對的是:多行處理函數(shù)。(多行處理函數(shù)特點:多個輸入,對應1個輸出?。?/span>
17.2、單行處理函數(shù)常見的有哪些?
1、1ower轉換小寫
mysql>select lower(ename)?as?ename from emp;
14個輸入,最后還是14個輸出。這是單行處理函數(shù)的特點。
2、upper轉換大寫
mysql>select from t_student;
mysql>select upper(name)as name from t student;
3、substr取子串(substr(被截取的字符串,起始下標,截取的長度))?
select substr(ename,1,1)?as ename from emp;
注意:起始下標從1開始,沒有0。
找出員工名字第一個字母是A的員工信息?
第一種方式:模糊查詢
select ename from emp where ename like'A%';
第二種方式:substr函數(shù)
Select?ename?from?emp??wheresubstr(ename,1,1)='A';
首字母大寫?
select name from t_student;
select upper(substr(name,1,1))?from t_student;
select substr(name,2,length(name)-1)from t_student;
select concat(upper(substr(name,1,1)),substr(name,2,length(name)-1))?as result from t student;
4、concat函數(shù)進行字符串的拼接:
select concat (empno,ename)?from?emp;
5、length取長度
select length(ename)?enamelength from emp;
6、Trim 去空格
mysql>select from emp where ename’KING';
Empty set (0.00 sec)
mysql>select from emp where ename trim('KING');
7、round四舍五入
select字段from表名;select ename from emp;
select 'abc'from emp;//select后面直接跟‘字面量/字面值’
mysql>select 'abc'as bieming fromemp;
mysql>select abc from emp;
ERROR 1054 (42S22):Unknown column 'abc'in 'field list'
這樣肯定報錯,因為會把abc當做一個字段的名字,去emp表中找abc字段去了。
Select?1000?as num?from emp;//1000也是被當做一個字面量/字面值。
結論:se1ect后面可以跟某個表的字段名(可以等同看做變量名),也可以跟字面量/字面值(數(shù)據(jù))。select 21000 as num from dept;
mysq1>select round(1236.567,0)as result from emp;/保留整數(shù)位。
se1ect round(1236.567,1)as result from emp;//保留1個小數(shù)se1ect round(1236.567,2)as result from emp;//保留2個小數(shù)select round(1236.567,-1)as result from emp;//保留到十位。
select?round(1236.567,-2)as result from emp;
8、rand()生成隨機數(shù)
mysq1>select round(rand()*100,0)from emp;//100以內的隨機
9、ifnu11可以將nu11轉換成一個具體值
ifnull是空處理函數(shù)。專門處理空的。
在所有數(shù)據(jù)庫當中,只要有NULL參與的數(shù)學運算,最終結果就是NULL。
mysql>select ename,comm as salcomm from emp;
注意:NULL只要參與運算,最終結果一定是NULL。為了避免這個現(xiàn)象,需要使用ifull函數(shù)。
ifnull函數(shù)用法:ifnul1(數(shù)據(jù),被當做哪個值)
如果"數(shù)據(jù)"為NULL的時候,把這個數(shù)據(jù)結構當做哪個值。
?
補助為NULL的時候,將補助當做0
select ename,(sal ifnull(comm,0))*12 as yearsal from emp;
?
10、case..when..then..when..then..else..end
當員工的工作崗位是MANAGER的時候,工資上調10,當工作崗位是SALESMAN的時候,工資上調50號,其它正常。
(注意:不修改數(shù)據(jù)庫,只是將查詢結果顯示為工資上調)
Select?ename,job,sal as oldsal,
(case job when 'MANAGER'then sal*1.1 when 'SALESMAN'then sal*1.5 else sal end)as newsalfrom???emp;
18、分組函數(shù)(多行處理函數(shù))
多行處理函數(shù)的特點:輸入多行,最終輸出一行。
5個: count計數(shù)
sum 求和
avg?平均值
max?最大值
min?最小值
注意:分組函數(shù)在使用的時候必須先進行分組,然后才能用。如果你沒有對數(shù)據(jù)進行分組,整張表默認為一組。
找出最高工資?
mysql>select max(sal)?from emp;
找出最低工資?
mysql>select min(sal)??from emp;
計算工資和:
mysql>select sum(sal)??from emp;
計算平均工資:
mysql>select avg(sal)??from emp;
14個工資全部加起來,然后除以14。
計算員工數(shù)量?
mysql>select?coount (ename)??from emp;
分組函數(shù)在使用的時候需要注意哪些?
mysql>select sum(comm)?from emp;
?
第一點:分組函數(shù)自動忽略NULL,你不需要提前對NULL進行處理。
mysql>select count(comm)??from emp;
mysql>select avg(comm)??from emp;
第二點:分組函數(shù)中count(*)和count(體字段)有什么區(qū)別?
mysql>select count(*)??from emp;
mysql>select count (comm)??from emp;
count(具體字段):表示統(tǒng)計該字段下所有不為NULL的元素的總數(shù)。
count(*):統(tǒng)計表當中的總行數(shù)。(只要有一行數(shù)據(jù)count則+1)
因為每一行記錄不可能都為NULL,一行數(shù)據(jù)中有一列不為NULL,則這行數(shù)據(jù)就是有效的。
第三點:分組函數(shù)不能夠直接使用在where子句中。
找出比最低工資高的員工信息。
select ename,sal from emp where sal?>min(sal);
表面上沒問題,運行一下?
ERROR 1111 (HY000):Invalid use of group function
?????????????????????????????????????????????????????????????????????
說完分組查詢(group by)之后就明白了。
第四點:所有的分組函數(shù)可以組合起來一起用。
Selectsum(sal),min(sal),max(sal),avg(sal),count(*)from emp;
19、分組查詢(非常重要:五顆星*****)
19.1、什么是分組查詢?
在實際的應用中,可能有這樣的需求,需要先進行分組,然后對每一組的數(shù)據(jù)進行操作。這個時候我們需要使用分組查詢,怎么進行分組查詢呢?
select?from?group by?...
計算每個部門的工資和?
計算每個工作崗位的平均薪資?
找出每個工作崗位的最高薪資?
19.2、將之前的關鍵字全都組合在一起,來看一下他們的執(zhí)行順序?
select
?????from
where
group by
order by
以上關鍵字的順序不能顛倒,需要記憶。執(zhí)行順序是什么?
1.from
2.where
3.group by
4.select
5.order by
為什么分組函數(shù)不能直接使用在where后面?
Select?ename,sal from emp where sal>min(sal);//報錯。
因為分組函數(shù)在使用的時候必須先分組之后才能使用。 where執(zhí)行的時候,還沒有分組。所以where.后面不能出現(xiàn)分組函數(shù)。
Select?sum(sal)??from emp;
這個沒有分組,為啥sum()函數(shù)可以用呢?
因為select在group by.之后執(zhí)行。?
19.3、找出每個工作崗位的工資和?
實現(xiàn)思路:按照工作崗位分組,然后對工資求和。
select job,sum(sal) from?emp??group by?job;
以上這個語句的執(zhí)行順序?先從emp表中查詢數(shù)據(jù)根據(jù)job字段進行分組。
然后對每一組的數(shù)據(jù)進行sum(sal)
select ename,job,sum(sal)??from emp group by job;
以上語句在myscl中可以執(zhí)行,但是毫無意義。以上語句在orac1e中執(zhí)行報錯。
oracle的語法比mysql的語法嚴格。(mysql的語法相對來說松散一些)
重點結論:
在一條select語句當中,如果有group by語句的話,select后面只能跟:參加分組的字段,以及分組函數(shù)。其它的一律不能跟。 19.4、找出每個部門的最高薪資
實現(xiàn)思路是什么?
按照部門編號分組,求每一組的最大值。
select后面添加ename字段沒有意義,另外oracle會報錯。
mysql>select ename,deptno,max(sal)?from emp group by deptno;
mysql>select deptno,max(sal)??from emp group by deptno;?19.5、找出每個部門,不同工作崗位的最高薪資?
技巧:兩個字段聯(lián)合成1個字段看。(兩個字段聯(lián)合分組)
select deptno,job,max(sal)
from?Emp??
group by deptno,job;
19.6、使用having可以對分完組之后的數(shù)據(jù)進一步過濾。having:不能單獨使用,having:不能代替where,having必須和group by聯(lián)合使用。
找出每個部門最高薪資,要求顯示最高薪資大于3000的?
第一步:找出每個部門最高薪資
按照部門編號分組,求每一組最大值。
select?
deptno,max(sal)??
from?
emp???
group by
deptno;
第二步:要求顯示最高薪資大于3000
select
deptno,max(sal)
from
Emp
group by
deptno
having
max(sa1)>3000;
思考一個問題:以上的sql語句執(zhí)行效率是不是低?
比較低,實際上可以這樣考慮:先將大于3000的都找出來,然后再分組。
select
deptno,max(sal)
from
emp
where
sa1>3000
group by
deptno;
優(yōu)化策略:where和having,優(yōu)先選擇where,here實在完成不了了,再選擇having.
19.7、where沒辦法的????
找出每個部門平均薪資,要求顯示平均薪資高于2500的。
第一步:找出每個部門平均薪資
select?
deptno,avg(sal)
from?
emp?
group by?
deptno;
第二步:要求顯示平均薪資高于2500的
select
deptno,avg(sal)
from
Emp
group by
deptno
having
avg(sa1)>2500:
20、大總結(單表的查詢學完了)
select
from
where
group by
having
order by?
以上關鍵字只能按照這個順序來,不能顛倒。
執(zhí)行順序?
1.from
2.where
3.group by
4.having
5.select
6.order by?
從某張表中查詢數(shù)據(jù),先經過where條件篩選出有價值的數(shù)據(jù)。對這些有價值的數(shù)據(jù)進行分組。分組之后可以使用having繼續(xù)篩選。select查詢出來。最后排序輸出!
找出每個崗位的平均薪資,要求顯示平均薪資大于1500的,除MANAGER崗位之外,
要求按照平均薪資降序排。
select
job,avg(sal)as avgsal
from
emp
where
job <’MANAGER'
group by
job
having
avg(sa1)>1500
order by
avgsal desc;
?
?
1
?