4:数据库查询进阶

总体内容

一、数据准备、基本的查询

二、条件查询

三、排序

四、聚合、分组

五、分页

六、连接查询(多表的时候有用,单表的时候几乎没有用)

七、自关联

八、子查询

九、总结

一、数据准备、基本的查询

1.1、创建数据库 (pythonTestDataBase: 数据库名)

create database pythonTestDataBase charset=utf8;

1.2、 使用数据库(pythonTestDataBase)

use pythonTestDataBase;

1.3、创建两个数据表 animalTable 与 personTable

1.4、查看表结构

desc animalTable;

desc personTable;

1.5、插入一些数据

insert into animalTable values(0, "梅花鹿", 3,"保密",0),(0, "熊猫", 2, "雌",0),(0, "东北虎", 6,"雄",0);

insert into personTable values(0, "小王","保密","黄",0),(0, "小李","男","黑",0),(0, "小杜","女","白",0);

1.6、基本的查询

(1)、查询所有字段

select * from 表名;

(2)、查询指定字段

select 列1,列2,... from 表名;

(3)、使用 as 给字段起别名

select 字段 as 名字.... from 表名;

(4)、select 表名.字段 .... from 表名;

select表名.name,表名.agefrom表名;

(5)、可以通过 as 给表起别名

select 别名.字段 .... from 表名 as 别名;

(6)、消除重复行(distinct 字段)

select distinct gender from personTable;

二、条件查询

2.1、比较运算符(使用 animalTable 表)< > != = >= <=

select * from animalTable where age!=6

2.2、逻辑运算符 and or not 

// 3到12之间的动物信息

select * from animalTable where age>3 and age<12;

2.3、模糊查询(使用 personTable 表),效率比较低

(1)、like:% 替换1个或者多个、_ 替换1个、查询姓名中 以 "关键字名" 开始的名字

% 替换1个或者多个

_ 替换1个

(2)、rlike 正则

2.4、范围查询、null(in not in  between and  not between and )

in (1, 3, 8)表示在一个非连续的范围内

not in 不 非连续 的范围之内

between ... and ...表示在一个连续的范围内

not between ... and ... 表示 不在一个连续的范围内

空(null)判断: 判空is null

理解一个概念: name = null 与 name = "" 的区别,前者是 name没有指向任何地址,后者是指向一个空的地址

判非空 is not null

三、排序 order by 字段,使用 animalTable 表

