select + 字段列表/* + from + 表名 + [where 條件];
select + [select 選項] + 字段列表[字段別名]/* + from + 數據源 + [where 條件] + [1] + [2] + [3];
[1] = [group by 子句]
[2] = [order by 子句]
[3] = [limit 子句]
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
表明false
,1
表明true
,where
是惟一一個直接從磁盤獲取數據的時候就開始判斷的條件,從磁盤中讀取一條數據,就開始進行where
判斷,若是判斷的結果爲真,則保持,反之,不保存。
判斷條件:
>
、<
、>=
、<=
、<>
、=
、like
、between and
、in
和not 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 種:主要用來實現數據的分頁,目的是爲用戶節省時間,提升服務器的響應效率,減小資源的浪費
大體設計:
1
、2
、3
等來進行選擇;其中,
length
:表示每頁的數據量,基本不變;offset
:表示每頁的起始值,公式爲offset=(頁碼-1)*length
.若是你們感興趣的話,能夠結合PHP
或者其餘語言進行測試。
舒適提示:符號[]
括起來的內容,表示可選項;符號+
,則表示鏈接的意思。