mysql数据库优化课程---12、mysql嵌套和链接查询

一、总结

一句话总结:查询user表中存在的所有班级的信息?

in
distinct

mysql> select * from class where id in(select distinct class_id from user);
+----+--------+------------+
| id | name   | ctime      |
+----+--------+------------+
|  1 | class1 | 1492086867 |
|  2 | class2 | 1492086867 |
|  3 | class3 | 1492086867 |
+----+--------+------------+

1、询user表中存在的所有班级的信息?

in
distinct

mysql> select * from class where id in(select distinct class_id from user);
+----+--------+------------+
| id | name   | ctime      |
+----+--------+------------+
|  1 | class1 | 1492086867 |
|  2 | class2 | 1492086867 |
|  3 | class3 | 1492086867 |
+----+--------+------------+

2、查询班级表中每个班的所有学员信息?

mysql> select * from user where class_id in(select id from class);
+----+----------+-----+----------+
| id | username | age | class_id |
+----+----------+-----+----------+
|  1 | user1    |  19 |        1 |
|  2 | user2    |  19 |        1 |
|  3 | user3    |  19 |        1 |
|  4 | user4    |  19 |        1 |
|  5 | user5    |  19 |        2 |
|  6 | user6    |  19 |        3 |
|  7 | user7    |  19 |        2 |
|  8 | user8    |  19 |        1 |
|  9 | user9    |  19 |        2 |
| 10 | user10   |  19 |        3 |
| 11 | user10   |  19 |        4 |
+----+----------+-----+----------+

3、嵌套查询为什么用的少?

因为嵌套查询能做到的普通多表查询和链接查询一般都能做到

4、请统计每个班的总人数?

需求6:请统计每个班的总人数?

1)错误答案
mysql> select class_id,count(*) from user group by class_id;
+----------+----------+
| class_id | count(*) |
+----------+----------+
|        1 |        5 |
|        2 |        3 |
|        3 |        2 |
+----------+----------+

2)正确答案
mysql> select class.name,count(user.id) tot  from class left join user on class.id=user.class_id group by class.id;
+--------+-----+
| name   | tot |
+--------+-----+
| class1 |   5 |
| class2 |   3 |
| class3 |   2 |
| class4 |   0 |
+--------+-----+

3)正确答案
mysql> select class.name,count(user.id) tot  from user right join class on class.id=user.class_id group by class.id;
+--------+-----+
| name   | tot |
+--------+-----+
| class1 |   5 |
| class2 |   3 |
| class3 |   2 |
| class4 |   0 |
+--------+-----+

5、嵌套查询和索引的关系?

嵌套查询里面或者外面的索引会失效,所以嵌套查询没有链接查询速度快

6、count(id)的用处在哪?

left连接之后统计班级人数,就是这个class4的0人,这里用count(*)就不行

需求6:请统计每个班的总人数?

mysql> select class.name,count(user.id) tot  from class left join user on class.id=user.class_id group by class.id;
+--------+-----+
| name   | tot |
+--------+-----+
| class1 |   5 |
| class2 |   3 |
| class3 |   2 |
| class4 |   0 |
+--------+-----+

7、链接查询的条件字段是什么?

on

需求6:请统计每个班的总人数?

mysql> select class.name,count(user.id) tot  from class left join user on class.id=user.class_id group by class.id;
+--------+-----+
| name   | tot |
+--------+-----+
| class1 |   5 |
| class2 |   3 |
| class3 |   2 |
| class4 |   0 |
+--------+-----+

8、链接查询和普通多表查询的区别是什么?

需求7: 查询每个用户的用户名和对应的班级名称?
1)正确答案(内链接)
mysql> select user.username,class.name from user inner join class on class.id=user.class_id;
+----------+--------+
| username | name   |
+----------+--------+
| user1    | class1 |
| user2    | class1 |
| user3    | class1 |
| user4    | class1 |
| user5    | class2 |
| user6    | class3 |
| user7    | class2 |
| user8    | class1 |
| user9    | class2 |
| user10   | class3 |
+----------+--------+

