【MySQL】簡單明瞭:單表查詢

終於來到令人激動、也是數據庫最重要的一個點了:查詢操作。前文曾說過,操作關係型數據庫就是在操作表,那麼查詢操作也就是在表格中查詢指定數據的操作了。本文將教你在MySQL中基礎的單表查詢語法,十分清晰明瞭,一看一練包會!(注:推薦讀物《MySQL必知必會 人民郵電出版社》)


Table of Contents

創建一個練習用的數據庫和表

SELECT [選項]

聚合函數

字段連接

執行算術運算

文本處理函數

數值處理函數

WHERE 條件查詢

正則表達式查詢

GROUP BY 分組查詢

ORDER BY 排序查詢

LIMIT 分頁操作


本文將圍繞以下的查詢語法展開,由淺入深,幫助你快速建立查詢操作體系結構(奧利給)

SELECT [選項] 字段列表 FROM 數據源 WHERE條件 
	GROUP BY分組 HAVING條件
	ORDER BY排序 
	LIMIT限制;

PS:建議先看我的前兩篇文章,教你如何創建MySQL數據庫和表~~

【MySQL】如何管理數據庫:https://blog.hackyle.net/index.php/database/mysql-manage-database/
【MySQL】如何管理表:https://blog.hackyle.net/index.php/database/mysql-manage-table/


創建一個練習用的數據庫和表

 

打開SQLyog:

 

-- 1.創建一個名爲kdb的數據庫並設置編碼
CREATE DATABASE kdb CHARACTER SET utf8;
-- 2.切換到kdb數據庫
USE kdb;

-- 3.創建一個表格
CREATE TABLE person (
	pid INT PRIMARY KEY AUTO_INCREMENT COMMENT '人的編號,作爲主鍵,編號自動增長',
	pname VARCHAR(20) NOT NULL COMMENT '人的姓名,不可以爲空',
	page INT DEFAULT NULL COMMENT '年齡,默認爲空',
	paddress VARCHAR(50) DEFAULT NULL COMMENT '住址,默認爲空',
	ptel VARCHAR(15) DEFAULT NULL COMMENT '電話',
	pemail VARCHAR(50) DEFAULT NULL COMMENT '電郵'
);

執行完上述SQL語句後:


添加一些記錄:

-- 4.添加幾條記錄
INSERT INTO person VALUES (1,'Jhon',20,'HongKong','16818181818','[email protected]'),
	(2,'Project Alice',32,'raccoon city','15745452525','[email protected]'),
	(3,'Fukada Eimi',28,'Japanese','10100101010','[email protected]'),
	(4,'Yourer',25,'Japanese','19191918989','[email protected]'),
	(5,'anay',22,'Taiwan','11100101001','[email protected]*on')

現在可以愉快地玩耍了~~~


SELECT [選項]

 

查詢指定字段信息:select 字段1,字段2,...from 表名;

 

查詢表中所有字段:select * from 表名;

 

注意:使用"*"在練習、學習過程中可以使用,在實際開發中,不推薦使用。原因,要查詢的字段信息不明確,若字段數量很多,會導致查詢速度很慢。

 

distinct用於去除重複記錄:select distinct 字段 from 表名;

 

表別名格式:

 

  • select * from 表名 as 別名;
  • select * from 表名 別名; --as關鍵詞可以省略

 

列別名格式:

 

  • select 字段名 as 別名 from 表名;
  • select 字段名 別名 from 表名;

 

去重複的結果集:

 

SELECT DISTINCT * FROM 表名;

第一個SQL查詢:

 

 

聚合函數

 

背景:

 

  • 之前我們所做的都是橫向查詢,它們都是根據條件一行一行地進行判斷。
  • 如何實現縱向查詢,即對一個列的所有數值進行某種運算。聚合函數。
  • 即,將一列數據作爲一個整體,進行縱向計算。

 

聚合函數:使用方式是:作用在列名上。

 

count:統計指定列部位null的記錄個數;

 

語法示例:SELECT COUNT(*) FROM 表名

 

