MySQL學習歷程(六):各種查詢

1、基本查詢語句

SELECT * FROM tb_name;//返回表tb_name的所有字段
SELECT id, name FROM tb_name;//返回指定的兩個字段
SELECT id, name FROM tb_name WHERE name = "simon";//返回滿足條件的指定字段

IN 表示一個集合;BETWEEN AND表示兩個值之間

SELECT * FROM stu WHERE stu_id IN(8000609050, 8000609051, 8000609053);//stu_id在集合裏的返回
SELECT * FROM stu WHERE stu_id NOT IN(8000609050, 8000609051, 8000609053);
SELECT * FROM stu WHERE stu_id IN(8000609050, 8000609051) ORDER BY name;//再按名字升序排序
SELECT * FROM fruits WHERE price BETWEEN 2.0 AND 10.0;//在兩個值之間的返回
SELECT * FROM fruits WHERE price NOT BETWEEN 2.0 AND 10.0;//不在兩個值之間

LIKE通配符查詢,“%”匹配任意長度的字符,“_”匹配單個字符

SELECT * FROM stu WHERE name LIKE "z%";//滿足name以z開頭
SELECT * FROM stu WHERE name LIKE "z%a";//滿足name以z開頭,以a結尾
SELECT * FROM stu WHERE name LIKE "%y";//滿足name以y結尾
SELECT * FROM stu WHERE name LIKE "a_";//滿足name只有兩個字符,並且a是第一個

AND、OR組合條件查詢

SELECT * FROM tb_name WHERE name IS NULL;//判空的時候用IS NULL
SELECT * FROM tb_name WHERE name IS NOT NULL;
SELECT * FROM tb_name WHERE name IS NOT NULL AND stu_id IN(8000609050, 8000609053);
SELECT * FROM tb_name WHERE name IS NOT NULL OR stu_id IN(8000609050, 8000609053);
SELECT DISTINCT * FROM fruits WHERE price BETWEEN 2.0 AND 10.0;//DISTINCT刪除重複結果

ORDER BY查詢結果排序,默認升序,ASC關鍵字是升序,DESC關鍵字是降序。

SELECT * FROM tb_name ORDER BY price;//默認升序排列
SELECT * FROM tb_name ORDER BY name, price;//先按name升序排序,name相同的再按price升序排序
SELECT * FROM tb_name ORDER BY price DESC; //指定降序
SELECT * FROM tb_name ORDER BY price ASC; //指定升序
SELECT * FROM tb_name ORDER BY name ASC, price DESC;//先按name升序排序,name相同的再按price降序排序

GROUP BY分組查詢是對數據按照某個或多個字段進行分組。

SELECT s_id, COUNT(*) AS total FROM fruits GROUP BY s_id;//對s_id進行分組,然後統計每個分組的行數
SELECT s_id, GROUP_CONCAT(f_name) AS names FROM fruits GROUP BY s_id;//對s_id進行分組,顯示每個分組裏的f_name。
SELECT s_id, GROUP_CONCAT(f_name) AS names 
FROM fruits 
GROUP BY s_id HAVING COUNT(f_name) > 2;//對s_id進行分組,顯示分組f_name數量大於2的分組
SELECT s_id, COUNT(*) AS total FROM fruits GROUP BY s_id WITH ROLLUP;//ROLLUP增加一行,統計記錄總和
SELECT * FROM fruits GROUP BY s_id, f_name;//多字段分組,先按s_id分組再按f_name分組

//對num進行分組,把同一分組內的quantity*price的總和大於等於100的分組顯示出來。
SELECT num, SUM(quantity * price) AS orderTotal
FROM orderitems
GROUP BY num
HAVING SUM(quantity * price) >= 100;

//再上一條的基礎上再加上一個顯示排序的功能
SELECT num, SUM(quantity * price) AS orderTotal
FROM orderitems
GROUP BY num
HAVING SUM(quantity * price) >= 100
ORDER BY orderTotal;
//limit限制查詢結果的數量
SELECT * FROM fruits LIMIT 5;//顯示前兩條記錄
SELECT * FROM fruits LIMIT 4, 2;//從第五行開始顯示,顯示兩條記錄

2、使用集合函數進行查詢