2)正确答案(普通多表查询)
mysql> select user.username,class.name from user,class where user.class_id=class.id;
+----------+--------+
| username | name   |
+----------+--------+
| user1    | class1 |
| user2    | class1 |
| user3    | class1 |
| user4    | class1 |
| user5    | class2 |
| user6    | class3 |
| user7    | class2 |
| user8    | class1 |
| user9    | class2 |
| user10   | class3 |
+----------+--------+

二、内容在总结中

mysql多表查询:
1.普通多表查询
2.嵌套查询或子查询
3.链接查询
1)左链接
2)右链接
3)内链接

查看class表数据:
mysql> select * from class;
+----+--------+------------+
| id | name   | ctime      |
+----+--------+------------+
|  1 | class1 | 1492086867 |
|  2 | class2 | 1492086867 |
|  3 | class3 | 1492086867 |
+----+--------+------------+

查看user表数据:
mysql> select * from user;
+----+----------+-----+
| id | username | age |
+----+----------+-----+
|  1 | user1    |  19 |
|  2 | user2    |  29 |
|  3 | user3    |  31 |
|  4 | user4    |  22 |
|  5 | user5    |  23 |
|  6 | user6    |  18 |
|  7 | user7    |  17 |
|  8 | user8    |  25 |
|  9 | user9    |  27 |
| 10 | user10   |  32 |
+----+----------+-----+

两表无条件查询:
mysql> select * from class,user;
+----+--------+------------+----+----------+-----+
| id | name   | ctime      | id | username | age |
+----+--------+------------+----+----------+-----+
|  1 | class1 | 1492086867 |  1 | user1    |  19 |
|  2 | class2 | 1492086867 |  1 | user1    |  19 |
|  3 | class3 | 1492086867 |  1 | user1    |  19 |
|  4 | class4 | 1492087405 |  1 | user1    |  19 |
|  1 | class1 | 1492086867 |  2 | user2    |  29 |
|  2 | class2 | 1492086867 |  2 | user2    |  29 |
|  3 | class3 | 1492086867 |  2 | user2    |  29 |
|  4 | class4 | 1492087405 |  2 | user2    |  29 |
|  1 | class1 | 1492086867 |  3 | user3    |  31 |
|  2 | class2 | 1492086867 |  3 | user3    |  31 |
|  3 | class3 | 1492086867 |  3 | user3    |  31 |
|  4 | class4 | 1492087405 |  3 | user3    |  31 |
|  1 | class1 | 1492086867 |  4 | user4    |  22 |
|  2 | class2 | 1492086867 |  4 | user4    |  22 |
|  3 | class3 | 1492086867 |  4 | user4    |  22 |
|  4 | class4 | 1492087405 |  4 | user4    |  22 |
|  1 | class1 | 1492086867 |  5 | user5    |  23 |
|  2 | class2 | 1492086867 |  5 | user5    |  23 |
|  3 | class3 | 1492086867 |  5 | user5    |  23 |
|  4 | class4 | 1492087405 |  5 | user5    |  23 |
|  1 | class1 | 1492086867 |  6 | user6    |  18 |
|  2 | class2 | 1492086867 |  6 | user6    |  18 |
|  3 | class3 | 1492086867 |  6 | user6    |  18 |
|  4 | class4 | 1492087405 |  6 | user6    |  18 |
|  1 | class1 | 1492086867 |  7 | user7    |  17 |
|  2 | class2 | 1492086867 |  7 | user7    |  17 |
|  3 | class3 | 1492086867 |  7 | user7    |  17 |
|  4 | class4 | 1492087405 |  7 | user7    |  17 |
|  1 | class1 | 1492086867 |  8 | user8    |  25 |
|  2 | class2 | 1492086867 |  8 | user8    |  25 |
|  3 | class3 | 1492086867 |  8 | user8    |  25 |
|  4 | class4 | 1492087405 |  8 | user8    |  25 |
|  1 | class1 | 1492086867 |  9 | user9    |  27 |
|  2 | class2 | 1492086867 |  9 | user9    |  27 |
|  3 | class3 | 1492086867 |  9 | user9    |  27 |
|  4 | class4 | 1492087405 |  9 | user9    |  27 |
|  1 | class1 | 1492086867 | 10 | user10   |  32 |
|  2 | class2 | 1492086867 | 10 | user10   |  32 |
|  3 | class3 | 1492086867 | 10 | user10   |  32 |
|  4 | class4 | 1492087405 | 10 | user10   |  32 |
+----+--------+------------+----+----------+-----+

