1. 程式人生 > 其它 >MySQL 7.DQL - 資料查詢

MySQL 7.DQL - 資料查詢

DQL 資料查詢

select */欄位列表/函式 from 表名;
[where 檢索條件]
[group by 欄位列表 [having 檢索條件]]
[order by 欄位列表 asc/desc]
[limit 分頁引數]
子句 功能
select * / 欄位列表 / 函式 返回被查詢的欄位列或表示式
from 表名 選擇被查詢的表
where 檢索條件(and、or、like、in、between and) 篩選、過濾資料
group by 分組欄位 [having 檢索條件] 根據指定欄位對資料分組
having 檢索條件 篩選、過濾分組結果
order by 排序欄位 [desc / asc] 根據指定欄位對資料排序
limit 分頁引數 / 跳過引數,分頁引數 分頁查詢資料行

1.基礎查詢

(1).查詢所有資料行的所有欄位列
select * form users;

(2).查詢所有資料行的部分欄位列
select id,name,pw from users;

2.Where 條件查詢

  • 可以在 where 子句中指定任何條件
  • 可以使用 and 或 or 指定多個條件,兩者同時使用時優先運算 and
  • like 子句使用 % 或 _ 模糊搜尋時,效能消耗大,所以儘量不要使用 % 和_
  • where子句還可以用在 update 和 delete 語句中

and or

(1).查詢值在某個區間的資料
select * from users where age < 22 and age > 23;

(2).查詢值不在某個區間的資料
select * from users where age not between 22 and 23;

(3).查詢同時滿足多個條件的資料, and 和 or 同時使用時要注意運算順序
select * from users where age = 22 or age = 24 and sex = '女';
-- age=24且sex='女',或age=24
select * from users where (age = 22 or age = 24) and sex = '女';
-- age=22或age=24,且sex='女'

like

(1).一個 _ 表示一個任意字元
select * from users where name like '__';
-- name為兩個任意字元的資料

select * from users where name like '_y';
select * from users where name like 'l_';

select * from users where name like '__y';
select * from users where name like 'l__';

(2). % 表示任意個任意字元
select * from users where name like '%q%';
-- name中任意位置含有 q 的資料

select * from users where name like 'q%'/'%q';
-- 以 q 開頭/結尾的資料

3.MySQL中的聚合函式

max(), min(), sum(), avg(), count()
聚合函式通常搭配分組進行資料的統計

-- 計算表中最大score,最小score,score總和,平均score,score項數,並分別命名
select max(score) as s_max,
       min(score) as s_min,
       sum(score) as s_sum,
       avg(score) as s_avg,
       count(score) as s_count from users;
       
select count(*) from users;
-- count(*) 按照表中所有列進行統計,只要其中一列有資料,就會統計
-- count(欄位) 按照指定欄位進行統計,如果列中出現 null ,則這個資料不會被統計

4.Group by 分組

  • group by 語句根據一列或者多列欄位對資料進行分組
  • 通常配合聚合函式使用,可以對分組後的結果統計、求和、求平均等
  • 使用 group by 時,除了聚合函式,其他在 select 後面出現的欄位都需要寫在 group by 後面
(1).根據兩個欄位對資料分組後,統計各組的總數
select classid,sex,count(*) as num from users group by classid,sex;
-- 根據classid、sex欄位對資料進行分組,然後使用 count(*) 統計各組的總數

(2).根據一個欄位對資料分組後,求各組中另一個欄位的平均值
select classid,avg(age) as AVGage from class group by classid;
 -- 根據classid欄位對資料進行分組,然後使用 avg(age) 求各組中age的平均值

(3).根據兩個個欄位對資料分組後,先求各組中另一個欄位的平均值,再對平均值的結果進行篩選
select age,sex,avg(score) as AVGscore from class group by age,sex having avg(score) >= 75;
-- 根據age、sex欄位對資料進行分組,然後使用 avg(score) 求各組中score的平均值,最後篩選出平均值在75及以上的組

5.order by 排序

  • 在MySQL中使用select語句查詢的結果是根據資料在底層檔案中的結構來排序的
  • 預設使用 asc ,即升序排列,使用 desc 為倒序排列
(1).根據多個欄位對資料進行排序
select * from class order by classid,age desc,score desc;
-- 先根據classid升序排列,classid相同時根據age降序排列,age相同時根據score降序排列

6.limit 分頁

  • limit 語句運用在資料分頁,或查詢排序後值為最大/最小的資料
  • limit n : 查詢表中前 n 條資料
  • limit m,n : 跳過前 m 條資料,再查詢 n 條資料
(1).查詢表中前 n 條資料
select * from class limit 3;

(2).在表中跳過前 m 條資料,再查詢 n 條資料
select * from class limit 5,3;

(3).查詢表中某個欄位值最大的 n 條資料
select * from class order by score desc limit 5;