注意:count聚合函數的計算,排除值爲null的那一格;

 

  1. 即使是null,也加入計算:SELECT COUNT(*) FROM 表名; 或者 SELECT COUNT(主鍵) FROM 表名;
  2. 使用ifnull函數:SELECT COUNT(IFNULL(列名,0) FROM 表名;  (註釋:把值爲NULL的所在單元格看成是0)

 

 

  • 其他聚合函數:
  • sum:計算指定列的數值和,如果指定列的數據類型不是數值類型,那麼計算結果爲0;
  • 語法示例:SELECT SUM(列名) FROM 表名
  • max:計算指定列的最大值,如果該列是字符串類型,那麼使用字符串排序運算;
  • min:計算指定列的最小值,如果該列是字符串類型,那麼使用字符串排序運算;
  • avg:計算列的平均值,如果該列的數據類型不是數值類型,那麼計算結果爲0;SELECT AVG(DISTINCT p_price) AS avg_price from products;

獲取某列的總和:SELECT sum(列名) FROM 表名;

獲取某列的平均值:SELECT avg(列名) from 表名;

 

字段連接

 

有時,我們需要根據請求,對數據庫中的不同列,進行數據計算字段(數據組合、格式控制),再返回。

 

理解計算字段中的拼接字符串concat()

 

SELECT CONCAT(pid,pname,page) AS 拼接:ID姓名年齡 FROM person;

執行結果:

 

CONCAT如何使用

語法:

  1. 要連接成一串的,全部在CONCAT()的括號內;
  2. 各個字段(列名)之間使用英文狀態下的逗號分隔;
  3. 字符要用引號隔離,和使用英文逗號分隔;

示例:

SELECT CONCAT(pname,'(',page,psex,ptel,pemail,')') AS 個人信息 FROM person;

 

執行算術運算

 

SELECT pid,pname,page+5 AS new_age FROM person WHERE psex='woman';

 

文本處理函數

數值處理函數


WHERE 條件查詢

格式:select 字段  from 表名  where 條件;

 

while條件的種類如下:

比較運算符

>  <  <=   >=   =  <>

大於、小於、大於(小於)等於、不等於(或者!=)

BETWEEN  ...AND...

顯示在某一區間的值(含頭含尾)

IN(參數爲一個set集合)

顯示在in列表中的值,例:in(100,200)

顯示不在in列表中的值,例:not in(10,20)

LIKE 通配符

模糊查詢,Like語句中有兩個通配符

  1. % 用來匹配多個字符;例first_name like ‘a%’;%不能用於匹配NULL值!
  2. _ 用來匹配一個字符。例first_name like ‘a_’;

IS NULL

判斷是否爲空

is null; 判斷爲空

is not null; 判斷不爲空

邏輯運算符

AND

多個條件同時成立

OR

多個條件任一成立

NOT

不成立,例:where not(salary>100);

由於本個表沒有相關測試數據(懶得寫),這裏就直接腦補一波:

示例:
價格小於10:
	SELECT p_name,p_price FROM products WHERE p_price<10;
價格不等於10:
	SELECT p_name,p_price FROM products WHERE p_price!=10;等價於
	SELECT p_name,p_price FROM products WHERE p_price<>10;
價格在10到100之間:
	SELECT p_name,p_price FROM products WHERE p_price BETWEEN 10 AND 100;
檢查有無空值:
	SELECT p_name FROM products WHERE p_price IS NULL;

OR操作符的使用:
SELECT p_name,p_price FROM products WHERE p_id=100 OR p_id=200;
OR、AND操作符的聯合使用:
SELECT p_name,p_price FROM products WHERE p_id=100 OR p_id=200 AND p_price>=10;
上面語句執行後並未按照預期進行過濾。原因是,在處理OR之前,優先處理AND;由於AND在計算次序中優先級更高,操作符被錯誤地組合了。
SELECT p_name,p_price FROM products WHERE (p_id=100 OR p_id=200) AND p_price>=10;

正則表達式查詢

LIKE 通配符:

  1. % 用來匹配多個字符;例first_name like ‘a%’;%不能用於匹配NULL值!
  2. _ 用來匹配一個字符。例first_name like ‘a_’;

 

REGEXP正則表達式:

檢索pname中包含文本ject的所有行:SELECT pname FROM person WHERE pname REGEXP 'ject';

特性:

  1. 不區分大小寫;
  2. “.”:匹配任意字符;
  3. “\\-”:匹配“-”,“\\.”:匹配“.”;

辨析LIKE和REGEXP:

SELECT pname FROM person WHERE pname LIKE 'ject';  -- 不會顯示pname爲ject的所在行;
SELECT pname FROM person WHERE pname REGEXP 'ject';  -- 會顯示pname爲ject的所在行;

  1. LIKE匹配的是整個列。如果被匹配的文本在列值中出現,LIKE將不會找到它,相應的行也不會被返回。
  2. REGEXP是在列中的值進行匹配。如果被匹配的文本在列值中出現,REGEXP將會找到它,並將它返回。

GROUP BY 分組查詢

功能:把同一列中的重複內容項合併成一個項,並操作處理這些重複內容項的各個數值。

 

使用格式:GROUP BY 被分組的列名

  1. 可以跟着聚合函數
  2. 被分組的列,要出現在SELECT選擇列的後面
  3. GROUP BY子句必須出現在where子句之後,ORDER BY 子句之前
  4. 如果分組列中具有NULL值,則NULL將作爲一個分組返回。如果列中有多個NULL值,則將它們作爲一組

 

核心特性:

  1. where是用來過濾記錄的,HAVING是用來過濾分組的,HAVING具備where的所有語法。
  2. 過濾的時機不相同:先過濾Where後過濾Having
  3. WHERE是在查詢表時逐行過濾以選取滿足條件的記錄,having是在數據查詢後並且分完組後對分組進行過濾的
  4. HAVING必須跟在group BY之後
  5. 查詢語句執行順序:5select 1from 2where 3group by 4having 6order by

 

添加一個字段,方便分組查詢:

ALTER TABLE person ADD psex VARCHAR(10) DEFAULT 'man' COMMENT '性別';

UPDATE person SET psex='woman' WHERE pid BETWEEN 2 AND 3;

先看看錶中的數據是什麼樣的:

統計一下person表中的男人和女人各有多少人:

統計一下person表中的各地區人的數量:

 

以下是一些分組查詢的示例(沒有實際案例,如果看不懂,跳過即可):

理解分組查詢:
1.	根據“列名1”字段分組,分組後統計商品的個數:
SELECT 列名1,count(*) from 表名 GROUP BY 列名1;
2.	根據“列名1”分組,分組統計“列名2”的平均價格,並且平均價格大於20000元:
SELECT 列名1,avg(列名2) FROM 表名 GROUP BY 列名1 having avg(“列名2”)>20000;


GROUP BY(分組查詢)的示例:
1)	查詢每個部門的平均工資:
SELECT deptno AS 部門,AVG(sal) AS 平均工資 FROM emp GROUP BY deptno;
2)	查詢每個職位的最高、最低工資:
SELECT job AS 職位, MAX(sal) AS 最高工資, MIN(sal) AS 最低工資 FROM emp GROUP BY job;