结论:
1.两表数据进行所有组合.
2.数据量是两表条数乘积.

设计了关系的user表:
mysql> select * from user;
+----+----------+-----+----------+
| id | username | age | class_id |
+----+----------+-----+----------+
|  1 | user1    |  19 |        1 |
|  2 | user2    |  19 |        1 |
|  3 | user3    |  19 |        1 |
|  4 | user4    |  19 |        1 |
|  5 | user5    |  19 |        2 |
|  6 | user6    |  19 |        3 |
|  7 | user7    |  19 |        2 |
|  8 | user8    |  19 |        1 |
|  9 | user9    |  19 |        2 |
| 10 | user10   |  19 |        3 |
+----+----------+-----+----------+

需求1:请查询出每一个学员的姓名、年龄、班级名称和班级创建时间?
mysql> select user.username,user.age,class.name,class.ctime from user,class where user.class_id=class.id;
+----------+-----+--------+------------+
| username | age | name   | ctime      |
+----------+-----+--------+------------+
| user1    |  19 | class1 | 1492086867 |
| user2    |  19 | class1 | 1492086867 |
| user3    |  19 | class1 | 1492086867 |
| user4    |  19 | class1 | 1492086867 |
| user5    |  19 | class2 | 1492086867 |
| user6    |  19 | class3 | 1492086867 |
| user7    |  19 | class2 | 1492086867 |
| user8    |  19 | class1 | 1492086867 |
| user9    |  19 | class2 | 1492086867 |
| user10   |  19 | class3 | 1492086867 |
+----------+-----+--------+------------+

需求2:请查询出每一个学员的姓名、年龄、班级名称和班级创建时间,并把时间戳转成正常日期显示出来?
mysql> select user.username,user.age,class.name,from_unixtime(class.ctime) ctime from user,class where user.class_id=class.id;
+----------+-----+--------+---------------------+
| username | age | name   | ctime               |
+----------+-----+--------+---------------------+
| user1    |  19 | class1 | 2017-04-13 20:34:27 |
| user2    |  19 | class1 | 2017-04-13 20:34:27 |
| user3    |  19 | class1 | 2017-04-13 20:34:27 |
| user4    |  19 | class1 | 2017-04-13 20:34:27 |
| user5    |  19 | class2 | 2017-04-13 20:34:27 |
| user6    |  19 | class3 | 2017-04-13 20:34:27 |
| user7    |  19 | class2 | 2017-04-13 20:34:27 |
| user8    |  19 | class1 | 2017-04-13 20:34:27 |
| user9    |  19 | class2 | 2017-04-13 20:34:27 |
| user10   |  19 | class3 | 2017-04-13 20:34:27 |
+----------+-----+--------+---------------------+

需求3:请查询出每一个学员的姓名、年龄、班级名称和班级创建时间,并且只查询1班学员?
mysql> select user.username,user.age,class.name,class.ctime from user,class where user.class_id=class.id and class.id=1;
+----------+-----+--------+------------+
| username | age | name   | ctime      |
+----------+-----+--------+------------+
| user1    |  19 | class1 | 1492086867 |
| user2    |  19 | class1 | 1492086867 |
| user3    |  19 | class1 | 1492086867 |
| user4    |  19 | class1 | 1492086867 |
| user8    |  19 | class1 | 1492086867 |
+----------+-----+--------+------------+

