• 04 数据库入门学习-单表查询、多表查询、子查询


    1.复制表

    复制代码
    #创建了一张测试表
    mysql>create table test (id int primary key auto_increment,name char(10));
    
    #显示原表结构
    mysql> desc test;
    +-------+----------+------+-----+---------+----------------+
    | Field | Type     | Null | Key | Default | Extra          |
    +-------+----------+------+-----+---------+----------------+
    | id    | int(11)  | NO   | PRI | NULL    | auto_increment |
    | name  | char(10) | YES  |     | NULL    |                |
    +-------+----------+------+-----+---------+----------------+
    
    #显示原表数据
    mysql> select *from test;
    +----+------+
    | id | name |
    +----+------+
    |  1 | a    |
    +----+------+
    
    
    #复制表
    mysql> create table copy select *from test;
    
    #显示复制表的结构
    mysql> desc copy;
    +-------+----------+------+-----+---------+-------+
    | Field | Type     | Null | Key | Default | Extra |
    +-------+----------+------+-----+---------+-------+
    | id    | int(11)  | NO   |     | 0       |       |
    | name  | char(10) | YES  |     | NULL    |       |
    +-------+----------+------+-----+---------+-------+
    
    #显示复制表的数据
    mysql> select *from copy;
    +----+------+
    | id | name |
    +----+------+
    |  1 | a    |
    +----+------+
    复制代码

    总结:复制表,只是拷贝结构与数据,但是索引、 描述不能拷贝(自增)

    2.单表查询

    2.1完整的查询语句 

    复制代码
    #[]可选    {}必选   |或
    
    select [distinct] {* | 字段名 | 聚合函数 | 表达式} from 表名
    [where 条件
    group by 字段名
    having 条件
    order by 字段名
    limit 显示的条数]
    
    #注意:关键字的顺序必须与上述语法一致
    复制代码

    2.2执行顺序

    1.from,先找到文件/表

    2.where,拿着where的约束条件,与文件/表中的记录依次比较,正确的数据取出来

    3.group,对取出来的数据进行分组

    4.having,对分组的数据进行过滤

    5.distinct,去重

    6.order by,对筛选后的数据排序

    7.limit,限制结果的显示条数

    2.3简单查询

    复制代码
    #准备表
    create table stu(id int primary key auto_increment,name char(10),math float,english float); 
    insert into stu values(null,"赵云",90,30);
    insert into stu values(null,"小乔",90,60);
    insert into stu values(null,"小乔",90,60);
    insert into stu values(null,"大乔",10,70);
    insert into stu values(null,"李清照",100,100);
    insert into stu values(null,"铁拐李",20,55);
    insert into stu values(null,"小李子",20,55); mysql> select *from stu; +----+-----------+------+---------+ | id | name | math | english | +----+-----------+------+---------+ | 1 | 赵云 | 90 | 30 | | 2 | 小乔 | 90 | 60 | | 3 | 小乔 | 90 | 60 | | 4 | 大乔 | 10 | 70 | | 5 | 李清照 | 100 | 100 | | 6 | 铁拐李 | 20 | 55 | | 7 | 小李子 | 20 | 55 | +----+-----------+------+---------+ #避免重复 mysql> select distinct name from stu; +-----------+ | name | +-----------+ | 赵云 | | 小乔 | | 大乔 | | 李清照 | | 铁拐李 | | 小李子 | +-----------+ #四则运算 mysql> select name,math+10 as math from stu; +-----------+------+ | name | math | +-----------+------+ | 赵云 | 100 | | 小乔 | 100 | | 小乔 | 100 | | 大乔 | 20 | | 李清照 | 110 | | 铁拐李 | 30 | | 小李子 | 30 | +-----------+------+ #显示格式 mysql> select -> concat("name:",name), -> concat("english:",english), -> concat("math:",math) -> from stu; +----------------------+----------------------------+----------------------+ | concat("name:",name) | concat("english:",english) | concat("math:",math) | +----------------------+----------------------------+----------------------+ | name:赵云 | english:30 | math:90 | | name:小乔 | english:60 | math:90 | | name:小乔 | english:60 | math:90 | | name:大乔 | english:70 | math:10 | | name:李清照 | english:100 | math:100 | | name:铁拐李 | english:55 | math:20 | | name:小李子 | english:55 | math:20 | +----------------------+----------------------------+----------------------+
    复制代码

    2.4 where

    1. 比较运算符:> < >= <= <> !=
    2. between 80 and 100 值在80到100之间
    3. in(80,90,100) 值是80或90或100
    4. like 'egon[%|_]'
        %表示任意多字符
        _表示一个字符 
    5. 逻辑运算符:在多个条件直接可以使用逻辑运算符 and or not

    复制代码
    +----+-----------+------+---------+
    | id | name      | math | english |
    +----+-----------+------+---------+
    |  1 | 赵云      |   90 |      30 |
    |  2 | 小乔      |   90 |      60 |
    |  3 | 小乔      |   90 |      60 |
    |  4 | 大乔      |   10 |      70 |
    |  5 | 李清照    |  100 |     100 |
    |  6 | 铁拐李    |   20 |      55 |
    |  7 | 小李子    |   20 |      55 |
    +----+-----------+------+---------+
    
    
    #1. 比较运算符:> < >= <= <> !=
    mysql> select *from stu where math>70;
    +----+-----------+------+---------+
    | id | name      | math | english |
    +----+-----------+------+---------+
    |  1 | 赵云      |   90 |      30 |
    |  2 | 小乔      |   90 |      60 |
    |  3 | 小乔      |   90 |      60 |
    |  5 | 李清照    |  100 |     100 |
    +----+-----------+------+---------+
    
    #2. between and 
    mysql> select *from stu where math between 80 and 100 ;
    +----+-----------+------+---------+
    | id | name      | math | english |
    +----+-----------+------+---------+
    |  1 | 赵云      |   90 |      30 |
    |  2 | 小乔      |   90 |      60 |
    |  3 | 小乔      |   90 |      60 |
    |  5 | 李清照    |  100 |     100 |
    +----+-----------+------+---------+
    
    #3. in
    mysql> select *from stu where math in (80,90,100) ;
    +----+-----------+------+---------+
    | id | name      | math | english |
    +----+-----------+------+---------+
    |  1 | 赵云      |   90 |      30 |
    |  2 | 小乔      |   90 |      60 |
    |  3 | 小乔      |   90 |      60 |
    |  5 | 李清照    |  100 |     100 |
    +----+-----------+------+---------+
    
    #4. like %或_
    mysql> select *from stu where name like '小_' ;
    +----+--------+------+---------+
    | id | name   | math | english |
    +----+--------+------+---------+
    |  2 | 小乔   |   90 |      60 |
    |  3 | 小乔   |   90 |      60 |
    +----+--------+------+---------+
    
    mysql> select *from stu where name like '李%' ;
    +----+-----------+------+---------+
    | id | name      | math | english |
    +----+-----------+------+---------+
    |  5 | 李清照    |  100 |     100 |
    +----+-----------+------+---------+
    
    
    #5. and or not
    mysql> select *from stu where math=90 and english=60;
    +----+--------+------+---------+
    | id | name   | math | english |
    +----+--------+------+---------+
    |  2 | 小乔   |   90 |      60 |
    |  3 | 小乔   |   90 |      60 |
    +----+--------+------+---------+
    复制代码

    2.5 group by

    用于给数据分组

      1.在生活中是为了方便管理
      2.在数据库中是为了 方便统计

    可以按照任意字段分组,但是分组完毕后,只能查看分组的字段,如果想查看组内信息,需要借助于聚合函数

    聚合函数:
      将一堆数据经过计算,得到一个数据
      sum() 求和
      avg() 求平均数
      max()/min() 求最大值 / 最小值
      count() 个数

    复制代码
    #由于没有设置ONLY_FULL_GROUP_BY,于是也可以有结果,默认都是组内的第一条记录,但其实这是没有意义的
    
    mysql> set global sql_mode='ONLY_FULL_GROUP_BY';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> quit #设置成功后,一定要退出,然后重新登录方可生效
    
    
    #准备数据
    create table emp (id int,name char(10),sex char,dept char(10),job char(10),salary double);
    insert into emp values (1,"刘备","男","市场","总监",5800),
    (2,"张飞","男","市场","员工",3000),
    (3,"关羽","男","市场","员工",4000),
    (4,"孙权","男","行政","总监",6000),
    (5,"周瑜","男","行政","员工",5000),
    (6,"小乔","女","行政","员工",4000),
    (7,"曹操","男","财务","总监",10000),
    (8,"司马懿","男","财务","员工",6000);
    
    #查询每个部门有几个人
    mysql> select dept,count(*)as 人数  from emp group by dept;
    +--------+--------+
    | dept   | 人数   |
    +--------+--------+
    | 市场   |      3 |
    | 行政   |      3 |
    | 财务   |      2 |
    +--------+--------+
    
    #计算每个部门的平均工资
    mysql> select dept,avg(salary)as 平均工资  from emp group by dept;
    +--------+-------------------+
    | dept   | 平均工资          |
    +--------+-------------------+
    | 市场   | 4266.666666666667 |
    | 行政   |              5000 |
    | 财务   |              8000 |
    +--------+-------------------+
    复制代码

    2.6 having

    用于对分组后的数据进行过滤
    1. having不会单独出现 都是和group by 一起出现

    2. where 发生在分组group by之前,因而Where中可以有任意字段,但是绝对不能使用聚合函数。

    3. having发生在分组group by之后,因而Having中可以使用分组的字段,无法直接取到其他字段,可以使用聚合函数

    复制代码
    #准备数据
    mysql> create table emp (id int,name char(10),sex char,dept char(10),job char(10),salary double);
    
    mysql> insert into emp values (1,"刘备","男","市场","总监",5800),
        -> (2,"张飞","男","市场","员工",3000),
        -> (3,"关羽","男","市场","员工",4000),
        -> (4,"孙权","男","行政","总监",6000),
        -> (5,"周瑜","男","行政","员工",5000),
        -> (6,"小乔","女","行政","员工",4000),
        -> (7,"曹操","男","财务","总监",10000),
        -> (8,"司马懿","男","财务","员工",6000);
    
    mysql> select *from emp;
    +------+-----------+------+--------+--------+--------+
    | id   | name      | sex  | dept   | job    | salary |
    +------+-----------+------+--------+--------+--------+
    |    1 | 刘备      | 男   | 市场   | 总监   |   5800 |
    |    2 | 张飞      | 男   | 市场   | 员工   |   3000 |
    |    3 | 关羽      | 男   | 市场   | 员工   |   4000 |
    |    4 | 孙权      | 男   | 行政   | 总监   |   6000 |
    |    5 | 周瑜      | 男   | 行政   | 员工   |   5000 |
    |    6 | 小乔      | 女   | 行政   | 员工   |   4000 |
    |    7 | 曹操      | 男   | 财务   | 总监   |  10000 |
    |    8 | 司马懿    | 男   | 财务   | 员工   |   6000 |
    +------+-----------+------+--------+--------+--------+
    
    #查询平均工资大于5000的部门
    mysql> select dept,avg(salary)as 平均工资  from emp group by dept having avg(salary)>5000;
    +--------+--------------+
    | dept   | 平均工资     |
    +--------+--------------+
    | 财务   |         8000 |
    +--------+--------------+
    
    
    #查询每个职位有多少人
    mysql> select job,count(*)as 人数  from emp group by job;
    +--------+--------+
    | job    | 人数   |
    +--------+--------+
    | 员工   |      5 |
    | 总监   |      3 |
    +--------+--------+
    复制代码

    2.7 order by

    用于对记录进行 排序

    desc为降序
    asc为升序

    复制代码
    #准备数据
    mysql> create table emp (id int,name char(10),sex char,dept char(10),job char(10),salary double);
    
    mysql> insert into emp values (1,"刘备","男","市场","总监",5800),
        -> (2,"张飞","男","市场","员工",3000),
        -> (3,"关羽","男","市场","员工",4000),
        -> (4,"孙权","男","行政","总监",6000),
        -> (5,"周瑜","男","行政","员工",5000),
        -> (6,"小乔","女","行政","员工",4000),
        -> (7,"曹操","男","财务","总监",10000),
        -> (8,"司马懿","男","财务","员工",6000);
    
    mysql> select *from emp;
    +------+-----------+------+--------+--------+--------+
    | id   | name      | sex  | dept   | job    | salary |
    +------+-----------+------+--------+--------+--------+
    |    1 | 刘备      | 男   | 市场   | 总监   |   5800 |
    |    2 | 张飞      | 男   | 市场   | 员工   |   3000 |
    |    3 | 关羽      | 男   | 市场   | 员工   |   4000 |
    |    4 | 孙权      | 男   | 行政   | 总监   |   6000 |
    |    5 | 周瑜      | 男   | 行政   | 员工   |   5000 |
    |    6 | 小乔      | 女   | 行政   | 员工   |   4000 |
    |    7 | 曹操      | 男   | 财务   | 总监   |  10000 |
    |    8 | 司马懿    | 男   | 财务   | 员工   |   6000 |
    
    #按单列排序
    #默认是ASC升序
    mysql> SELECT * FROM emp ORDER BY salary;
    +------+-----------+------+--------+--------+--------+
    | id   | name      | sex  | dept   | job    | salary |
    +------+-----------+------+--------+--------+--------+
    |    2 | 张飞      | 男   | 市场   | 员工   |   3000 |
    |    3 | 关羽      | 男   | 市场   | 员工   |   4000 |
    |    6 | 小乔      | 女   | 行政   | 员工   |   4000 |
    |    5 | 周瑜      | 男   | 行政   | 员工   |   5000 |
    |    1 | 刘备      | 男   | 市场   | 总监   |   5800 |
    |    4 | 孙权      | 男   | 行政   | 总监   |   6000 |
    |    8 | 司马懿    | 男   | 财务   | 员工   |   6000 |
    |    7 | 曹操      | 男   | 财务   | 总监   |  10000 |
    +------+-----------+------+--------+--------+--------+
    
    #升序
    mysql> SELECT * FROM emp ORDER BY salary ASC;
    +------+-----------+------+--------+--------+--------+
    | id   | name      | sex  | dept   | job    | salary |
    +------+-----------+------+--------+--------+--------+
    |    2 | 张飞      | 男   | 市场   | 员工   |   3000 |
    |    3 | 关羽      | 男   | 市场   | 员工   |   4000 |
    |    6 | 小乔      | 女   | 行政   | 员工   |   4000 |
    |    5 | 周瑜      | 男   | 行政   | 员工   |   5000 |
    |    1 | 刘备      | 男   | 市场   | 总监   |   5800 |
    |    4 | 孙权      | 男   | 行政   | 总监   |   6000 |
    |    8 | 司马懿    | 男   | 财务   | 员工   |   6000 |
    |    7 | 曹操      | 男   | 财务   | 总监   |  10000 |
    +------+-----------+------+--------+--------+--------+
    
    
    #降序
    mysql> SELECT * FROM emp ORDER BY salary DESC;
    +------+-----------+------+--------+--------+--------+
    | id   | name      | sex  | dept   | job    | salary |
    +------+-----------+------+--------+--------+--------+
    |    7 | 曹操      | 男   | 财务   | 总监   |  10000 |
    |    4 | 孙权      | 男   | 行政   | 总监   |   6000 |
    |    8 | 司马懿    | 男   | 财务   | 员工   |   6000 |
    |    1 | 刘备      | 男   | 市场   | 总监   |   5800 |
    |    5 | 周瑜      | 男   | 行政   | 员工   |   5000 |
    |    3 | 关羽      | 男   | 市场   | 员工   |   4000 |
    |    6 | 小乔      | 女   | 行政   | 员工   |   4000 |
    |    2 | 张飞      | 男   | 市场   | 员工   |   3000 |
    +------+-----------+------+--------+--------+--------+
    
    按多列排序:
    
    #先按照职位排序,如果职位相同,则按照薪资排序
    
    mysql> SELECT * from emp ORDER BY job, salary DESC;
    +------+-----------+------+--------+--------+--------+
    | id   | name      | sex  | dept   | job    | salary |
    +------+-----------+------+--------+--------+--------+
    |    8 | 司马懿    | 男   | 财务   | 员工   |   6000 |
    |    5 | 周瑜      | 男   | 行政   | 员工   |   5000 |
    |    3 | 关羽      | 男   | 市场   | 员工   |   4000 |
    |    6 | 小乔      | 女   | 行政   | 员工   |   4000 |
    |    2 | 张飞      | 男   | 市场   | 员工   |   3000 |
    |    7 | 曹操      | 男   | 财务   | 总监   |  10000 |
    |    4 | 孙权      | 男   | 行政   | 总监   |   6000 |
    |    1 | 刘备      | 男   | 市场   | 总监   |   5800 |
    +------+-----------+------+--------+--------+--------+
    复制代码

    2.8 limit

      用于限制显示的条数
      limit [start,]count

    复制代码
    #准备数据
    mysql> create table emp (id int,name char(10),sex char,dept char(10),job char(10),salary double);
    
    mysql> insert into emp values (1,"刘备","男","市场","总监",5800),
        -> (2,"张飞","男","市场","员工",3000),
        -> (3,"关羽","男","市场","员工",4000),
        -> (4,"孙权","男","行政","总监",6000),
        -> (5,"周瑜","男","行政","员工",5000),
        -> (6,"小乔","女","行政","员工",4000),
        -> (7,"曹操","男","财务","总监",10000),
        -> (8,"司马懿","男","财务","员工",6000);
    
    mysql> select *from emp;
    +------+-----------+------+--------+--------+--------+
    | id   | name      | sex  | dept   | job    | salary |
    +------+-----------+------+--------+--------+--------+
    |    1 | 刘备      | 男   | 市场   | 总监   |   5800 |
    |    2 | 张飞      | 男   | 市场   | 员工   |   3000 |
    |    3 | 关羽      | 男   | 市场   | 员工   |   4000 |
    |    4 | 孙权      | 男   | 行政   | 总监   |   6000 |
    |    5 | 周瑜      | 男   | 行政   | 员工   |   5000 |
    |    6 | 小乔      | 女   | 行政   | 员工   |   4000 |
    |    7 | 曹操      | 男   | 财务   | 总监   |  10000 |
    |    8 | 司马懿    | 男   | 财务   | 员工   |   6000 |
    +------+-----------+------+--------+--------+--------+
    
    
    
    
    # 看看表里前三条数据
    mysql> select *from emp limit 3;
    +------+--------+------+--------+--------+--------+
    | id   | name   | sex  | dept   | job    | salary |
    +------+--------+------+--------+--------+--------+
    |    1 | 刘备   | 男   | 市场   | 总监   |   5800 |
    |    2 | 张飞   | 男   | 市场   | 员工   |   3000 |
    |    3 | 关羽   | 男   | 市场   | 员工   |   4000 |
    +------+--------+------+--------+--------+--------+
    
    # 看看表里的3-5条
    mysql> select *from emp limit 2,3;
    +------+--------+------+--------+--------+--------+
    | id   | name   | sex  | dept   | job    | salary |
    +------+--------+------+--------+--------+--------+
    |    3 | 关羽   | 男   | 市场   | 员工   |   4000 |
    |    4 | 孙权   | 男   | 行政   | 总监   |   6000 |
    |    5 | 周瑜   | 男   | 行政   | 员工   |   5000 |
    +------+--------+------+--------+--------+--------+
    
    # 查看工资最高的那个人的信息
    mysql> select *from emp order by salary desc  limit 1;
    +------+--------+------+--------+--------+--------+
    | id   | name   | sex  | dept   | job    | salary |
    +------+--------+------+--------+--------+--------+
    |    7 | 曹操   | 男   | 财务   | 总监   |  10000 |
    +------+--------+------+--------+--------+--------+
    复制代码


    3.多表查询

    在多个表中查询需要的数据
    例如:有班级表和学生表
      给你一个班级名称, 请查询所有的学员数据
      先查班级表 得到一个班级的id, 再根据id去学院表查询对应的学员

    复制代码
    #准备数据:
    create table emp (id int,name char(10),sex char,dept_id int);
    insert emp values(1,"大黄","m",1);
    insert emp values(2,"老王","m",2);
    insert emp values(3,"老李","w",30);
    mysql> select *from emp;
    +------+--------+------+---------+
    | id   | name   | sex  | dept_id |
    +------+--------+------+---------+
    |    1 | 大黄   | m    |       1 |
    |    2 | 老王   | m    |       2 |
    |    3 | 老李   | w    |      30 |
    +------+--------+------+---------+
    
    
    create table dept (id int,name char(10));
    insert dept values(1,"市场");
    insert dept values(2,"财务");
    mysql> select *from dept;
    +------+--------+
    | id   | name   |
    +------+--------+
    |    1 | 市场   |
    |    2 | 财务   |
    |    3 | 行政   |
    +------+--------+
    insert dept values(3,"行政");
    复制代码

     多表查询的方式

    1.笛卡尔积查询

    复制代码
    #什么是笛卡尔积,用坐标中的一条记录,去链接另一张表的所有记录
    #就像是把两张表的数据做了一个乘法
    #这将导致产生大量的无用重复数据
    #我们要的效果是:员工表中的部门id与部门表中的id相同,就拼接在一起
    #用 where 筛选出正确的数据
    mysql> select *from emp,dept where emp.dept_id=dept.id;
    +------+--------+------+---------+------+--------+
    | id   | name   | sex  | dept_id | id   | name   |
    +------+--------+------+---------+------+--------+
    |    1 | 大黄   | m    |       1 |    1 | 市场   |
    |    2 | 老王   | m    |       2 |    2 | 财务   |
    +------+--------+------+---------+------+--------+
    复制代码

    2.内连接查询

    复制代码
    #inner  join...on... 
    mysql> select *from emp inner join dept on emp.dept_id=dept.id;
    +------+--------+------+---------+------+--------+
    | id   | name   | sex  | dept_id | id   | name   |
    +------+--------+------+---------+------+--------+
    |    1 | 大黄   | m    |       1 |    1 | 市场   |
    |    2 | 老王   | m    |       2 |    2 | 财务   |
    +------+--------+------+---------+------+--------+
    #与from...where...一样,只不过inner  join...on...是专门用于多表连接的
    复制代码

    3.左外连接

    复制代码
    left join
    #左边员工表中的数据完全显示,右边表中的数据匹配上才显示,没有则NULL
    mysql> select *from emp left  join dept on emp.dept_id=dept.id;
    +------+--------+------+---------+------+--------+
    | id   | name   | sex  | dept_id | id   | name   |
    +------+--------+------+---------+------+--------+
    |    1 | 大黄   | m    |       1 |    1 | 市场   |
    |    2 | 老王   | m    |       2 |    2 | 财务   |
    |    3 | 老李   | w    |      30 | NULL | NULL   |
    +------+--------+------+---------+------+--------+
    复制代码

    4.右外连接

    复制代码
    right join
    #右边表中的数据完全显示,左边表中的数据匹配上才显示 
    mysql> select *from emp right  join dept on emp.dept_id=dept.id;
    +------+--------+------+---------+------+--------+
    | id   | name   | sex  | dept_id | id   | name   |
    +------+--------+------+---------+------+--------+
    |    1 | 大黄   | m    |       1 |    1 | 市场   |
    |    2 | 老王   | m    |       2 |    2 | 财务   |
    | NULL | NULL   | NULL |    NULL |    3 | 行政   |
    +------+--------+------+---------+------+--------+
    复制代码

    5. 全外链接

    复制代码
    #全外连接:在内连接的基础上增加左边有右边没有的和右边有左边没有的结果
    #mysql不支持 full join,但是可以用union间接实现
    
    union:表示合并查询,意思是把多个查询结果合并在一起显示,要求是被合并的表结构必须相同,默认去除重复
    
    union all:合并但是不去除重复
    
    sql> select *from emp right join dept  on emp.dept_id = dept.id
        ->union
        ->select *from emp left join dept  on emp.dept_id = dept.id;
    +------+--------+------+---------+------+--------+
    | id   | name   | sex  | dept_id | id   | name   |
    +------+--------+------+---------+------+--------+
    |    1 | 大黄   | m    |       1 |    1 | 市场   |
    |    2 | 老王   | m    |       2 |    2 | 财务   |
    | NULL | NULL   | NULL |    NULL |    3 | 行政   |
    |    3 | 老李   | w    |      30 | NULL | NULL   |
    +------+--------+------+---------+------+--------+
    
    
                            
    复制代码

    6.三表查询

    复制代码
    #准备数据
    #老师表
    create table tec(id int,name char(10));
    insert into tec value(1,"egon");
    insert into tec value(2,"yyh");
    mysql> select *from tec;
    +------+------+
    | id   | name |
    +------+------+
    |    1 | egon |
    |    2 | yyh  |
    +------+------+
    
    #学生表
    create table stu(id int,name char(10));
    insert into stu value(1,"大傻");
    insert into stu value(2,"中傻");
    insert into stu value(3,"小傻");
    mysql> select *from stu;
    +------+--------+
    | id   | name   |
    +------+--------+
    |    1 | 大傻   |
    |    2 | 中傻   |
    |    3 | 小傻   |
    
    
    #关联表
    create table s_t(s_id int,t_id int);
    insert into s_t value(1,2);
    insert into s_t value(2,2);
    insert into s_t value(3,1);
    mysql> select *from s_t;
    +------+------+
    | s_id | t_id |
    +------+------+
    |    1 |    2 |
    |    2 |    2 |
    |    3 |    1 |
    +------+------+
    
    #需求  找出 yyh 这个老师 教过的学生信息
    #思路:
    #    第一步,到关系表中去查询,哪些老师教过哪些学生(学生的id),形成了一个临时表
    mysql> select *from tec inner join s_t on tec.id=s_t.t_id;
    +------+------+------+------+
    | id   | name | s_id | t_id |
    +------+------+------+------+
    |    2 | yyh  |    1 |    2 |
    |    2 | yyh  |    2 |    2 |
    |    1 | egon |    3 |    1 |
    +------+------+------+------+
    
    
    #    第二步, 将上一步得到临时表与学生表进行连接
    mysql> select *from tec inner join s_t on tec.id=s_t.t_id
        -> inner join stu on s_id=stu.id;
    +------+------+------+------+------+--------+
    | id   | name | s_id | t_id | id   | name   |
    +------+------+------+------+------+--------+
    |    2 | yyh  |    1 |    2 |    1 | 大傻   |
    |    2 | yyh  |    2 |    2 |    2 | 中傻   |
    |    1 | egon |    3 |    1 |    3 | 小傻   |
    +------+------+------+------+------+--------+
    
    
    #    第三步,加上额外的筛选条件,老师的name是yyh
    mysql> select tec.name as 老师名字  ,stu.name as 学生名字  from tec inner join s_t on tec.id=s_t.t_id
        -> inner join stu on s_id=stu.id
        -> where tec.name='yyh';
    +--------------+--------------+
    | 老师名字     | 学生名字     |
    +--------------+--------------+
    | yyh          | 大傻         |
    | yyh          | 中傻         |
    +--------------+--------------+
    复制代码

    4.子查询

    子查询:将上一次查询的结果作为本次查询的原始数据(或是查询条件)

    复制代码
    #准备数据
    create table emp (id int,name char(10),sex char,dept char(10),job char(10),salary double);
    insert into emp values (1,"刘备","男","市场","总监",5800),
    (2,"张飞","男","市场","员工",3000),
    (3,"关羽","男","市场","员工",4000),
    (4,"孙权","男","行政","总监",6000),
    (5,"周瑜","男","行政","员工",5000),
    (6,"小乔","女","行政","员工",4000),
    (7,"曹操","男","财务","总监",10000),
    (8,"司马懿","男","财务","员工",6000);
    
    #需求:查询出工资最高的人的信息
    #先查询出最高工资是多少
    #拿着最高工资去表中看,谁的工资和最高工资匹配
    
    mysql> select *from emp where salary=(select max(salary) from emp);
    +------+--------+------+--------+--------+--------+
    | id   | name   | sex  | dept   | job    | salary |
    +------+--------+------+--------+--------+--------+
    |    7 | 曹操   | 男   | 财务   | 总监   |  10000 |
    +------+--------+------+--------+--------+--------+
    #in 关键字子查询
    #查询平均年龄大于25的部门名称
    #1.求每个部门的平均年龄
    select avg(age) from emp group by dept_id;
    #2.筛选结果
    select dept_id,avg(age) as a from emp group by dept_id having a > 25;
    #3.最后
    select name from dept where id in (select dept_id from emp group by dept_id having avg(age) > 25);
    
    
    
    #子查询方式:
    #平均年龄大于25的部门有哪些?
    #先要求出每个部门的平年龄!每个表示什么? 分组
    select name from dept where id in  (select dept_id from emp group by dept_id having avg(age) > 25);
    
    #多表查询方式:
    #先把数据拼接到一起 在加以筛选
    select dept.name from emp inner join dept
    on emp.dept_id = dept.id 
    group by dept.name
    having avg(age) >25;
    
    #exists关键字子查询
    #exists  后跟子查询  子查询有结果是为True 没有结果时为False
    #为true时外层执行 为false外层不执行
    select *from emp where exists (select *from emp where salary > 1000);
    select (exists (select *from emp where salary > 10000));
    复制代码
  • 相关阅读:
    算法实现:在10个数中选6个数,显示所有组合
    转载:PostgreSQL和MySQL协议简介
    转载:国内外高精地图厂商一览
    使用带key访问iPortalREST服务
    cass启动提示Frame主框架程序没有加载
    设置Gridview单元格内容不换行
    Sql自定义编号唯一性问题
    关于EXCEL数据导入到SQLServer中字段存在NULL的问题
    Gridview显示网格线
    ComboBox自动匹配查找
  • 原文地址:https://www.cnblogs.com/ouyang99-/p/10354769.html
Copyright © 2020-2023  润新知