3.1、order by` 字段

asc 从 小到大 排列,即 升序

desc 从 大到小 排序,即 降序

.2、默认是 升序(第2句与第3句一个意思)

3.3、order by 多个字段

查询年龄在3到12岁之间的雄性动物,按照年龄从小到大排序,如果年龄相同的情况下按照 id 从大到小排序( id 默认是从小到大的)

select * from animalTable where (age between 3 and 12) and gender = "雄" order by age asc,id desc;

3.4、不需要 where 约束

按照年龄从小到大、id 从大到小的排序

select*fromanimalTable order by age asc,id desc;

四、聚合函数、分组

4.1、聚合函数

(1)、count 计算个数

查询雄性有多少人

(2)、最大值 max 与 最小值 min

查询最大的年龄

(3)、求和 sum

求年龄的和

(4)、平均值 avg

求年龄的平均值

select sum(age)/count(*) from animalTable

(5)、四舍五入 round(值 , 保留小数的位数) 小数

计算所有动物的平均年龄,保留2位小数

4.2、分组group by

group by的含义:将查询结果按照1个或多个字段进行分组,字段值相同的为一组

group by可用于单个字段分组,也可用于多个字段分组

(1)、按照性别分组,查询所有的性别

查询所有性别的动物组

(2)、计算每种 性别 中的人数

3)、计算雄性的数量(取出分组中 雄 性的组),根据条件取出分组中的某一个分组

(4)、group by + group_concat()显示分组中的 指定字段

显示分组中的 name

group_concat(字段名)可以作为一个输出字段来使用,

表示分组之后,根据分组结果,使用group_concat()来放置每一组的某字段的值的集合

显示分组中的 name, age, id

由于上面的 name, age, id 混在了一起,我们需要分开他们,看的更直观一些

5)、group by + having

having 条件表达式:用来分组查询后指定一些条件来输出查询结果

having作用和where一样,但having只能用于group by

查询平均年龄超过7岁的性别,以及姓名

select gender, group_concat(name),avg(age) from animalTable group by gender having avg(age)>7;

查询每种性别中的数量多于2个的信息

select gender, group_concat(name) from animalTable group by gender having count(*)>2;

group by + with rollup

with rollup 的作用是:在最后新增一行,来记录当前列里所有记录的总和

五、分页

5.1、当数据量过大时,在一页中查看数据是一件非常麻烦的事情

语法:select * from 表名 limit start,count,解释:start 是页码,count是一页显示的数量

5.2、查询前2行男生信息

5.3、求第n页的数据,每页 m 条数据(不足m条,有多少显示多少条)

六、连接查询(多表的时候有用,单表的时候几乎没有用),当查询结果的列来源于多张表时,需要将多张表连接成一个大的数据集,再选择合适的列返回,mysql支持三种类型的连接查询,分别为:内连接查询、左连接查询、右连接查询(有了左连接,一般不使用右连接)

语法:inner join ... on...

6.1、准备

给 personTable 添加 class_id 字段,并赋值,效果如下

alter table personTable add class_id int unsigned;


6.2、内连接查询:inner join ... on (取交集):查询的结果为两个表匹配到的数据

select ... from 表A inner join 表B;

查询 有能够对应班级的学生以及班级信息

(2)、在上面查询的基础上 按照要求显示姓名、班级:不再使用 *,展示什么: 表名.字段

select personTable.*,classTable.class_name from personTable inner join classTable on personTable.class_id=classTable.id;

// 只显示两个组的名字

select personTable.name,classTable.class_name from personTable inner join classTable on personTable.class_id=classTable.id;

(3)、给数据表 起别名(取表名的首字母)

selectp.name,c.class_namefrompersonTableasp innerjoinclassTableasc on p.class_id=c.id;

(4)、在以上的查询中,将班级姓名显示在第1列(将上面的p.name,c.class_name调换一下顺序)

select c.class_name,p.name from personTable as p inner join classTable as c on p.class_id=c.id;

(5)、查询 有能够对应班级的学生以及班级信息, 按照班级降序进行排序

selectc.class_name,p.namefrompersonTableasp innerjoinclassTableasc on p.class_id=c.id order by c.class_name desc;

6.3、左连接查询:left join (取左边):查询的结果为两个表匹配到的数据,左表特有的数据,对于右表中不存在的数据使用null填充

(1)、查询每位学生对应的班级信息

(2)、查询没有对应班级信息的学生(用having就好,对结果进行处理)

select ... from xxx as s left join xxx as c on..... where .....或者select ... from xxx as s left join xxx as c on..... having .....

select * from personTable left join classTable on personTable.class_id= classTable.id having classTable.class_name is null;

或者 where 来替换 having

select * from personTable left join classTable on personTable.class_id= classTable.id where classTable.class_name is null;

6.4、右连接查询(取右边):查询的结果为两个表匹配到的数据,右表特有的数据,对于左表中不存在的数据使用null填充

提示: 将数据表名字互换位置,用left join完成 right join...on...

七、自关联

7.1、自关联的引用

设计省信息的表结构provinces

citys表的proid表示城市所属的省,对应着provinces表的id值

问题:能不能将两个表合成一张表呢?

思考:观察两张表发现,citys表比provinces表多一个列proid,其它列的类型都是一样的

意义:存储的都是地区信息,而且每种信息的数据量有限,没必要增加一个新表,或者将来还要存储区、乡镇信息,都增加新表的开销太大

答案:定义表areas,结构如下

说明:

因为省没有所属的省份,所以可以填写为null

城市所属的省份pid,填写省所对应的编号id

这就是自关联,表中的某一列,关联了这个表中的另外一列,但是它们的业务逻辑含义是不一样的,城市信息的pid引用的是省信息的id

在这个表中,结构不变,可以添加区县、乡镇街道、村社区等信息

7.1、准备工作

把本地的 city.sql(地区文件内容) 拷贝到 服务器root家目录下,下面代码:前面的city.sql 是本地的路径,后面的是服务器的路径,我是直接放到了 root的家目下

scp -P 22 city.sql root@47.93.240.8: city.sql

7.2、查询出山东省有哪些市

select * from city as province inner join city as citys on citys.pid=province.aid having province.atitle="山东省";

select province.atitle, citys.atitle from city as province inner join city as citys on citys.pid=province.aid having province.atitle="山东省";

7.3、 查询出青岛市有哪些县城

select province.atitle, citys.atitle from city as province inner join city as citys on citys.pid=province.aid having province.atitle="青岛市";

select * from city where pid=(select aid from city where atitle="青岛市")

八、子查询

8.1、 子查询 与 主查询

子查询语句:在一个 select 语句中,嵌入了另外一个 select 语句, 那么被嵌入的 select 语句。

主查询:主要查询的对象,第一条 select 语句。

主查询 和 子查询 的关系

子查询是嵌入到主查询中

子查询是辅助主查询的,要么充当条件,要么充当数据源

子查询是可以独立存在的语句,是一条完整的 select 语句

8.2、子查询分类

标量子查询: 子查询返回的结果是一个数据(一行一列)

列子查询: 返回的结果是一列(一列多行)

行子查询: 返回的结果是一行(一行多列)

8.3、标量子查询

查询动物的平均年龄

8.4、列级子查询

查询还有学生在班的所有班级名字

找出学生表中所有的班级 id

找出班级表中对应的名字

select class_name from classTable where id in (select class_id from personTable);

8.5、行级子查询

需求: 查找班级年龄最大,身高最高的学生

行元素: 将多个字段合成一个行元素,在行级子查询中会使用到行元素

select * from students where (height,age) = (select max(height),max(age) from students);

8.6、子查询中特定关键字使用

in 范围

格式: 主查询 where 条件 in (列子查询)

九、总结

9.1、查询的完整格式

9.3、执行顺序为:

from 表名

where ....

group by ...

select distinct *

having ...

order by ...

limit start,count

9.4、实际使用中,只是语句中某些部分的组合,而不是全部

作者:IIronMan

链接:https://www.jianshu.com/p/8caca10f055a

来源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容