需求4:查询user表中存在的所有班级的信息?
mysql> select * from class where id in(select distinct class_id from user);
+----+--------+------------+
| id | name   | ctime      |
+----+--------+------------+
|  1 | class1 | 1492086867 |
|  2 | class2 | 1492086867 |
|  3 | class3 | 1492086867 |
+----+--------+------------+

需求5:查询班级表中每个班的所有学员信息?
mysql> select * from user where class_id in(select id from class);
+----+----------+-----+----------+
| id | username | age | class_id |
+----+----------+-----+----------+
|  1 | user1    |  19 |        1 |
|  2 | user2    |  19 |        1 |
|  3 | user3    |  19 |        1 |
|  4 | user4    |  19 |        1 |
|  5 | user5    |  19 |        2 |
|  6 | user6    |  19 |        3 |
|  7 | user7    |  19 |        2 |
|  8 | user8    |  19 |        1 |
|  9 | user9    |  19 |        2 |
| 10 | user10   |  19 |        3 |
| 11 | user10   |  19 |        4 |
+----+----------+-----+----------+

左链接:
需求6:请统计每个班的总人数?

1)错误答案
mysql> select class_id,count(*) from user group by class_id;
+----------+----------+
| class_id | count(*) |
+----------+----------+
|        1 |        5 |
|        2 |        3 |
|        3 |        2 |
+----------+----------+

2)正确答案
mysql> select class.name,count(user.id) tot  from class left join user on class.id=user.class_id group by class.id;
+--------+-----+
| name   | tot |
+--------+-----+
| class1 |   5 |
| class2 |   3 |
| class3 |   2 |
| class4 |   0 |
+--------+-----+

3)正确答案
mysql> select class.name,count(user.id) tot  from user right join class on class.id=user.class_id group by class.id;
+--------+-----+
| name   | tot |
+--------+-----+
| class1 |   5 |
| class2 |   3 |
| class3 |   2 |
| class4 |   0 |
+--------+-----+

需求7: 查询每个用户的用户名和对应的班级名称?
1)正确答案(内链接)
mysql> select user.username,class.name from user inner join class on class.id=user.class_id;
+----------+--------+
| username | name   |
+----------+--------+
| user1    | class1 |
| user2    | class1 |
| user3    | class1 |
| user4    | class1 |
| user5    | class2 |
| user6    | class3 |
| user7    | class2 |
| user8    | class1 |
| user9    | class2 |
| user10   | class3 |
+----------+--------+

2)正确答案(普通多表查询)
mysql> select user.username,class.name from user,class where user.class_id=class.id;
+----------+--------+
| username | name   |
+----------+--------+
| user1    | class1 |
| user2    | class1 |
| user3    | class1 |
| user4    | class1 |
| user5    | class2 |
| user6    | class3 |
| user7    | class2 |
| user8    | class1 |
| user9    | class2 |
| user10   | class3 |
+----------+--------+

 

