1. 程式人生 > >數據庫筆記(mysql)(2)

數據庫筆記(mysql)(2)

方案 sele tar 需要 數據庫 現在 子句 desc ...

數據庫查詢簡介

  • 查詢的基本語法
    •   select * from 表名;
  • from關鍵字後面寫表名,表示數據來源於是這張表
  • select後面寫表中的列名,如果是*表示在結果中顯示表中所有列
  • 在select後面的列名部分,可以使用as為列起別名,這個別名出現在結果集中
  • 如果要查詢多個列,之間使用逗號分隔

消除重復行

  • 在select後面列前使用distinct可以消除重復的行
    select distinct gender from students;

條件

  • 使用where子句對表中的數據篩選,結果為true的行會出現在結果集中
  • 語法如下:
select * from 表名 where 條件;

比較運算符

  • 等於=
  • 大於>
  • 大於等於>=
  • 小於<
  • 小於等於<=
  • 不等於!=或<>
  • 查詢編號大於3的學生
select * from students where id>3;
  • 查詢編號不大於4的科目
select * from subjects where id<=4;
  • 查詢姓名不是“黃蓉”的學生
select * from students where sname!=‘黃蓉‘;
  • 查詢沒被刪除的學生
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;

模糊查詢

  • like
  • %表示任意多個任意字符
  • _表示一個任意字符
  • 查詢姓黃的學生
select * from students where sname like ‘黃%‘;
  • 查詢姓黃並且名字是一個字的學生
select * from students where sname like ‘黃_‘;
  • 查詢姓黃或叫靖的學生
select * from students where sname like ‘黃%‘ or sname like ‘%靖%‘;

範圍查詢

  • in表示在一個非連續的範圍內
  • 查詢編號是1或3或8的學生
select * from students where id in(1,3,8);
  • between ... and ...表示在一個連續的範圍內
  • 查詢學生是3至8的學生
select * from students where id between 3 and 8;
  • 查詢學生是3至8的男生
select * from students where id between 3 and 8 and gender=1;

空判斷

  • 註意:null與‘‘是不同的
  • 判空is null
  • 查詢沒有填寫地址的學生
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,需要結合()使用

聚合

  • 為了快速得到統計數據,提供了5個聚合函數
  • count(*)表示計算總行數,括號中寫星與列名,結果是相同的
  • 查詢學生總數
select count(*) from students;
  • max(列)表示求此列的最大值
  • 查詢女生的編號最大值
select max(id) from students where gender=0;
  • min(列)表示求此列的最小值
  • 查詢未刪除的學生最小編號
select min(id) from students where isdelete=0;
  • sum(列)表示求此列的和
  • 查詢男生的編號之後
select sum(id) from students where gender=1;
  • avg(列)表示求此列的平均值
  • 查詢未刪除女生的編號平均值

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

分組

  • 按照字段分組,表示此字段相同的數據會被放到一個組中
  • 分組後,只能查詢出相同的數據列,對於有差異的數據列無法出現在結果集中
  • 可以對分組後的數據進行統計,做聚合運算
  • 語法:
select 列1,列2,聚合... from 表名 group by 列1,列2,列3...
  • 查詢男女生總數
select gender as 性別,count(*)
from students
group by gender;
  • 查詢各城市人數
select hometown as 家鄉,count(*)
from students
group by hometown;

分組後的數據篩選

  • 語法:
select 列1,列2,聚合... from 表名
group by 列1,列2,列3...
having 列1,...聚合...
  • having後面的條件運算符與where的相同
  • 查詢男生總人數
方案一
select count(*)
from students
where gender=1;
-----------------------------------
方案二:
select gender as 性別,count(*)
from students
group by gender
having gender=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
  • 實際使用中,只是語句中某些部分的組合,而不是全部
 

數據庫筆記(mysql)(2)