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 -pc:\>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 限制查詢 分頁