最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網 會員登陸 & 注冊

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

2023-08-01 10:47 作者:魔川珂珂  | 我要投稿

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


?

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

分享到微博請遵守國家法律
富川| 满洲里市| 房山区| 潜山县| 新化县| 鄯善县| 柳林县| 永修县| 大荔县| 临猗县| 阳曲县| 苏州市| 江西省| 邓州市| 江津市| 柞水县| 五家渠市| 平谷区| 富宁县| 墨玉县| 酉阳| 阿尔山市| 吉安市| 上饶县| 淅川县| 恩施市| 义马市| 磐安县| 柳林县| 抚顺市| 南宁市| 霞浦县| 龙口市| 柏乡县| 河南省| 阿尔山市| 定远县| 富裕县| 吴忠市| 庆云县| 河津市|