史上最簡單的 MySQL 教程(二十三)「數據的高級操做 之 查詢」

數據的高級操做

查詢數據(上)

  • 基本語法: select + 字段列表/* + from + 表名 + [where 條件];
  • 完整語法: select + [select 選項] + 字段列表[字段別名]/* + from + 數據源 + [where 條件] + [1] + [2] + [3];
    • [1] = [group by 子句]
    • [2] = [order by 子句]
    • [3] = [limit 子句]

SELECT 選項

select選項,即select對查出來的結果的處理方式。sql

  • all:默認,保留全部的查詢結果;
  • distinct:去重,將查出來的結果中全部字段都相同的記錄去除。

執行以下 SQL 語句,進行測試:數據庫

-- 查詢表 my_copy 中的數據
select * from my_copy;
select all * from my_copy;
select distinct * from my_copy;

字段別名

字段別名,即當數據進行查詢的時候,有時候字段的名字並不必定知足需求(特別地,在多表查詢的時候,極可能會有同名字段),這時就須要對字段進行重命名、取別名。服務器

  • 基本語法:字段名 + [as] + 別名;

執行以下 SQL 語句,進行測試:函數

-- 使用別名
select id,
name as 姓名,
age as 年齡,
grade as 年級
from student;

數據源

數據源,即數據的來源,關係型數據庫的數據源都是數據表,本質上只要保證數據相似二維表,最終就能夠做爲數據源。測試

數據源分爲 3 種,分別爲:單表數據源,多表數據源和查詢語句。優化

第 1 種:單表數據源spa

  • 基本語法:select * from + 表名;

 

第 2 種:多表數據源設計

  • 基本語法:select * from + 表名1,表名2...;

如上圖所示,使用多表數據源時默認從一張表中取出一條記錄去另一張表中匹配全部記錄,並且所有保留,比較浪費資源,應該儘可能避免。3d

第 3 種:查詢語句(子查詢)code

  • 基本語法:select * from + (select * from + 表名) + [as] + 別名;

 

如上圖所示,數據的來源是一條查詢語句,而查詢語句的結果是一張二維表。

舒適提示:符號[]括起來的內容,表示可選項;符號+,則表示鏈接的意思。

查詢數據(中)

where子句

where字句:用來判斷數據和篩選數據,返回的結果爲0或者1,其中0表明false1表明truewhere是惟一一個直接從磁盤獲取數據的時候就開始判斷的條件,從磁盤中讀取一條數據,就開始進行where判斷,若是判斷的結果爲真,則保持,反之,不保存。

判斷條件:

  • 比較運算符:><>=<=<>=likebetween andinnot in
  • 邏輯運算符:&&||、和!.

執行以下 SQL 語句,進行測試:

-- 查詢表 student 中 id 爲 二、三、5 的記錄
select * from student where id = 2 || id = 3 || id = 5;
select * from student where id in (2,3,5);

-- 查詢表 student 中 id 在 2 和 5 之間的記錄
select * from student where id between 2 and 5;

如上圖所示,我們會發現:在使用between and的時候,其選擇的區間爲閉區間,即包含端點值。此外,and前面的數值必須大於等於and後面的數值,不然會出現空判斷,例如:

group by子句

group by子句:根據表中的某個字段進行分組,即將含有相同字段值的記錄放在一組,不一樣的放在不一樣組。

  • 基本語法:group by + 字段名;

執行以下 SQL 語句,進行測試:

-- 將表 student 中的數據按字段 sex 進行分組
select * from student group by sex;

觀察上圖,我們會發現:表student在分組事後,數據「丟失」啦!實際上並不是如此,產生這樣現象緣由爲:group by分組的目的是爲了(按分組字段)統計數據,並非爲了單純的進行分組而分組。爲了方便統計數據,SQL 提供了一系列的統計函數,例如:

  • cout():統計分組後,每組的總記錄數;
  • max():統計每組中的最大值;
  • min():統計每組中的最小值;
  • avg():統計每組中的平均值;
  • sum():統計每組中的數據總和。

執行以下 SQL 語句,進行測試:

-- 將表 student 中的數據按字段 sex 進行分組,並進行統計
select sex,count(*),max(age),min(age),avg(age),sum(age) from student group by sex

其中,count()函數裏面可使用兩種參數,分別爲:*表示統計組內所有記錄的數量;字段名表示統計對應字段的非null(若是某條記錄中該字段的值爲null,則不統計)記錄的總數。此外,使用group by進行分組以後,展現的記錄會根據分組的字段值進行排序,默認爲升序。固然,也能夠人爲的設置升序和降序。

  • 基本語法:group by + 字段名 + [asc/desc];

執行以下 SQL 語句,進行測試:

-- 將表 student 中的數據按字段 sex 進行分組,並排序
select sex,count(*) from student group by sex;
select sex,count(*) from student group by sex asc;
select sex,count(*) from student group by sex desc;

經過觀察上面數個分組示例,細心的同窗會發現:我們在以前的示例中,都是用單字段進行分組。實際上,我們也可使用多字段分組,即:先根據一個字段進行分組,而後對分組後的結果再次按照其餘字段(前提是分組後的結果中包含此字段)進行分組。

執行以下 SQL 語句,進行測試:

-- 將表 student 中的數據先按字段 grade 進行分組,再按字段 sex 進行分組
select *,count(*) from student group by grade,sex;

在這裏,函數group_concat(字段名)能夠對分組的結果中的某個字段值進行字符串鏈接,即保留該組某個字段的全部值。例如:

-- 將表 student 中的數據按字段 sex進行分組,並保留字段 name 的值
select sex,age,count(*),group_concat(name) from student group by sex;

此外,簡單介紹回溯統計的概念:利用with rollup關鍵字(書寫在 SQL 語句末尾),能夠在每次分組事後,根據當前分組的字段進行統計,並向上一級分組進行彙報。例如:

-- 將表 student 中的數據按字段 sex進行分組,並進行回溯統計
select sex,count(*) from student group by sex with rollup;

觀察上圖,我們會發現:在進行回溯統計的時候,會將分組字段置空。

舒適提示:符號[]括起來的內容,表示可選項;符號+,則表示鏈接的意思。

查詢數據(下)

having子句

having字句:與where子句同樣,都是進行條件判斷的,可是where是針對磁盤數據進行判斷,數據進入內存以後,會進行分組操做,分組結果就須要having來處理。思考可知,having能作where能作的幾乎全部事情,可是where卻不能作having能作的不少事情。

第 1 點:分組統計的結果或者說統計函數只有having可以使用

執行以下 SQL 語句,進行測試:

-- 求出表 student 中全部班級人數大於等於 2 的班級
select grade,count(*) from student group by grade having count(*) >= 2;
select grade,count(*) from student where count(*) >= 2 group by grade;

如上圖所示,顯然having子句能夠對統計函數獲得的結果進行篩選,可是where卻不能。

第 2 點:having可以使用字段別名,where則不能

執行以下 SQL 語句,進行測試:

-- 求出表 student 中全部班級人數大於等於 2 的班級
select grade,count(*) as total from student group by grade having total >= 2;
select grade,count(*) as total from student where total >= 2 group by grade;

如上圖所示,顯然我們的結論獲得了驗證。究其緣由,where是從磁盤讀取數據,而磁盤中數據的名字只能是字段名,別名是數據(字段)進入到內存後才產生的。值得注意的是,在上述 SQL 語句中我們使用了字段別名,這在無心中就優化了 SQL 並提升了效率,由於少了一次統計函數的計算。

order by子句

order by子句:根據某個字段進行升序或者降序排序,依賴校對集。

  • 基本語法:order by + [asc/desc];

其中,asc爲升序,爲默認值;desc爲降序。

執行以下 SQL 語句,進行測試:

-- 將表 student 中的數據按年齡 age 進行排序
select * from student order by age;

此外,我們能夠進行「多字段排序」,即先根據某個字段進行排序,而後在排序後的結果中,再根據某個字段進行排序。

執行以下 SQL 語句,進行測試:

-- 將表 student 中的數據先按年齡 age 升序排序,再按班級 grade 降序排序
select * from student order by age,grade desc;

limit子句

limit子句:是一種限制結果的語句,一般來限制結果的數量。

  • 基本語法:limit + [offset] + length;

其中,offset爲起始值;length爲長度。

第 1 種:只用來限制長度(數據量)

執行以下 SQL 語句,進行測試:

-- 查詢表 student 中的所有記錄
select * from student;
-- 查詢表 student 中的 3 條記錄
select * from student limit 3;

第 2 種:限制起始值,限制長度(數據量)

執行以下 SQL 語句,進行測試:

-- 查詢表 student 中的記錄
select * from student limit 0,2;
-- 查詢表 student 中的記錄
select * from student limit 2,2;

第 3 種:主要用來實現數據的分頁,目的是爲用戶節省時間,提升服務器的響應效率,減小資源的浪費

大體設計:

  • 對於用戶來說,能夠經過點擊頁碼按鈕,如123等來進行選擇;
  • 對於服務器來說,能夠根據用戶選擇的頁碼來獲取不一樣的數據。

其中,

  • length:表示每頁的數據量,基本不變;
  • offset:表示每頁的起始值,公式爲offset=(頁碼-1)*length.

若是你們感興趣的話,能夠結合PHP或者其餘語言進行測試。

舒適提示:符號[]括起來的內容,表示可選項;符號+,則表示鏈接的意思。

相關文章
相關標籤/搜索