函數名 功能
AVG() 返回平均值
COUNT() 計算行數
MAX() 返回最大值
MIN() 返回最小值
SUM() 求和函數
SELECT COUNT(email) AS email_num FROM student;
SELECT num, SUM(quantity) AS items_total FROM orderitems GROUP BY o_num;
SELECT s_id, AVG(price) AS avg_price FROM fruits GROUP BY s_id;
SELECT s_id, MAX(f_price) AS max_price FROM fruits GROUP BY s_id;
SELECT s_id, MIN(f_price) AS max_price FROM fruits GROUP BY s_id;

3、連接查詢

3.1、內連接

內連接是將兩個表中相同列的值也相同的行保留下來。
對於一個問題,兩個表有相同的字段s_id,找出兩個表中s_id相同的記錄。有以下兩種查詢方法:

//非內連接形式
SELECT suppliers.s_id, s_name, f_name, f_price
FROM fruits, suppliers
WHERE fruits.s_id = suppliers.s_id;
//內連接形式
SELECT suppliers.s_id, s_name, f_name, f_price
FROM fruits INNER JOIN suppliers
ON fruits.s_id = suppliers.s_id;

非內連接形式效率低。

3.2、外連接

內連接是返回查詢結果中僅符合查詢條件和連接條件的行。外連接不進包含符合條件的行也包含不符合連接條件的行。
1. LEFT OUTER JOIN(左外連接):左表中的所有記錄和右表中連接字段相等的記錄。
2. RIGHT OUTER JOIN(右外連接):右表中的所有記錄和右表中連接字段相等的記錄。

SELECT customers.c_id, orders.o_num
FROM customers LEFT OUTER JOIN orders
ON customers.c_id = orders.c_id;

SELECT customers.c_id, orders.o_num
FROM customers RIGHT OUTER JOIN orders
ON customers.c_id = orders.c_id;

3.3、複合連接查詢

複合連接查詢就是在內連接或外連接的基礎上再加上過濾條件。

//再加一個條件
SELECT suppliers.s_id, s_name, f_name, f_price
FROM fruits INNER JOIN suppliers
ON fruits.s_id = suppliers.s_id AND f_price > 23;
//加上排序條件
SELECT customers.c_id, orders.o_num
FROM customers LEFT OUTER JOIN orders
ON customers.c_id = orders.c_id
ORDER BY customers.c_id;

4、嵌套查詢

一個查詢語句內部嵌套另一個查詢語句。常見的操作符有ANY(SOME),ALL,IN,EXISTS。

//ANY:num1大於子查詢裏面的任意一行
SELECT num1 FROM tb1 WHERE  num1 > ANY (SELECT num2 FROM tb2);
//ALL:num1大於子查詢裏面的所有行
SELECT num1 FROM tb1 WHERE  num1 > ALL (SELECT num2 FROM tb2);
//EXISTS:因爲WHERE後面是個表達式,EXISTS意思是子查詢有行返回則是true,子查詢沒有結果返回則返回false
SELECT num1 FROM tb1 WHERE  EXISTS (SELECT num2 FROM tb2);
//IN:num1在子查詢返回的結果裏則爲真,另外還有NOT IN。
SELECT num1 FROM tb1 WHERE  num1 IN (SELECT num2 FROM tb2);

5、合併查詢結果

使用UNION關鍵字將多個SELECT查詢結果合併成單個結果集。合併時,兩個表對應的列和數據類型必須嚴格相同。UNION會在合併時刪除重複記錄,UNION ALL不會刪除重複記錄並且效率較高。

SELECT ... FROM ... 
UNION [ALL]
SELECT ... FROM ...

6、爲表和字段取別名

取個別名好偷懶,下次用着方便。

//表名 AS 表別名
SELECT c.c_id, o.o_num
FROM customers AS c OUTER JOIN orders AS o
ON c.c_id = o.c_id
//列名 AS 列別名
SELECT f1.f_name AS fruit_name, f1.f_price AS fruit_price
FROM fruits AS f1
WHERE f1.f_price < 8;

7、使用正則表達式查詢

正則表達式可以找個時間集中學習一下,使用方法就是使用正則表達式作爲匹配條件,將滿足條件的返回。

SELECT * FROM fruits WHERE f_name REGEXP '^p';//滿足f_name以p開頭的返回
SELECT * FROM fruits WHERE f_name REGEXP 'p$';//滿足f_name以p結尾的返回
發佈了100 篇原創文章 · 獲贊 21 · 訪問量 35萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章