1. 程式人生 > >MySQL數據庫 | 數據表-查詢命令詳細記錄

MySQL數據庫 | 數據表-查詢命令詳細記錄

語句 意義 四舍五入 生效 多少 運算符 star ima 指定字段

本篇專門記錄數據庫增刪改查中最常用、花招最多的 查。

【文章結構】

一、數據的準備

二、基本的查詢功能

三、條件查詢

四、查詢排序

五、聚合函數

六、分組查詢

七、分頁查詢

八、連接查詢

九、子查詢

十、自關聯

【正文】

一、數據的準備

首先創建一個數據庫,以便後文命令的使用。

-- 創建一個數據庫
create database pysql charset=utf8;

-- 使用數據庫
use pysql;

-- 查看當前使用的是哪個數據庫
select database();

-- 創建數據表groups, heroes
create table groups (
    id 
int unsigned auto_increment primary key, name varchar(20) not null ); create table heroes ( id int unsigned auto_increment primary key not null, name varchar(20) default "", age tinyint unsigned default 0, height decimal(5,2), gender enum("男", "女", "保密") default "保密", grp_id
int unsigned default 0, is_delete bit default 0 ); -- 查看數據庫中已有的數據表 show tables; -- 了解數據表的創建方式 show create table heroes; -- 插入數據 insert into heroes values (0,"妮蔻",18,150.00,2,1,0), (0,"泰隆",50,188.00,1,1,0), (0,"阿貍",16,179.00,1,1,0), (0,"賞金",17,175.68,2,3,1), (0,"盲僧",90,190.00,1,1,0), (0,"蓋倫",30,197.89,1,1,0), (0,"光輝",18
,160.00,2,1,1), (0,"希維爾",21,167.90,3,2,0), (0,"劫",70,null,2,1,1), (0,"派克",34,170.00,1,6,0), (0,"卡莎",18,180.90,2,1,0), (0,"塔姆",56,150.00,1,2,0), (0,"阿木木",90,130.01,1,1,0), (0,"娜美",18,173.00,2,4,0); insert into groups values (0, "超凡"), (0, "黑鐵"), (0, "黃金");

二、基本的查詢功能

-- 查詢所有字段(大數據庫中慎用)
-- select * from 表名;
select * from heroes;
select * from groups;

-- 查詢指定字段
-- select 列1, 列2,...from 表名;
select name, age from heroes;

-- 使用as給字段起別名
-- select 字段 as 別名 from 表名;
select name as "姓名", age as "年齡" from heroes;

-- select 表名.字段... from 表名
select heroes.name, heroes.gender from heroes;

-- 通過as給表起別名
select h.name, h.gender from heroes as h;
-- select heroes.name, heroes.gender from heroes as h; 報錯,改了名就要用...

-- 消除重復行(要是京東查手機的時候能有這麽個命令,出現過的型號不要再出現就好了)
-- distinct 字段
select distinct gender from heroes;

三、條件查詢

-- 比較運算符
  -- select ... from 表名 where 條件
  -- >
  -- 查詢大於18歲的信息
  select * from heroes where age>18;

  -- <
  -- 查詢id小於5的信息
  select * from heroes where id<5;

  -- >=
  -- <=
  --

  -- =
  --查詢性別為男的英雄的id和名字
  select id,name from heroes where gender=1;

  -- != 或者 <> (<>在很多語言中都不用,所以首選 !=)
  select id,name from heroes where gender!=1;

-- 邏輯運算符(與 或 非)
  -- and
  -- 18到50歲之間英雄的信息
  -- 報錯 select * from heroes where age>18 and <50; 判斷語句 左右兩邊都要寫全
  select * from heroes where age>18 and age<50;

  -- 18歲以上的女性
  select * from heroes where age>18 and gender=2;
  select * from heroes where age>18 and gender="女";
  -- or
  -- 50歲以上或身高180(包含)以上
  select * from heroes where age>50 or height>=180;

  -- not
  -- not 加在誰前面就僅僅否定這一個條件,用()解決優先級的問題,不要死記硬背
  -- 不屬於 70歲以上男英雄 的
  select * from heroes where not (age>70 and gender=1);

  -- 年齡不小於或等於18 的女性英雄.用()解決優先級的問題
  select * from heroes where (not age<=18) and gender=2;

