MySQL聚合函式、模糊查詢和約束
阿新 • • 發佈:2019-01-04
聚合函式
聚合函式也叫組函式,在一個行的集合(一組行)上進行操作,並對每個組給予一個結果.
常用的聚合函式:
AVG:求平均值
COUNT:統計行的數量
MAX:求最大值
MIN:求最小值
SUM:求合
ORDER BY:對記錄進行升序或者降序(預設升序)
GROUP BY:將記錄中的資料按照條件進行分組
HAVING:對分組後的記錄進行篩選
準備工作:建立一個員工表,欄位分別為員工編號、姓名、領導編號、薪資、佣金、部門編號.
-- 員工表
CREATE TABLE employee (
empno INT,
ename varchar(100),
mgr INT,
sal DOUBLE ,
comm DOUBLE DEFAULT NULL,
deptno INT
);
-- 新增資料
INSERT INTO employee VALUES(1,'劉一',10,800,null,20),
(2,'陳二',20,4500,550,20),
(3,'張三',30,9600,1000,10),
(4,'李四',40,800,null,30),
(5,'王五',50,600,7000,10),
(6,'趙六',60,850,null,20),
(7,'孫七',70,752,null,30);
-- 檢視薪金和佣金之和
SELECT sal,comm,sal + comm AS total FROM employee;
-- 過濾空值 如果該值是空的 就當做0來處理
SELECT sal,comm,sal + IFNULL(comm,0) AS total FROM employee;
-- 按薪金排序(預設是升序的) ASC升序
SELECT * FROM employee ORDER BY sal DESC;
-- 查詢所有僱員,按月薪降序排序,如果月薪相同時,按編號降序排序
SELECT * FROM employee ORDER BY sal DESC,empno DESC;
-- 查詢表的記錄數
SELECT COUNT(*) FROM employee;
-- 查詢佣金的記錄數
-- count(欄位)查詢的是不為空的記錄數
SELECT COUNT(comm),COUNT(sal) FROM employee;
-- 查詢emp表中月薪大於2500的人數:
SELECT COUNT(*) FROM employee WHERE sal > 2500;
-- 統計月薪與佣金之和大於2500元的人數:
SELECT COUNT(*) FROM employee WHERE sal + IFNULL(comm,0)> 2500;
-- 查詢有佣金的人數,有領導的人數:
SELECT COUNT(comm),COUNT(mgr) FROM employee;
-- 查詢薪金總和
SELECT SUM(sal) FROM employee;
-- 查詢所有僱員月薪和,以及所有僱員佣金和:
SELECT SUM(sal),SUM(comm) FROM employee;
-- 查詢所有僱員月薪+佣金和:
SELECT SUM(sal+IFNULL(comm,0)) FROM employee;
-- 統計所有員工平均工資:
SELECT AVG(sal + IFNULL(comm,0)) FROM employee;
-- 查詢最高和最低工資
SELECT MAX(sal),MIN(sal) FROM employee;
-- 查詢每個部門的部門編號和每個部門的工資和
-- 注意:分組查詢時 查詢的欄位必須是 分組的欄位(記錄數要對應)
SELECT deptno,SUM(sal) FROM employee GROUP BY deptno;
-- 查詢每個部門的部門編號以及每個部門的人數
SELECT deptno,count(*) FROM employee GROUP BY deptno;
-- 查詢每個部門的部門編號以及每個部門工資大於1500的人數:
SELECT deptno,count(*) FROM employee WHERE sal > 1500 GROUP BY deptno ;
-- 查詢工資總和大於9000的部門編號以及工資和:
SELECT deptno,SUM(sal) AS total FROM employee WHERE sal > 1500 GROUP BY deptno HAVING total > 9000;
-- 分頁查詢
-- LIMIT 引數1:代表起始頁 引數二:代表總共要顯示幾條記錄
SELECT * FROM employee LIMIT 3,3;
總結:
1.當使用組函式的select語句中沒有group by子句時,中間結果集中的所有行自動形成一組,然後計算組函式;
2.組函式不允許巢狀,例如:COUNT(MAX(…));
3.組函式的引數可以是列或者是函式表示式;
4.一個SELECT子句中可出現多個聚集函式.
5.WHERE和HAVING的區別:1.WHERE是分組前的條件,HAVING是分組後再進行篩選.2.WHERE後面不能
跟函式,而HAVING可以.
模糊查詢
%代表0-n個字元
_代表 1個字元
語法:SELECT * FROM 表名 WHERE 欄位名 LIKE '要查詢的關鍵字';
例子:
SELECT * FROM employee WHERE ename LIKE '張%';//多個字元
SELECT * FROM employee WHERE ename LIKE '張_';//兩個字元
這兩行程式碼的作用都是在employee表中對所有的ename欄位名進行搜尋.
如果是要所搜帶張的字:'%張%'
約束
-- 建立一個student表 id(主鍵) name
-- 插入兩條資料
-- 在建立表的時候 新增主鍵 可以保證資料的完整性
-- 主鍵的特點:1.唯一 2.不能是空的
CREATE TABLE student (
id INT PRIMARY KEY,
name VARCHAR(100)
);
-- 新增資料
INSERT INTO student VALUES(1,'a'),(2,'b');
注意:如果給id加上主鍵約束後,給id欄位新增null就會報錯.例如:INSERT INTO student
VALUES(null,'c');這種寫法是錯的
-- 建立主鍵約束方式二
CREATE TABLE student1 (
id int,
name VARCHAR(100),
PRIMARY KEY(id)
);
-- 方式二的好處 可以新增聯合主鍵
-- 新增聯合主鍵
-- 聯合主鍵不完全一樣 都可以插入到資料庫中
CREATE TABLE student2 (
classid int,
stuid int,
name VARCHAR(100),
PRIMARY KEY(classid, stuid)
);
INSERT INTO student2 VALUES (1,1,'a'),(1,2,'a'),(2,1,'a'),(2,2,'a');
注意:此時再新增INSERT INTO student2 VALUES (1,1,'c');的話就會報錯,因為1,1已經存在了.
-- 建立主鍵約束方式三
CREATE TABLE student3 (
id INT,
name VARCHAR(100)
);
-- 通過修改表結構 新增主鍵約束
ALTER TABLE student3 ADD CONSTRAINT PRIMARY KEY (id);
-- 唯一約束(不能重複),可以有空值
CREATE TABLE student4 (
id int PRIMARY KEY,
name VARCHAR(100) UNIQUE
);
INSERT INTO student4 VALUES (1,'a');
INSERT INTO student4 VALUES (2,'a');//錯誤的
INSERT INTO student4 VALUES (3,null);//正確的
INSERT INTO student4 (id)VALUES (4);//正確的
-- 自動增長列
CREATE TABLE student5 (
id int PRIMARY KEY auto_increment,
name VARCHAR(100) UNIQUE
);
-- 主鍵插入空值
INSERT INTO student5 VALUES(null,'a');
注意:一般自動增長和主鍵是一起用的,同時存在的話,這時候id欄位新增null是不會報錯的,id會自動
增長.如果刪除某幾條記錄,繼續新增資料的話,id會按照原來順序繼續增長,但是可以手動新增已經被刪
除的id.
-- 域完整性 限制單元格的資料內容
-- not null(值不能為空) 和 default(預設值)
CREATE TABLE student6 (
id int,
name VARCHAR(100) NOT NULL,
gender VARCHAR(10) DEFAULT '男'
);
INSERT INTO student6 (id,name) VALUES(1,'a');
注意:如果欄位設定了NOT NULL,那麼新增資料的時候是必填的,如果是欄位設定了default,那麼可以
不填,不填的話就是你自己寫的預設值,如果預設值設定為NULL的話就不要加單引號了.
-- 引用完整性(外來鍵約束 讓表與表之間通過欄位建立聯絡)
-- 主表
CREATE TABLE student7 (
sid INT PRIMARY key,
name VARCHAR(100)
);
-- 從表
CREATE TABLE score (
sid INT,
score INT,
-- 建立外來鍵約束 建立表聯絡
-- FOREIGN KEY(當前表的欄位)
CONSTRAINT fk_score_sid FOREIGN KEY(sid) REFERENCES student7(sid)
// 語法:CONSTRAINT 自己起的名字 FOREIGN KEY(本表中要設定的外來鍵約束欄位)
// REFERENCES 要參照的表名(參照表名的欄位)
);
注意:外來鍵列和參照列必須具有想死的資料型別,其中數字的長度或是否有符號位必須相同,而字元的長度
則可以不同.外來鍵列和參照列必須建立索引,如果外來鍵列不存在索引的話,MySQL將自動建立索引.