mysql数据库优化课程---12、mysql嵌套和链接查询的更多相关文章

  1. mysql数据库优化课程---18、mysql服务器优化

    mysql数据库优化课程---18.mysql服务器优化 一.总结 一句话总结: 1.四种字符集问题:字符集都设置为utf-82.slow log慢查询日志问题3.root密码丢失 1.mysql存在 ...

  2. mysql数据库优化课程---11、mysql普通多表查询

    mysql数据库优化课程---11.mysql普通多表查询 一.总结 一句话总结:select user.username,user.age,class.name,class.ctime from u ...

  3. mysql数据库优化课程---2、命令其实也就是那几个单词

    mysql数据库优化课程---2.命令其实也就是那几个单词 一.总结 一句话总结: 比如show,use,alter 1.开启和关闭mysql服务? Windows下:net start/stop m ...

  4. mysql数据库优化课程---17、mysql索引优化

    mysql数据库优化课程---17.mysql索引优化 一.总结 一句话总结:一些字段可能会使索引失效,比如like,or等 1.check表监测的使用场景是什么? 视图 视图建立在两个表上, 删除了 ...

  5. mysql数据库优化课程---16、mysql慢查询和优化表空间

    mysql数据库优化课程---16.mysql慢查询和优化表空间 一.总结 一句话总结: a.慢查询的话找到存储慢查询的那个日志文件 b.优化表空间的话可以用optimize table sales; ...

  6. mysql数据库优化课程---15、mysql优化步骤

    mysql数据库优化课程---15.mysql优化步骤 一.总结 一句话总结:索引优化最立竿见影 1.mysql中最常用最立竿见影的优化是什么? 索引优化 索引优化,不然有多少行要扫描多少次,1亿行大 ...

  7. mysql数据库优化课程---14、常用的sql技巧

    mysql数据库优化课程---14.常用的sql技巧 一.总结 一句话总结:其实就是sql中那些函数的使用 1.mysql中函数如何使用? 选择字段 其实就是作用域select的选择字段 3.转大写: ...

  8. mysql数据库优化课程---13、mysql基础操作

    mysql数据库优化课程---13.mysql基础操作 一.总结 一句话总结:mysql复制表,索引,视图 1.mysql如何复制表? like select * 1.复制表结构 create tab ...

  9. mysql数据库优化课程---10、mysql数据库分组聚合

    mysql数据库优化课程---10.mysql数据库分组聚合 一.总结 一句话总结:select concat(class,' 班') 班级,concat(count(*),' 人') 人数 from ...

随机推荐

  1. 01Go开发环境搭建(参考无闻大神)

    一直安装下一步就可以了 GOPATH是工作目录 GOROOT是安装目录 如果有多个工作目录,就需要我们用分号进行分隔

  2. wire_format.cc:1091] String field 'accountid' contains invalid UTF-8 data when serializing a protocol buffer. Use the 'bytes' type if you intend to send raw bytes.

    原因: 在protobuf 的string字段中存在中文,序列化的时候会出现截断数据,string这个类型带有检查功能 解决方法: 把protobuf中存在中文的string字段类型 改为bytes ...

  3. pro-select-limit-if

    drop procedure if exists p9; CREATE PROCEDURE p9 () BEGIN DECLARE a INT; DECLARE b INT; DECLARE c IN ...

  4. 微信商城 Common Log Format Apache CustomLog

    w 0- /Apr/::: +] "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, ...

  5. C#中Windows通用的回车转Tab方法

    标签: windowsc#textboxbuttondropdownobject 2007-03-28 09:37 2773人阅读 评论(0) 收藏 举报  分类: C#(5)  版权声明:本文为博主 ...

  6. 【转】spring和springMVC的面试问题总结

    1.Spring中AOP的应用场景.Aop原理.好处? 答:AOP--Aspect Oriented Programming面向切面编程:用来封装横切关注点,具体可以在下面的场景中使用: Authen ...

  7. python装饰器的学习笔记

    此博文是我对装饰器的一些理解,如果有错误欢迎及时留言,我会第一时间向大家学习. 一.什么是装饰器 1.从字面意义来看: 是用来给函数装饰打扮的函数 2.理论上可以理解为: (1).不改变函数的运行方式 ...

  8. 3.Write Scripts for the mongo Shell-官方文档摘录

    总结 1 使用js进行获取数据的方法 2 js方式和原生mongo shell的交互方式的区别写法 3 需要将所有数据打印出来使用到的循环示例 cursor = db.collection.find( ...

  9. Virtualbox报错------>make sure the kernel module has been loaded successfully

    错误描述 很久没有用virtualbox了,今天打算在virtualbox上安装一个Ubuntu系统的时候,新建好Ubuntu后启动的时候,直接报错: Cannot access the kernel ...

  10. 搜狐云景client工具评測之WordPress的搭建

    搜狐云景是搜狐推出的一款PaaS产品,眼下还处在公測阶段,拿到邀请码后试用了一下,感觉还不错. 搜狐云景提供了四种方式部署应用,感觉应该能够满足各种口味的码农:1. zip包的形式在网页上传并部署   ...