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. C# 二进制文件操作(内容搜索、数据截取)

    private void button2_Click(object sender, EventArgs e) { var list = new List<Frame>(); byte[] ...

  2. 3*0.1 == 0.3 将会返回什么?true 还是 false?

    false,因为有些浮点数不能完全精确的表示出来 public static void main(String[] args) { System.out.println(3 * 0.1); Syste ...

  3. HTTP场景应用

    一.HTTP缓存控制小结 http://imweb.io/topic/5795dcb6fb312541492eda8c 二.透过浏览器看HTTP缓存 http://www.cnblogs.com/sk ...

  4. Ubuntu系统Python3相关环境或模块安装

    前提:一般用户安装都命令前都需要sudo ,或者在root用户下 1.Ubuntu 16.04 安装PyCharm Ubuntu 16.04 安装PyCharm 本文通过第三方源安装PyCharm,好 ...

  5. 23种设计模式UML图

  6. UTF-8具体解释

    UTF-8是一种变长字节的编码方式.它以8位(1字节)为单位对Unicode进行编码. UTF-8理论上最多能够达到6字节长.但眼下全世界的字符仅仅须要4字节就能够表示完. UTF-8规定,对于某一字 ...

  7. Leetcode 之 Valid Triangle Number

    611. Valid Triangle Number 1.Problem Given an array consists of non-negative integers, your task is ...

  8. 在Docker上安装配置Oracle教程

    地址:https://github.com/wnameless/docker-oracle-xe-11g Docker shell 下: docker pull wnameless/oracle-xe ...

  9. Java-idea-生成JavaDoc

    1.选中要生成的doc模块 2.选择Tools→Generate JavaDoc 3.填写一下信息 1. 选择是整个项目还是模块还是单个文件 2. 文档输出路径 4. 传入JavaDoc的参数,一般这 ...

  10. Differences between Python2 and Python3

    @1:str, repr和反引号是Python将值转为字符串的3种方法repr创建一个字符串,它以合法的Python表达式的形式表示该字符串.Python2还有反引号`,但Python3中没有反引号, ...