-- 模糊查詢
  -- like (效率低)
  -- % 替換1個,0個或多個
  -- _替換一個
  --查詢姓名中以“賞”開頭的名字
  select name from heroes where name like "賞%";

  --查詢姓名中有“賞”的名字
  select name from heroes where name like "%%";

  --查詢兩個字的名字
  select name from heroes where name like "__";

  --查詢至少兩個字的名字
  select name from heroes where name like "__%";

  -- rlike 正則
  -- 查詢以“泰”開始的名字
  select name from heroes where name rlike "^泰.*";

  -- 查詢以“希”開頭,“爾”結尾的名字
  select name from heroes where name rlike "^希.*爾$";


-- 範圍查詢
  -- in (18, 70, 50) 表示在一個非連續的範圍內
  -- 查詢年齡為18,70的英雄
  select name, age from heroes where age in (18, 70, 50);

  -- not in (18, 70, 50) 不在某個非連續的範圍內
  select name, age from heroes where age not in (18, 70, 50);

  -- between .. and .. 在某個連續的範圍內
  select name, age from heroes where age between 18 and 50;
  -- not between .. and .. 不在某個範圍中,這是一個整體的語句,同時否定between和and的內容
  -- 報錯 select name, age from heroes where age not (between 18 and 50);
  select name, age from heroes where age not between 18 and 50;
  select name, age from heroes where not age between 18 and 50;

-- 判斷為空
  -- is null
  -- a = None 表示 a沒有指向任何東西,a = "" 表示a指向一個為空的對象
  -- 查詢身高為空的信息
  select * from heroes where height is null;
  -- 不為空的
  select * from heroes where height is not null;

四、查詢排序

-- order by 字段
-- asc 升序(默認值)
-- desc 降序
-- 先寫那個條件,先按照這個條件排序,相同情況下,按第二個排,否則不生效

--查詢年齡在20-70的男英雄,按照年齡升序排列
select * from heroes where (age between 20 and 70) and gender=1 order by age;
select * from heroes where (age between 20 and 70) and gender=1 order by age asc;

-- order by 多個字段
-- 查詢年齡在16-24之間的女性,按身高降序排列,如相同,按年齡升序排列
select * from heroes where (age between 16 and 20) and gender=2 order by height desc,age asc;

-- 全部人員,按照年齡從小到大排列,身高從高到低
select * from heroes order by age, height desc;

五、聚合函數

-- 函數,帶括號那種。

-- 總數
-- count
-- 查詢男英雄有多少人
select count(*) as "男英雄個數" from heroes where gender=1;

-- 最大值
-- max
-- 查詢最大的年齡
select age from heroes;
select max(age) from heroes;

-- 查詢女性最高身高
select max(height) as "最高身高" from heroes where gender=2;

-- 求和
-- sum
-- 所有人身高總和
select sum(height) from heroes;

-- 平均值
-- avg
-- 女性平均年齡,以下兩種方式均可,此處目的在於說明select後面可以加運算式,
-- 但此類統計中盡量避免第二種方式,例如在此數據表中,如果是平均身高的話,因為有一個null的存在...
select avg(age) from heroes where gender=2;
select sum(age)/count(*) from heroes where gender=2;

--=====================================

-- 通過下面的命令得到的是女性的個數
select count(*) from heroes where gender=2;
-- 通過下面的命令得到的是女性的總身高
select sum(height) from heroes where gender=2;

-- 以下兩種方式得到的女性平均身高不相等
select avg(height) from heroes where gender=2;
select sum(height)/count(*) from heroes where gender=2;

--自然也是不相等的...
select avg(height) from heroes;
select sum(height)/count(*) from heroes;

--=====================================

-- 四舍五入 round(123.23 , 1) => 保留1位小數
--計算所有人的平均年齡,保留2位小數
select round(sum(age)/count(*), 2) from heroes;
select round(avg(age), 2) from heroes;

-- 男性的平均身高,保留2位小數
select round(avg(height), 2) from heroes where gender=1;

六、分組查詢

-- 要和聚合搭配使用,才比較有意義

-- group by
-- 按照性別分組,查詢所有的性別
-- select 可以唯一標記每個分組的...東西 from heroes group by gender;
select gender from heroes group by gender;

-- 計算每種性別有多少人
select gender, count(*) from heroes group by gender;
-- 此處的count(*) 是對每組的計算結果

-- 計算每組中的最大年齡、平均年齡
select gender, max(age) from heroes group by gender;
select gender, avg(age) from heroes group by gender;

-- group_concat(...)
-- 查詢同種性別中的姓名等信息
-- 統計每種性別都包括哪個英雄(數據多了,就可以統計,地區,部門等等)
select gender, group_concat(name) from heroes group by gender;

