MySQL數據庫 | 數據表-查詢命令詳細記錄
阿新 • • 發佈:2019-01-10
語句 意義 四舍五入 生效 多少 運算符 star ima 指定字段
本篇專門記錄數據庫增刪改查中最常用、花招最多的 查。
【文章結構】
一、數據的準備
二、基本的查詢功能
三、條件查詢
四、查詢排序
五、聚合函數
六、分組查詢
七、分頁查詢
八、連接查詢
九、子查詢
十、自關聯
【正文】
一、數據的準備
首先創建一個數據庫,以便後文命令的使用。
-- 創建一個數據庫 create database pysql charset=utf8; -- 使用數據庫 use pysql; -- 查看當前使用的是哪個數據庫 select database(); -- 創建數據表groups, heroes create table groups ( idint 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_idint 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數據庫 | 數據表-查詢命令詳細記錄