MySQL 資料庫

第一節 資料庫簡介

1.1 簡介

​ 資料庫(DataBase,DB):指長期保存在電腦的存儲設備上,按照一定規則組織起來,可以被各種用戶或應用共享的數據集合。簡單理解數據的倉庫。

​ 資料庫管理系統(DataBase Management System,DBMS):指一種操作和管理資料庫的大型軟體,用於建立、使用和維護資料庫,對資料庫進行統一管理和控制,以保證資料庫的安全性和完整性。用戶通過資料庫管理系統訪問資料庫中的數據。

資料庫是通過資料庫管理系統創建和操作的。

1.2 常見資料庫管理系統
  • Oracle:Oracle資料庫被認為是業界目前比較成功的關係型資料庫管理系統。Oracle資料庫可以運行在UNIX、Windows等主流作業系統平台,完全支援所有的工業標準,並獲得最高級別的ISO標準安全性認證。
  • MySQL:MySQL是一個關係型資料庫管理系統,由瑞典MySQL AB 公司開發,目前屬於 Oracle旗下產品。MySQL 是最流行的關係型資料庫管理系統之一,在 WEB 應用方面,MySQL是最好的 RDBMS (Relational Database Management System,關係資料庫管理系統) 應用軟體。
  • DB2:DB2是IBM公司的產品,DB2資料庫系統採用多進程多線索體系結構,其功能足以滿足大中公司的需要,並可靈活地服務於中小型電子商務解決方案。
  • Microsoft SQL Server:SQL Server 是Microsoft 公司推出的關係型資料庫管理系統。具有使用方便可伸縮性好與相關軟體集成程度高等優點。
  • SQLLite:應用在手機端的資料庫。
1.3 MySQL5.7.x 版本安裝

同意協議

開發模式

請注意安裝需要的依賴環境,如果想安裝的功能缺少對應環境是無法安裝的,需先安裝環境後才可以安裝

下一步的時候會提示缺少環境,此處的提示是說你期望安裝的產品中缺少依賴,不一定提示的是資料庫伺服器安裝的依賴,可能是其他功能組件的依賴缺少

此處發現沒有 mysql server, 說明它對應的依賴缺少,可以先執行安裝這些可以安裝的,之後安裝完依賴後再重新安裝其他模組,我們此處的操作是先安裝依賴,然後後退再次安裝

下載安裝前面提示的 mysql server 需要的 vc2013後,vc2013 如果在64位系統上面建議32和64的程式都安裝,然後在上圖的地方後退,重新 next 就可以看到可以安裝 mysql server 了

進行第一步配置,除了需要設置密碼外,後面的步驟基本上都是下一步下一步

設置 root 密碼

finish 後回到當前頁面繼續配置

此處先 check, 後下一步

執行完此步驟 下一步 finish 配置完成

卸載過程1 控制台卸載 2找到mysql的安裝目錄 刪除 3 programdata 刪除mysql

​ 注意:如果卸載後,發現MySQL服務沒有刪掉,手動刪除: 以管理員身份打開命令行,

​ 輸入 sc delete MySQL 回車。

  • 配置環境變數:MYSQL_HOME:C:\Program Files\MySQL\MySQL Server 5.7

    ​ PATH:%MYSQL_HOME%\bin;

  • 啟動mysql服務 1 使用services.msc 找到服務啟動 ,2 管理員身份運行cmd 停止net stop mysql 啟動net start mysql

  • 驗證是否安裝成功,打開cmd輸入,如上圖所示。
    登錄語法:mysql [-h 主機名] -u root -p

    c:\>mysql -u root -p  回車輸入密碼即可
    

    然後輸入密碼,正確進入表示安裝成功。

  • 卸載MySQL

    1.停止服務,使用c:\>net stop mysql命令停止服務,c:\>net start mysql 命令啟動服務。

    2.在控制面板–>”程式和功能”中,找到「mysql程式」,點擊卸載。

    3.刪除安裝目錄,一般默認在C:\Program Files\MySQL。

    4.刪除資料庫文件存放目錄,一般默認在C:\ProgramData\MySQL。

  • MySQL安裝目錄

    bin文件夾:該文件夾下存放著可執行文件
    include文件夾:該文件夾下存放著頭文件
    lib文件夾:該文件夾下存放著庫文件
    share文件夾:該文件夾下存放著字符集、語言等資訊。
    
  • MySQL配置文件

    在MySQL安裝目錄中找到my.ini文件,並打開my.ini文件查看幾個常用配置參數
    常用的參數如下:
    	default-character-set:客戶端默認字符集
    	character-set-server:伺服器端默認字符集
    	port:客戶端和伺服器端的埠號	
    	default-storage-engine:MySQL默認存儲引擎 INNODB
    