-- 計算男性的人數(先寫where,再寫group by)
select gender,count(*) from heroes where gender=1 group by gender;
-- 計算男性人數,並查看男性都包括誰
select gender,count(*), group_concat(name) from heroes where gender=1 group by gender;
-- 計算男性人數,並查看男性都包括誰,以及每個人的id
select gender,count(*), group_concat(name,id) from heroes where gender=1 group by gender;
select gender,count(*), group_concat(name,"_",id," ",age) from heroes where gender=1 group by gender;

-- having
-- where 是從數據表中過濾數據,而having是從分組結果中過濾數據
-- 查詢平均年齡超過40的性別,以及其中包含的人名 having avg(age) > 30
select gender, group_concat(name), avg(age) from heroes group by gender having avg(age) > 30;

-- 查詢人數多於2的性別
select gender, group_concat(name), count(*) from heroes group by gender having count(*) > 2;

七、分頁查詢

-- 例如 網頁中選擇頁數
-- limit start(起始), count(個數)

-- 限制查詢出來的數據個數
select * from heroes where gender=1 limit 2;

-- 查詢前5個數據
select * from heroes limit 0, 5;

-- 查詢id 6-10(包含)的數據(id=1是第0個,id=6是第5個)
select * from heroes limit 5, 5;

-- 每頁顯示2個,顯示第6頁的信息,按照年齡升序排序(limit 放在命令末尾)
select * from heroes order by age asc limit 10, 2;

-- 查詢所有女性信息,按升高降序,只顯示前兩個
-- 報錯,剛開始想的..select gender, group_concat(name), age from heroes having gender=2 limit 2;
select * from heroes where gender=2 order by height desc limit 2;

八、連接查詢

-- 內連接 取多個表的交集,否則不顯示

  -- inner join ... on

  -- select * from 表1 inner join 表2; 將兩張表對應起來
  -- 表1 一行一行的來對應表2 所有行
  select * from heroes inner join groups;

  -- 查詢有能夠對應小隊的的英雄以及小隊信息
  -- select * from 表1 inner join 表2 on 條件;
  select * from heroes inner join groups on heroes.grp_id=groups.id;

  -- 按照要求顯示姓名 小隊
  select heroes.*, groups.name from heroes inner join groups on heroes.grp_id=groups.id;
  select heroes.name, groups.name from heroes inner join groups on heroes.grp_id=groups.id;

  -- 給數據表起別名
  select h.name, g.name from heroes as h inner join groups as g on h.grp_id=g.id;
  select h.name as "英雄", g.name as "小隊" from heroes as h inner join groups as g on h.grp_id=g.id;

  -- 查詢 有能夠對應小隊的英雄以及小隊的信息,顯示英雄的所有信息,只顯示小隊名稱
  select h.*, g.name from heroes as h inner join groups as g on h.grp_id=g.id;

  -- 在以上的查詢中,將小隊名字顯示在第一列
  select g.name, h.* from heroes as h inner join groups as g on h.grp_id=g.id;

  -- 查詢有能夠對應小隊的的英雄以及小隊信息,按照小隊進行排序,當小隊相同時,按英雄的id 升序排序
  select g.name, h.* from heroes as h inner join groups as g on h.grp_id=g.id order by g.name,h.id;


-- 左連接:以左邊的表為基準去從右面的表取東西
  -- left join
  -- 查詢每位英雄對應的小組信息
  select h.*, g.name from heroes as h left join groups as g on h.grp_id=g.id order by g.name,h.id;
  select h.*, g.name from heroes as h left join groups as g on h.grp_id=g.id;
  select * from heroes as h left join groups as g on h.grp_id=g.id;

  -- 查詢沒有對應班級信息的學生
  select * from heroes as h left join groups as g on h.grp_id=g.id having g.id is null;
  select * from heroes as h left join groups as g on h.grp_id=g.id where g.id is null;

-- 右連接
  -- right join...on  用的很少
  -- 將數據表名字互換位置,用left join即可完成

九、子查詢

-- select 中套著一個select
-- 查詢最高的男英雄的信息
select * from heroes where height = (select max(height) from heroes where gender=1);

十、自關聯

-- 一個表通過更改別名,當做兩個表使用
-- select * from 表1 as 表A inner join 表1 as 表B on 表A.xxx=表B.yyy having 條件;

# 和時間賽跑

MySQL數據庫 | 數據表-查詢命令詳細記錄