MySQL之復雜查詢的實現
1.排序
ORDER BY 子句來設定哪個字段哪種方式來進行排序,再返回搜索結果。
desc:降序
select * from blog order by balance desc;
asc:升序,默認,可不寫
select * from blog order by balance asc;
多字段排序
update blog set age = 25 where age < 25;
先根據年齡升序,再根據餘額降序
select * from blog order by age asc, balance desc;
2.分組
GROUP BY 語句根據一個或多個列對結果集進行分組。
新建員工表
CREATE TABLE `employee` ( `id` int NOT NULL, `name` varchar(20) NOT NULL DEFAULT '', `identity` varchar(20) NOT NULL DEFAULT '', `signin` tinyint NOT NULL DEFAULT '0' COMMENT '打卡次數', `date` date NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB;
插入數據
INSERT INTO `employee` VALUES ('1', '小明', 'firemen', 3, '2022-02-21'), ('2', '小王', 'doctor', 3, '2022-02-21'), ('3', '小麗', 'police', 3, '2022-02-21'), ('4', '小王', 'doctor', 2, '2022-02-22'), ('5', '小明', 'firemen', 1, '2022-02-22'), ('6', '小麗', 'police', 3, '2022-02-22'), ('7', '小明', 'firemen', 2, '2022-02-23'), ('8', '小王', 'doctor', 2, '2022-02-23'), ('9', '小紅', 'nurse', 3, '2022-02-23');
統計每人打卡記錄數
SELECT name, COUNT(*) FROM employee GROUP BY name;
WITH ROLLUP 可以實現在分組統計數據基礎上再進行相同的統計(SUM,AVG,COUNT…)
統計每人打卡總數
SELECT name, SUM(signin) as signin_count FROM employee GROUP BY name WITH ROLLUP;
其中記錄 NULL 表示所有人的登錄次數。
使用 coalesce 來設置一個可以取代 NUll 的名稱
coalesce 語法:select coalesce(a,b,c);
SELECT name, SUM(signin) as signin_count FROM employee GROUP BY name WITH ROLLUP;
3.聯合查詢
UNION 操作符用於連接兩個以上的 SELECT 語句的結果組合到一個結果集合中。
UNION ALL:返回所有結果集,包含重復數據。
select author from blog UNION ALL select identity from employee;
報錯:Illegal mix of collations for operation ‘UNION’
原因:相同字段的編碼不一致造成的
解決:修改blog表的author字段
alter table blog modify `author` varchar(40) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '';
UNION DISTINCT: 刪除結果集中重復的數據。默認,可不寫
select author from blog UNION select identity from employee;
4.多表連接
INNER JOIN(內連接,或等值連接):獲取兩個表中字段匹配關系的記錄。 LEFT JOIN(左連接):獲取左表所有記錄,即使右表沒有對應匹配的記錄。 RIGHT JOIN(右連接): 與 LEFT JOIN 相反,用於獲取右表所有記錄,即使左表沒有對應匹配的記錄。
內連接
INNER 可以省略
select b.author, b.age, b.title, e.name, e.signin from blog b INNER JOIN employee e on b.author = e.identity;
where條件實現內連接效果
select b.author, b.age, b.title, e.name, e.signin from blog b,employee e where b.author = e.identity;
左連接:讀取左邊數據表的全部數據,即便右邊表無對應數據。
select b.author, b.age, b.title, e.name, e.signin from blog b LEFT JOIN employee e on b.author = e.identity;
右連接:讀取右邊數據表的全部數據,即便左邊邊表無對應數據。
select b.author, b.age, b.title, e.name, e.signin from blog b RIGHT JOIN employee e on b.author = e.identity;
到此這篇關於MySQL之復雜查詢的實現的文章就介紹到這瞭,更多相關MySQL 復雜查詢內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!