1. 程式人生 > >MySQL聚合函式、模糊查詢和約束

MySQL聚合函式、模糊查詢和約束

聚合函式
聚合函式也叫組函式,在一個行的集合(一組行)上進行操作,並對每個組給予一個結果.
常用的聚合函式:
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.WHEREHAVING的區別: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將自動建立索引.