首頁 > 軟體

MySQL之複雜查詢的實現

2022-02-18 13:04:44

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 複雜查詢內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com