今天主要學習聚合函數&表約束
思維導圖:
一.模糊查詢(LIKE)
1.概念:模糊查詢是指在一個字段中,進行自定義搜索匹配查詢,而不是全內容匹配。
2.模糊查詢語法
SELECT * FROM 表名 WHERE 字段名 LIKE ‘查詢語法’;
3.MYSQL模糊查詢語法:
LIKE |
% |
_ |
表示模糊查詢 |
表示爲任意多個字符 |
表示爲單個字符 |
示例:
-- 查詢班級當中所有姓馬的同學
SELECT * FROM stu WHERE name LIKE '馬%';
-- 查詢班級當中所有姓馬的,且名字在兩個字符的同學
SELECT * FROM stu WHERE name LIKE '馬_';
-- 查詢班級當中所有名字爲兩個字符的學生
SELECT * FROM stu WHERE name LIKE '__';
-- 查詢班級當中,所有名字當中包含化字的學生
SELECT * FROM stu WHERE name LIKE '%化%';
二.聚合查詢
1.概念:我們之前所有的查詢都是橫向查詢,都一行一行的進行判斷,比如我們要查詢所有學生的JAVA成績的平均分,因爲我們每一次的查詢結果是一行,就沒有辦法做到全表的結果查詢。這個時候我們就需要使用縱向查詢(聚合查詢),就是將表的全部數據查出來之後,在進行二次統計。
2.聚合函數的分類
(1)MAX():獲取查詢後結果的最大值
SELECT MAX(java) FROM stu;
(2)MIN():獲取查詢後結果的最小值
SELECT MIN(java) FROM stu;
(3)AVG():獲取查詢後結果的平均值
SELECT AVG(java) AS 'JAVA平均分' FROM stu;
(4)SUM():獲取查詢後結果的總和值
SELECT SUM(java) FROM stu;
(5)COUNT():獲取查詢後結果的總記錄數
方式一:不建議因爲這種查詢是泛查詢,會查詢表中的所以記錄 數據越多,性能越低
SELECT COUNT(*) FROM stu;
方式二:建議,一般做統計查詢的時候,我們儘量選擇非業務主鍵做爲參考,因爲主鍵唯一且必須會存在,單列查詢 提高效率。
SELECT COUNT(id) FROM stu;
一般我們在使用統計函數的時候,要注意一個問題,使用泛查詢(*),和使用列查詢(id),是有區別的。
使用泛查詢會記錄我們的空值列(NULL)
使用列查詢則不會記錄我們的空值列
如果,我想讓列查詢,也同樣去記錄我們的空值列,怎麼辦呢??
由於單列統計不計算空值,所以如果需要統計空值 可以使用IFNULL進行空值判斷填充
SELECT COUNT(IFNULL(id,0)) FROM stu;
(6)聚合函數可以連串使用
SELECT SUM(java)/COUNT(id) FROM stu;
三.分頁查詢(LIMIT)
1.概念:一般我們在處理一個查詢或者搜索業務的時候,並不會一瞬間將該搜索的內容全部同時展示,因爲這種方式會極大的影響用戶的體驗度,同時會給自己的數據庫端和後端以及前端造成極大運算壓力,一般我們會將這種業務進行分頁處理。
2.分頁關鍵字:LIMIT(MYSQL方言)
SELECT * FROM 表 LIMIT 參數1,參數2;
參數1:從第幾條數據開始查詢(默認從0開始記錄)
參數2:一次查詢多少條
代碼示例
-- 每次查詢2條數據 第一頁 1-2
SELECT * FROM stu LIMIT 0,2;
-- 第二頁 3-4
SELECT * FROM stu LIMIT 2,2;
-- 第二頁 5-6
SELECT * FROM stu LIMIT 4,2;
3.分頁的計算規則
在一般的實際開發當中,第一個參數決定了真正的頁碼的切換,所有這個值應該動態
SELECT * FROM stu LIMIT (當前頁碼-1)*每一頁的條數,2;
四.排序查詢(ORDER BY)
1.概念:在實際的業務開發當中,我們很多其實雜亂的,一般在顯示的時候,我們會這一系列具備排序規則的數據進行排序展示。
淘寶的價格從低到高
淘寶的銷量從高到底
2.關鍵字:排序查詢主要依賴於ORDER BY關鍵字,這個關鍵字可以對數值類型的字段進行降序和升序排列,不會影響數據值 只會影響虛擬表的顯示。
ASC:升序(默認)
DESC:降序
3.單列排序(針對一個列進行單詞排序)
-- 按照java成績從低到高進行排序
SELECT * FROM stu ORDER BY java;
-- 按照java成績從高到低進行排序
SELECT * FROM stu ORDER BY java DESC;
4.組合排序(當第一個列數值一致的時候,可以組合N個列進行第N次排序)
-- 當JAVA成績一致的時候,則按照id進行第二次排序
SELECT * FROM stu ORDER BY java DESC,id ASC;
五.分組查詢(GROUP BY)
1.概念:分組查詢是指查詢後將結果進行分組,分組後可以對每組的數據進行單獨的統計。
需要統計每個地區有多少人
錯誤語法: SELECT address,COUNT(*)FROM stu;
正確語法: SELECT address,COUNT(*)FROM stu GROUP BY address;
-- 分組查詢(一旦使用了分組查詢就可以配合使用聚合函數,但是這個聚合函數的字段必須是分組字段本身)111
SELECT address,COUNT(*)FROM stu GROUP BY address;
-- 需要統計男女人數的數量
SELECT sex,COUNT(id) FROM stu GROUP BY sex;
-- 需要統計男女人數的數量(不統計爲空的數據)
SELECT sex,COUNT(id) FROM stu WHERE sex IS NOT NULL AND sex <> '' GROUP BY sex;
-- 需要統計地區人數大於2個人數的地區
-- 1.查詢哪些地區有多少人
-- 2.對這些地區分組
-- 3.多分組進行限制顯示
-- 注意:HAVING只能配合GROUP BY使用,而且可以使用統計函數
SELECT address,COUNT(*) FROM stu GROUP BY address HAVING COUNT(*) >= 2;
2.MYSQL的常用字段類型
- char(20)
- varchar(20)
- int
- date
- datetime
- timestamp
3.char 和 varchar的區別
(1)char是固定字符串,不管你實際存儲的數據大小是多少,佔用空間仍然char所設定的空間大小
(2)varchar是可變字符串,存儲數據的大小有實際存儲字符串的大小決定,自由縮放。
4.int 和 int(5)的區別
(1)int的默認長度爲11位,實際的存儲大小是由你存儲的數據決定
(2)int(5),是固定5個長度的容器
5.請問date、datetime、timestamp的區別是什麼
(1)date代表的是一個日期,且不包含時間
(2)datetime代表的是一個日期+時間
(3)timestamp代表的是一個當前時間的時間戳
六.表約束
1.概念:所謂的表約束其實就是對錶的數據進行限制,保證數據的準確性、有效性、完整性。如果我們給一張設定了指定約束,那麼數據在插入的時候違法了我們的約束就可以限制插入。
2.約束的種類
約束名 |
約束的關鍵字 |
默認值約束 |
default |
非空約束 |
not null |
唯一約束 |
unique |
主鍵約束 |
primary key(pk) |
外鍵約束 |
foreign key(fk) |
檢查約束 |
check(mysql不支持) |
3.默認值約束[DEFAULT]
當給一個字段進行默認值約束的時候,如果這個字段沒有數據的插入 則自動填充我們設置好的默認值
CREATE TABLE test(
name VARCHAR(20),
sex VARCHAR(20) DEFAULT '男'
);
4.非空約束[NOT NULL]
當給一個字段進行非空約束的時候,如果字段沒有數據或者是NULL則無法插入,空字符無法控制
CREATE TABLE test(
name VARCHAR(20) NOT NULL,
sex VARCHAR(20)
);
5.唯一值約束[UNIQUE]
當給一個字段設定唯一值約束的是,則這個字段在表中不能出現重複數據;唯一約束是允許插入多個null的,所以唯一約束不能限制null值。
CREATE TABLE test(
id INT UNIQUE,
name VARCHAR(20),
sex VARCHAR(20)
);
6.主鍵約束[PRIMARY KEY]
(1)主鍵約束的作用:其實就是用於來標識數據庫數據的每一條記錄。
(2)主鍵一般設置在哪個字段?
主鍵的設置一般不使用任何的業務字段,所以在設計表的時候,我們通常會建立一個ID的字段,這個字段沒有任何的業務意圖,主要是給我們數據庫和程序員使用的,不直接面對用戶,所以這個ID是沒有任何的實際含義,只要不唯一、非空就可以,其作用是標識每一條數據的狀態。
(3)主鍵約束語法
CREATE TABLE test(
id INT PRIMARY KEY, -- 主鍵約束
);
(4)主鍵約束的限制
.可以限制字段不爲空
.可以限制字段唯一
.一張表只能存在一個主鍵
.我們可以在創建主鍵之後繼續刪除和添加(但是不建議)
#### 在已創建表中添加主鍵約束
ALTER TABLE 表名 ADD PRIMARY KEY(主鍵字段);
ALTER TABLE test ADD PRIMARY KEY(id);
在已創建表中刪除主鍵約束
ALTER TABLE 表名 DORP PRIMARY KEY;
ALTER TABLE test ADD PRIMARY KEY;
7.自增長約束[auto_increment]
主鍵情況下,我們手動添加很有可能造成數據重複,這個時候我們可以使用自增長約束,每一次插入數據的時候,數據庫自動在主鍵的基礎上+1,保證數據唯一值.
(1)自增長約束語法
CREATE TABLE test(
id INT PRIMARY KEY auto_increment, -- 自增長約束
);
(2)自增長約束注意問題:
<1>自增長約束的字段類型必須爲整數類型
<2>自增長字段一般爲主鍵字段
<3>自增長字段從0開始增長,如果需要修該增長開始位置,可以修該爲auto_increment = xxx;
8.外鍵約束
(1)外鍵約束的作用:
外鍵約束一般也只能存在兩張相關聯的表的情況下,對主表(主鍵表)和從表(外鍵表)進行關聯約束.
(2)什麼情況下才會有兩張以上的表呢?
例如下圖的表數據:
發現幾個問題:
- 員工對應的部門數據極度冗餘
- 會損耗查詢效率,浪費內存
- 不利於維護,萬一冗餘字段發生了變化,維護成本極高。
如何解決?
單獨將部門拆分出來,然後生成一個部門表,員工表和部門表產生關聯。
閱讀如下代碼
-- 創建員工表
CREATE TABLE emp(
id INT PRIMARY KEY auto_increment,
name VARCHAR(20),
dept_id INT
)
-- 創建一個部門表
CREATE TABLE dept(
id INT PRIMARY KEY auto_increment,
name VARCHAR(20)
);
INSERT INTO dept(name) VALUES ('基礎平臺架構部'),('基礎平臺測試部');
INSERT INTO emp(name,dept_id) VALUES ('李彥宏',4);
我們現在新增數據,在部門的字段插入一個ID爲4的部門
但是,實際上公司根本就沒有這個部門(如果實際業務當中,也算非常嚴重的事故)
這個時候,我們就應該使用兩張表同時限制,主鍵限制外鍵
如何限制?
語法:
CONSTRAINT 外鍵名 FOREIGN KEY(子表外鍵字段名) REFERENCES 主表名(主表主鍵字段名)
CONSTRAINT emp_dept_fk FOREIGN KEY(dept_id) REFERENCES dept(id)
實例代碼:
CREATE TABLE emp(
id INT PRIMARY KEY auto_increment,
name VARCHAR(20),
dept_id INT,
CONSTRAINT emp_dept_fk FOREIGN KEY(dept_id) REFERENCES dept(id)
);
INSERT INTO emp (name,dept_id ) VALUES('toobug',1),
('王自如',2),
('馬化騰',1),
('雷軍',2),
('求伯君',2),
('馬雲',1);
INSERT INTO emp(name,dept_id) VALUES ('李彥宏',4); -- 增加違反了外界約束
UPDATE emp SET dept_id = 5 WHERE id = 1; -- 修改違反外鍵約束
DELETE FROM dept; -- 因爲部門表已經存在了外鍵數據,如果需要刪除則需要先情況所有管理的外鍵數據。
9.外鍵在什麼情況下,會進行約束
(1)插入數據:往從表插入主表不存在的數據,外鍵會進行約束
(2)修改數據:往從表修改主表不存在的數據,外鍵會進行約束
(3)修改數據:刪除主表數據,存在外鍵關聯的時候,外鍵會進行約束