3)	查詢每個部門的每個職位的最高工資:
SELECT DISTINCT deptno AS 部門, job AS 職位, MAX(sal) 最高工資 FROM emp GROUP BY job;
4)	查詢每個部門的平均工資:
SELECT deptno AS 部門, AVG(sal) AS 平均工資 FROM emp GROUP BY deptno;

 

ORDER BY 排序查詢

功能:選取某一行對數據進行排序。

語法格式:在普通查詢語句後接“SELECT * FROM person ORDER BY 列名 [DESC|ASC]”

  • DESC:降序排列
  • ASC:升序,可以不寫(默認)

如果列名1相同的情況下,按照列名2繼續排序:

SELECT * FROM 表名 ORDER BY 列名1 [DESC|ASC], 列名2 [DESC|ASC];

 

按年齡進行排序:


LIMIT 分頁操作

理解:對於一個查詢,其結果有很多。一個頁面可能太長了,顯示不下,所以我們需要對其進行分頁,分成不長的幾頁。

 

分頁操作的語法:

SELECT * FROM 表名 LIMIT 開始索引,每頁顯示的條目數;

開始索引 = (當前的頁碼 - 1)x 每頁顯示的條數

 

每頁顯示3條記錄:

SELECT * FROM 表名 LIMIT 0,3;(第一頁:從0開始查,只顯示前3條記錄)

SELECT * FROM 表名 LIMIT 3,3;(第二頁:從3開始查,只顯示前3條記錄)

 

從查詢結果的第2項開始,輸出兩項:


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章