1. 程式人生 > >MySql知識樹整理【2】--查詢

MySql知識樹整理【2】--查詢

查詢簡介

  1. 查詢的基本語法

select * from 表名;

from關鍵字後面寫表名,表示資料來源於是這張表

select後面寫表中的列名,如果是*表示在結果中顯示錶中所有列

在select後面的列名部分,可以使用as為列起別名,這個別名出現在結果集中

如果要查詢多個列,之間使用逗號分隔

消除重複行

在select後面列前使用distinct可以消除重複的行

select distinct gender from students;

 

條件

  1. 使用where子句對錶中的資料篩選,結果為true的行會出現在結果集中
  2. 語法如下:

select * from 表名 where 條件;

比較運算子

等於=

大於>

大於等於>=

小於<

小於等於<=

不等於!=或<>

  1. 查詢編號大於3的學生

select * from students where id>3;

  1. 查詢編號不大於4的科目

select * from subjects where id<=4;

  1. 查詢姓名不是“黃蓉”的學生

select * from students where sname!='黃蓉';

  1. 查詢沒被刪除的學生

select * from students where isdelete=0;

邏輯運算子

and

or

not

查詢編號大於3的女同學

select * from students where id>3 and gender=0;

查詢編號小於4或沒被刪除的學生

select * from students where id<4 or isdelete=0;

模糊查詢

  1. like
  2. %表示任意多個任意字元
  3. _表示一個任意字元

查詢姓黃的學生

select * from students where sname like '黃%';

查詢姓黃並且名字是一個字的學生

select * from students where sname like '黃_';

查詢姓黃或叫靖的學生

select * from students where sname like '黃%' or sname like '%靖%';

 

範圍查詢

  1. in表示在一個非連續的範圍內
  2. 查詢編號是1或3或8的學生

select * from students where id in(1,3,8);

  1. between ... and ...表示在一個連續的範圍內
  2. 查詢學生是3至8的學生

select * from students where id between 3 and 8;

  1. 查詢學生是3至8的男生

select * from students where id between 3 and 8 and gender=1;

空判斷

  1. 注意:null與''是不同的    null是不佔用記憶體的,而‘’是一個空字元
  2. 判空is null
  3. 查詢沒有填寫地址的學生

select * from students where hometown is null;

判非空is not null

查詢填寫了地址的學生

select * from students where hometown is not null;

查詢填寫了地址的女生

select * from students where hometown is not null and gender=0;

 

優先順序

小括號,not,比較運算子,邏輯運算子

and比or先運算,如果同時出現並希望先算or,需要結合()使用

 

聚合(對查詢結果的一些操作)

將我們現有的多行資料進行統計,會得到一個統計的結果,原始資料我們是得不到的(但可以通過子查詢得到)

  1. 為了快速得到統計資料,提供了5個聚合函式
  2. count(*)表示計算總行數,括號中寫星與列名,結果是相同的
  3. 查詢學生總數

select count(*) from students;

  1. max(列)表示求此列的最大值
  2. 查詢女生的編號最大值

select max(id) from students where gender=0;

  1. min(列)表示求此列的最小值
  2. 查詢未刪除的學生最小編號

select min(id) from students where isdelete=0;

  1. sum(列)表示求此列的和
  2. 查詢男生的編號之後

select sum(id) from students where gender=1;

  1. avg(列)表示求此列的平均值
  2. 查詢未刪除女生的編號平均值

select avg(id) from students where isdelete=0 and gender=0;

 

分組

  1. 按照欄位分組,表示此欄位相同的資料會被放到一個組中
  2. 分組後,只能查詢出相同的資料列,對於有差異的資料列無法出現在結果集中
  3. 可以對分組後的資料進行統計,做聚合運算
  4. 語法:

select 列1,列2,聚合... from 表名 group by 列1,列2,列3...

  1. 查詢男女生總數

select gender as 性別,count(*)

from students

group by gender;

  1. 查詢各城市人數

select hometown as 家鄉,count(*)

from students

group by hometown;

  1. 分組後的資料篩選

語法:

select 列1,列2,聚合... from 表名

group by 列1,列2,列3...

having 列1,...聚合...

having後面的條件運算子與where的相同

  1. 查詢男生總人數

方案一

select count(*)

from students

where gender=1;

-----------------------------------

方案二:

select gender as 性別,count(*)

from students

group by gender

having gender=1;

  1. 對比where與having

where是對from後面指定的表進行資料篩選,屬於對原始資料的篩選

having是對group by的結果進行篩選

 

 

 

 

排序

  • 為了方便檢視資料,可以對資料進行排序
  • 語法:

select * from 表名

order by 列1 asc|desc,列2 asc|desc,...

  • 將行資料按照列1進行排序,如果某些行列1的值相同時,則按照列2排序,以此類推
  • 預設按照列值從小到大排列
  • asc從小到大排列,即升序
  • desc從大到小排序,即降序
  • 查詢未刪除男生學生資訊,按學號降序

select * from students

where gender=1 and isdelete=0

order by id desc;

  • 查詢未刪除科目資訊,按名稱升序

select * from subject

where isdelete=0

order by stitle;

 

 

獲取部分行

  • 當資料量過大時,在一頁中檢視資料是一件非常麻煩的事情
  • 語法
select * from 表名
limit start,count
  • 從start開始,獲取count條資料
  • start索引從0開始

示例:分頁

  • 已知:每頁顯示m條資料,當前顯示第n頁
  • 求總頁數:此段邏輯後面會在python中實現
    • 查詢總條數p1
    • 使用p1除以m得到p2
    • 如果整除則p2為總數頁
    • 如果不整除則p2+1為總頁數
  • 求第n頁的資料
select * from students
where isdelete=0
limit (n-1)*m,m

 

 

總結

  • 完整的select語句

select distinct *

from 表名

where ....

group by ... having ...

order by ...

limit star,count

  • 執行順序為:
    • from 表名
    • where ....
    • group by ...
    • select distinct *
    • having ...
    • order by ...
    • limit star,count
  • 實際使用中,只是語句中某些部分的組合,而不是全部