第二節 SQL語言

2.1 概述

​ SQL:Structure Query Language(結構化查詢語言),SQL被美國國家標準局(ANSI)確定為關係型資料庫語言的美國標準,後來被國際化標準組織(ISO)採納為關係資料庫語言的國際標準。

​ 各資料庫廠商都支援ISO的SQL標準,普通話

​ 各資料庫廠商在標準的基礎上做了自己的擴展,方言

​ SQL 是一種標準化的語言,它允許你在資料庫上執行操作,如創建資料庫、表等等,查詢內容,更新內容,並刪除條目等操作。

​ Create, Read, Update, and Delete 通常稱為CRUD操作。

2.2 SQL語句分類
  • DDL(Data Definition Language):數據定義語言,用來定義資料庫對象:庫、表、列等。
  • DML(Data Manipulation Language):數據操作語言,用來定義資料庫記錄(數據)。
  • DCL(Data Control Language):數據控制語言,用來定義訪問許可權和安全級別。
  • DQL(Data Query Language):數據查詢語言,用來查詢記錄(數據)。

​ MySQL的使用注意:

​ sql語句以 ; 結尾。

​ MySQL注釋:(1)#開頭 (2)–空格 開頭 (3)/* 多行注釋 */

2.3 DDL操作資料庫
show databases;   #顯示當前mysql中的資料庫

系統默認資料庫:

information_schema:

information_schema資料庫是MySQL自帶的,它提供了訪問資料庫元數據的方式。什麼是元數據呢?元數據是關於數據的數據,如資料庫名或表名,列的數據類型,或訪問許可權等。

mysql:

mysql:這個是mysql的核心資料庫,主要負責存儲資料庫的用戶、許可權設置、關鍵字等mysql自己需要使用的控制和管理資訊,不可以刪除。

performance_schema:

性能優化的資料庫

test:

這個是安裝時候創建的一個測試資料庫,和它的名字一樣,是一個完全的空資料庫,沒有任何錶,可以刪除。

1創建資料庫:CREATE DATABASE語句用於創建新的資料庫:

語法:

CREATE DATABASE [IF NOT EXISTS]  db_name

SQL> CREATE DATABASE mydb1;
SQL> CREATE DATABASE IF NOT EXISTS mydb2 character SET GBK;
SQL> CREATE DATABASE mydb3 character SET GBK COLLATE gbk_chinese_ci;

2查看

查看當前資料庫伺服器中的所有資料庫

SQL> SHOW DATABASES;

查看前面創建的mydb2資料庫的定義資訊

SQL> ShOW CREATE DATABASE mydb2;

3修改

查看伺服器中的資料庫,並把mydb2的字符集修改為utf8;

SQL> ALTER DATABASE mydb2 character SET utf8;

4刪除

語法:DROP DATABASE [IF EXISTS] db_name

SQL> DROP DATABASE IF EXISTS mydb3;

5其他語句

​ 查看當前使用的資料庫

SQL> Select database(); #沒有選擇數據 null

​ 切換資料庫

SQL> USE mydb2;

​ 退出MySQL

quit;或exit;

2.4 DDL操作表

CREATE TABLE語句用於創建新表。

語法:

CREATE TABLE [IF NOT EXISTS] 表名(

               欄位1 欄位類型(長度) 約束,

               欄位2 欄位類型(長度) 約束,
               ...
               欄位n 欄位類型(長度) 約束

) [charset=utf8];

示例:

SQL> CREATE TABLE IF NOT EXISTS student
(
   id INT NOT NULL,
   name VARCHAR(50),
   age INT,
   address VARCHAR(100)
) CHARSET=utf8;
或
SQL> CREATE TABLE  IF NOT EXISTS `student`
(
   `id` INT NOT NULL,
   `name` VARCHAR(50),
   `age` INT,
   `address` VARCHAR(100)
) CHARSET=utf8;

注意:資料庫名、表名、欄位名可以使用反勾號` 括住,也可以不括。如果SQL關鍵字一般要括住。

常用數據類型:

​ int:整型(4個位元組)

​ double:浮點型(8個位元組),近似值

​ 例如double(5,2)表示最多5位,其中必須有2位小數,即最大值為999.99

​ decimal:精確數值數據,最大位數可以是65

​ 例如decimal(5,2)能夠存儲具有五位數和兩位小數的任何值,因此可以存儲範圍為

​ -999.99至999.99。

​ char:固定長度字元串類型; char(10) ‘aaa ‘ 固定10個字元,不足補空格, 長度0-255

​ 缺點:浪費空間,優點:查詢速度快

​ varchar:可變長度字元串類型; varchar(10) ‘aaa’ 最多存儲10個字元

​ 缺點:查詢速度慢,優點:節省空間

​ text:大文本字元串類型;有字元編碼,存儲比較大的文本數據。

​ blob:Binary Large Object二進位大對象數據;可以存儲圖片、音頻、影片

​ date:日期類型,格式為:yyyy-MM-dd;

​ time:時間類型,格式為:hh:mm:ss

​ timestamp:時間戳類型 yyyy-MM-dd hh:mm:ss 會自動賦值

​ datetime:日期時間類型 yyyy-MM-dd hh:mm:ss

常用約束:

​ 主鍵約束:primary key (保證數據唯一性),不能重複,不能為null

​ 唯一約束:unique [key],不能重複,可以為null

		非空約束:not null

​ 默認約束:default

​ 外鍵約束:foreign key

​ 自動增長:auto_increment

DROP TABLE語句用於刪除現有表。

語法: DROP TABLE [IF EXISTS] table_name;

SQL> DROP TABLE table_name;

當前資料庫中的所有表

SHOW TABLES;

查看錶的欄位資訊

DESC student;

在上面學生表的基礎上增加一個image列。

ALTER TABLE student ADD image blob;

修改address列,使其長度為60。

ALTER TABLE student MODIFY address varchar(60);

刪除image列,一次只能刪一列。

ALTER TABLE student DROP image;

表名改為user。

RENAME TABLE  student TO user;

查看錶的創建細節

SHOW CREATE TABLE user;

修改表的字符集為gbk

ALTER TABLE user CHARACTER SET gbk;charcter set

列名name修改為username

ALTER TABLE user CHANGE name username varchar(100);

2.5 DML操作(重要)

DML是對表中的數據進行增、刪、改的操作。不要與DDL混淆了。

主要包括:INSERT 、UPDATE、 DELETE

小知識:

在mysql中,字元串類型和日期類型都要用單引號括起來。

空值:null

(1)插入操作:INSERT:

​ 語法: INSERT INTO 表名(列名1,列名2 …)VALUES(列值1,列值2…);

​ 注意:列名與列值的類型、個數、順序要一一對應。

​ 可以把列名當做java中的形參,把列值當做實參。

​ 參數不要超出列定義的長度。

​ 如果插入空值,請使用null

​ 插入的日期和字元一樣,都使用單引號括起來。

SQL> CREATE TABLE student
(
   id INT NOT NULL,
   name VARCHAR(50),
   age INT,
   address VARCHAR(100)
);

一次添加一條數據

INSERT INTO student(id,name,age,address) values (1,'zhangsan',20,'北京海淀');
INSERT INTO student(id,name,age,address) values (2,'lisi',22,'上海浦東');
INSERT INTO student(id,name,age,address) values (3,'wangwu',23,'北京昌平');

一次添加多條數據

INSERT INTO student(id,name,age,address) values (4,'曹操',27,'北京海淀'),
											(5,'周瑜',28,'北京朝陽'),
											(6,'趙雲',30,'北京大興');

思考:命令行中為什麼不能添加中文數據?

命令行窗口默認字符集是GBK。MySQL默認是UTF8

小知識:

查看資料庫編碼的具體資訊

Show variables like 『character%』;

臨時更改客戶端和伺服器結果集的編碼

Set character_set_client=gbk;

Set character_set_results=gbk;

或者

SET  NAMES  『gbk』;  // client  connection results

(2)修改操作:UPDATE:

語法:UPDATE 表名 SET 列名1=列值1,列名2=列值2 … WHERE 列名=值

練習:

將所有學生的年齡修改為25。

UPDATE student SET age=25;

將id為』1』的地址修改為「河北保定」。

UPDATE student SET address='河北保定' WHERE id=1;

將姓名為』曹操’』的學生年齡改為50,地址改為”河南鄭州”』。

UPDATE student SET age=50, address='河南鄭州' WHERE name='曹操';

將所有學生的年齡加5歲。

UPDATE student SET age=age+5;  

(3)刪除操作:DELETE

語法 :

DELETE FROM 表名 【WHERE 列名=值】

練習 :

刪除表中名稱為』zhangsan』的記錄。

DELETE FROM student WHERE name=『zhangsan』;

刪除表中所有記錄。

DELETE FROM emp;

使用truncate刪除表中記錄。(先把表刪除,然後再創建空表)

TRUNCATE TABLE emp; truncate

  • DELETE 刪除表中的數據,表結構還在;刪除後的數據使用日誌可以找回。
  • TRUNCATE 刪除是把表直接DROP掉,然後再創建一個同樣的新表。
  • TRUNCATE 刪除的數據不能找回。執行速度比DELETE快。
2.6客戶端工具

使用命令雖然可以完成基本操作,為了更方便用戶操作和使用MySQL數據,市面上出現很多第三方的客戶端管理工具比如:SQLyog和Navicat

演示:SQLyog的使用

演示:Navicat的使用

第三節 DQL數據查詢(重點)

資料庫執行DQL語句不會對數據進行改變,而是讓資料庫發送結果集給客戶端。

查詢返回的結果集是一張虛擬表。

查詢關鍵字:SELECT

語法: SELECT 列名 FROM 表名 【WHERE –> GROUP BY–>HAVING–> ORDER BY–>LIMIT】

SELECT selection_list /*要查詢的列名稱*/

  FROM table_list /*要查詢的表名稱*/

  WHERE condition /*行條件*/

  GROUP BY grouping_columns /*對結果分組*/

  HAVING condition /*分組後的行條件*/

  ORDER BY sorting_columns /*對結果排序*/

  LIMIT offset_start, row_count /*結果限定*/

示例操作:

​ 1>創建學生表並添加數據

#創建表stu
CREATE TABLE stu (
	sid	CHAR(6),
	sname		VARCHAR(50),
	age		INT,
	gender	VARCHAR(50)
);
#添加數據
INSERT INTO stu VALUES('S_1001', 'liuYi', 35, 'male');
INSERT INTO stu VALUES('S_1002', 'chenEr', 15, 'female');
INSERT INTO stu VALUES('S_1003', 'zhangSan', 95, 'male');
INSERT INTO stu VALUES('S_1004', 'liSi', 65, 'female');
INSERT INTO stu VALUES('S_1005', 'wangWu', 55, 'male');
INSERT INTO stu VALUES('S_1006', 'zhaoLiu', 75, 'female');
INSERT INTO stu VALUES('S_1007', 'sunQi', 25, 'male');
INSERT INTO stu VALUES('S_1008', 'zhouBa', 45, 'female');
INSERT INTO stu VALUES('S_1009', 'wuJiu', 85, 'male');
INSERT INTO stu VALUES('S_1010', 'zhengShi', 5, 'female');
INSERT INTO stu VALUES('S_1011', 'xxx', NULL, NULL);

2>創建僱員表並添加數據

#創建僱員表
CREATE TABLE emp(
	empno		INT,
	ename		VARCHAR(50),
	job		VARCHAR(50),
	mgr		INT,
	hiredate	DATE,
	sal		DECIMAL(7,2),
	comm		decimal(7,2),
	deptno		INT
);
#添加數據
INSERT INTO emp values(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
INSERT INTO emp values(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
INSERT INTO emp values(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
INSERT INTO emp values(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
INSERT INTO emp values(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
INSERT INTO emp values(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);
INSERT INTO emp values(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);
INSERT INTO emp values(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20);
INSERT INTO emp values(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
INSERT INTO emp values(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);
INSERT INTO emp values(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20);
INSERT INTO emp values(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30);
INSERT INTO emp values(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20);
INSERT INTO emp values(7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);

3>創建部門表並添加數據

#創建部門表
CREATE TABLE dept(
	deptno		INT,
	dname		varchar(14),
	loc		varchar(13)
);
#添加數據
INSERT INTO dept values(10, '財務部', 'beijing');
INSERT INTO dept values(20, 'java開發部', 'tianjin');
INSERT INTO dept values(30, '測試部', 'shanghai');
INSERT INTO dept values(40, '銷售部', 'shenzheng');

3.1 簡單查詢

查詢所有列 *表示所有列

SELECT * FROM stu;

查詢指定列

SELECT sid, sname, age FROM stu;

3.2 條件查詢

條件查詢就是在查詢時給出WHERE子句,在WHERE子句中可以使用如下運算符及關鍵字:

比較運算符

l =、!=、<>、<、<=、>、>=;

l BETWEEN…AND;

l IN(set);

l IS NULL;

關係運算符

l AND; &&

l OR; ||

l NOT; !

算術運算符:

+  -  *  /  %

(1)查詢性別為女,並且年齡小於50的記錄

SELECT * FROM stu WHERE gender='female' AND age<50;

(2)查詢學號為S_1001,或者姓名為liSi的記錄

SELECT * FROM stu WHERE sid ='S_1001' OR sname='liSi';

(3)查詢學號為S _ 1001 ,S _ 1002,S _ 1003的記錄

SELECT * FROM stu 
WHERE sid IN ('S_1001','S_1002','S_1003');
等同於
SELECT * FROM stu 
WHERE sid='S_1001' or sid='S_1002' or sid='S_1003';

(4)查詢學號不是S_1001,S_1002,S_1003的記錄

SELECT * FROM tab_student 
WHERE sid NOT IN('S1001','S1002','S_1003');

(5)查詢年齡為null的記錄

SELECT * FROM stu WHERE age IS NULL;

(6)查詢年齡在20到40之間的學生記錄

SELECT * 
FROM stu
WHERE age>=20 AND age<=40;

或者

SELECT * 
FROM stu 
WHERE age BETWEEN 20 AND 40;

(7) 查詢性別非男的學生記錄

SELECT * 
FROM stu
WHERE gender!='male';

或者

SELECT * 
FROM stu
WHERE gender<>'male';

或者

SELECT * 
FROM stu
WHERE NOT gender='male';

(8) 查詢姓名不為null的學生記錄

SELECT * 
FROM stu
WHERE NOT sname IS NULL;

或者

SELECT * 
FROM stu
WHERE sname IS NOT NULL;

3.3 模糊查詢

當想查詢姓名中包含a字母的學生時就需要使用模糊查詢了。模糊查詢需要使用關鍵字LIKE。

通配符:

​ _ 任意一個字元

​ %:任意0~n個字元

‘張%’ —》張三丰 張三 張無忌

‘李_’ —>李四 李逵 李剛

(1)查詢姓名由3個字元構成的學生記錄

SELECT * 
FROM stu
WHERE sname LIKE '___';

模糊查詢必須使用LIKE關鍵字。其中 「」匹配任意一個字母,5個「」表示5個任意字母。

(2)查詢姓名由5個字元構成,並且第5個字元為「i」的學生記錄

SELECT * 
FROM stu
WHERE sname LIKE '____i';

(3)查詢姓名以「z」開頭的學生記錄

SELECT * 
FROM stu
WHERE sname LIKE 'z%';

其中「%」匹配0~n個任何字元。

(4)查詢姓名中第2個字元為「i」的學生記錄

SELECT * 
FROM stu
WHERE sname LIKE '_i%'; 

(5)查詢姓名中包含「a」字元的學生記錄

SELECT * 
FROM stu
WHERE sname LIKE '%a%';

3.4 欄位控制查詢

(1)去除重複記錄

去除重複記錄(兩行或兩行以上記錄中列的數據都相同),例如emp表中sal欄位就存在相同的記錄。當只查詢emp表的sal欄位時,那麼會出現重複記錄,那麼想去除重複記錄,需要使用DISTINCT:

SELECT DISTINCT sal FROM emp;
SELECT DISTINCT sal,comm FROM emp;

(2)查看僱員的月薪與傭金之和

  因為sal和comm兩列的類型都是數值類型,所以可以做加運算。如果sal或comm中有一個欄位不是數值類型,那麼會出錯。

SELECT *,sal+comm FROM emp;

字元串的合併不能使用+ ,使用concat(ename,'____',job);
select *,concat(ename,'______',job) from emp;

comm列有很多記錄的值為NULL,因為任何東西與NULL相加結果還是NULL,所以結算結果可能會出現NULL。下面使用了把NULL轉換成數值0的函數IFNULL:

SELECT *,sal+IFNULL(comm,0) FROMemp;

(3)給列名添加別名

在上面查詢中出現列名為sal+IFNULL(comm,0),這很不美觀,現在我們給這一列給出一個別名,為total:

SELECT *, sal+IFNULL(comm,0) AS total FROM emp;

給列起別名時,是可以省略AS關鍵字的:

SELECT *,sal+IFNULL(comm,0)  total FROM emp;

3.5 排序

(1) 查詢所有學生記錄,按年齡升序排序

SELECT *
FROM stu
ORDER BY age ASC;

或者

SELECT *
FROM stu
ORDER BY age;

(2) 查詢所有學生記錄,按年齡降序排序

SELECT *
FROM stu
ORDER BY age DESC;

(3) 查詢所有僱員,按月薪降序排序,如果月薪相同時,按編號升序排序

SELECT * FROM emp
ORDER BY sal DESC,empno ASC; 

3.6 聚合函數

聚合函數是用來做縱向運算的函數:

l COUNT():統計指定列不為NULL的記錄行數;

l MAX():計算指定列的最大值,如果指定列是字元串類型,那麼使用字元串排序運算;

l MIN():計算指定列的最小值,如果指定列是字元串類型,那麼使用字元串排序運算;

l SUM():計算指定列的數值和,如果指定列類型不是數值類型,那麼計算結果為0;

l AVG():計算指定列的平均值,如果指定列類型不是數值類型,那麼計算結果為0;

(1) COUNT

當需要縱向統計時可以使用COUNT()。

l 查詢emp表中記錄數:

SELECT COUNT(*) AS 『cnt』 FROM emp;

l 查詢emp表中有傭金的人數:

SELECT COUNT(comm) 『cnt』 FROM emp;

注意,因為count()函數中給出的是comm列,那麼只統計comm列非NULL的行數。

l 查詢emp表中月薪大於2500的人數:

SELECT COUNT(*) FROM emp
WHERE sal > 2500;

l 統計月薪與傭金之和大於2500元的人數:

SELECT COUNT(*) AS cnt FROM emp WHERE sal+IFNULL(comm,0) > 2500;

l 查詢有傭金的人數,以及有領導的人數:

SELECT COUNT(comm), COUNT(mgr)FROM emp;

(2) SUM和AVG

當需要縱向求和時使用sum()函數。

l 查詢所有僱員月薪和:

SELECT SUM(sal) FROM emp;

l 查詢所有僱員月薪和,以及所有僱員傭金和:

SELECT SUM(sal), SUM(comm) FROMemp;

l 查詢所有僱員月薪+傭金和:

SELECT SUM(sal+IFNULL(comm,0))FROM emp;

l 統計所有員工平均工資:

SELECT AVG(sal) FROM emp;

(3) MAX和MIN

l 查詢最高工資和最低工資:

SELECT MAX(sal), MIN(sal) FROM emp;

3.7 分組查詢

當需要分組查詢時需要使用GROUP BY子句,例如查詢每個部門的工資和,這說明要使用部分來分組。

註:凡是和聚合函數同時出現的列名,則一定要寫在group by 之後

3.7.1 分組查詢

l 查詢每個部門的部門編號和每個部門的工資和:

SELECT deptno, SUM(sal)
FROM emp
GROUP BY deptno;

l 查詢每個部門的部門編號以及每個部門的人數:

SELECT deptno,COUNT(*)
FROM emp
GROUP BY deptno;

l 查詢每個部門的部門編號以及每個部門工資大於1500的人數:

SELECT deptno,COUNT(*)
FROM emp
WHERE sal>1500
GROUP BY deptno;

3.7.2 HAVING子句

l 查詢工資總和大於9000的部門編號以及工資和:

SELECT deptno, SUM(sal)
FROM emp
GROUP BY deptno
HAVING SUM(sal) > 9000;

​ 註:having與where的區別:

1.having是在分組後對數據進行過濾,where是在分組前對數據進行過濾             

​ 2.having後面可以使用分組函數(統計函數)

​ where後面不可以使用分組函數。

​ where是對分組前記錄的條件,如果某行記錄沒有滿足WHERE子句的條件,那麼這行記錄不會參加分組;而 having是對分組後數據的約束。

3.8 LIMIT限制

LIMIT用來限定查詢結果的起始行,以及總行數。

1查詢前5行記錄,起始行從0開始

SELECT * FROM emp LIMIT 0, 5;

注意,起始行從0開始,即第一行開始!

2查詢10行記錄,起始行從3開始

SELECT* FROM emp LIMIT 3, 10;

3.8.1分頁查詢

如果一頁記錄為10條,希望查看第3頁記錄應該怎麼查呢?

l 第一頁記錄起始行為0,一共查詢10行;

l 第二頁記錄起始行為10,一共查詢10行;

l 第三頁記錄起始行為20,一共查詢10行;

總結查詢

​ 查詢語句書寫順序:select 列 from 表 【where- group by- having- order by-limit】

​ 查詢語句執行順序:from 表 where -group by -having – select – order by-limit

總結

1 資料庫:存儲數據的倉庫。

2 資料庫管理系統: MySQL Oracle SQL Server DB2

3 MySQL安裝、卸載

4 SQL語句:

​ DDL 數據定義語言 創建庫,創建表

​ DML數據操做語言 添加 刪除 更新 insert delete udpate

​ DQL 數據查詢語言 select

​ DCL 數據控制語言, 用戶的創建 許可權分配。

5 DQL

​ 簡單查詢 select 列名 from 表名

​ 條件查詢 where 運算符 = != <> > >= < <= in between and 、 and or not + – * / %

​ 模糊查詢 通配符 _表示一個字元 %表示任意多個字元

​ 欄位控制 distinct 去重 合併 concat 別名 as

​ 排序 order by

​ 聚合函數 count sum max min avg

​ 分組查詢 group by having

​ limit 限制查詢 分頁