• sql的select查询语句大全(单表查询、多表连接查询)


    select查询语句的用法(包括数据查询和连表查询)

    环境:centos7、mysql版本如下图:
    在这里插入图片描述
    以下实验例子都是基于一张学生表student和一张成绩表score,以下是两张表的结构以及表数据:
    1、student
    在这里插入图片描述
    在这里插入图片描述

    2、score
    在这里插入图片描述
    在这里插入图片描述
    一、单表查询

    • 查询所有字段;select * from 表名字;
    mysql> select * from student;
    +-----+-----------+------+----------+--------------+--------------+--------------------+
    | num | name      | ssex | birthday | product_time | dept         | address            |
    +-----+-----------+------+----------+--------------+--------------+--------------------+
    | 901 | 张军      ||     2003 |         NULL | 计算机系     | 北京市海淀区       |
    | 902 | 张超      ||     2005 |         NULL | 中文系       | 北京市昌平区       |
    | 903 | 张美      ||     2002 |         NULL | 中文系       | 湖南省永州市       |
    | 904 | 李五一    ||     2001 |         NULL | 英语系       | 辽宁省阜新市       |
    | 905 | 王芳      ||     2001 |         NULL | 英语系       | 福建省厦门市       |
    | 906 | 王桂      ||     2005 |         NULL | 计算机系     | 湖南省衡阳市       |
    +-----+-----------+------+----------+--------------+--------------+--------------------+
    6 rows in set (0.00 sec)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 查询指定字段;select 字段名,字段名 from 表名字;
    mysql> select num,name,ssex,birthday,dept,address from student;
    +-----+-----------+------+----------+--------------+--------------------+
    | num | name      | ssex | birthday | dept         | address            |
    +-----+-----------+------+----------+--------------+--------------------+
    | 901 | 张军      ||     2003 | 计算机系     | 北京市海淀区       |
    | 902 | 张超      ||     2005 | 中文系       | 北京市昌平区       |
    | 903 | 张美      ||     2002 | 中文系       | 湖南省永州市       |
    | 904 | 李五一    ||     2001 | 英语系       | 辽宁省阜新市       |
    | 905 | 王芳      ||     2001 | 英语系       | 福建省厦门市       |
    | 906 | 王桂      ||     2005 | 计算机系     | 湖南省衡阳市       |
    +-----+-----------+------+----------+--------------+--------------------+
    6 rows in set (0.00 sec)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 查询指定数据 ;
      select * from 表名 where 字段名 = ’数据’;
      select * from 表名 where 字段名 比较运算符 数据;
      (后附比较运算符表)
    查询表student里列num为901的学生信息:
    mysql> select * from student where num=901;
    +-----+--------+------+----------+--------------+--------------+--------------------+
    | num | name   | ssex | birthday | product_time | dept         | address            |
    +-----+--------+------+----------+--------------+--------------+--------------------+
    | 901 | 张军   ||     2003 |         NULL | 计算机系     | 北京市海淀区       |
    +-----+--------+------+----------+--------------+--------------+--------------------+
    1 row in set (0.00 sec)
    
    查询表student里小于22岁的学生信息:
    mysql> select * from student where birthday>=2000;
    +-----+-----------+------+----------+--------------+--------------+--------------------+
    | num | name      | ssex | birthday | product_time | dept         | address            |
    +-----+-----------+------+----------+--------------+--------------+--------------------+
    | 901 | 张军      ||     2003 |         NULL | 计算机系     | 北京市海淀区       |
    | 902 | 张超      ||     2005 |         NULL | 中文系       | 北京市昌平区       |
    | 903 | 张美      ||     2002 |         NULL | 中文系       | 湖南省永州市       |
    | 904 | 李五一    ||     2001 |         NULL | 英语系       | 辽宁省阜新市       |
    | 905 | 王芳      ||     2001 |         NULL | 英语系       | 福建省厦门市       |
    | 906 | 王桂      ||     2005 |         NULL | 计算机系     | 湖南省衡阳市       |
    +-----+-----------+------+----------+--------------+--------------+--------------------+
    6 rows in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    运算符表
    在这里插入图片描述

    • IN关键字查询;
      SELECT * FROM table_name WHERE 条件 [NOT] IN (元素1,元素2,…);
    查询计算机系和英语系的学生的信息:
    mysql> select * from student where dept in ('计算机系','英语系');
    +-----+-----------+------+----------+--------------+--------------+--------------------+
    | num | name      | ssex | birthday | product_time | dept         | address            |
    +-----+-----------+------+----------+--------------+--------------+--------------------+
    | 901 | 张军      ||     2003 |         NULL | 计算机系     | 北京市海淀区       |
    | 904 | 李五一    ||     2001 |         NULL | 英语系       | 辽宁省阜新市       |
    | 905 | 王芳      ||     2001 |         NULL | 英语系       | 福建省厦门市       |
    | 906 | 王桂      ||     2005 |         NULL | 计算机系     | 湖南省衡阳市       |
    +-----+-----------+------+----------+--------------+--------------+--------------------+
    4 rows in set (0.00 sec)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • OR关键字查询;
      SELECT * FROM table_name WHERE 条件1 OR 条件2 [OR …条件n];
    查询计算机系或英语系的学生的信息:
    mysql> select * from student where dept='计算机系' or dept='英语系';
    +-----+-----------+------+----------+--------------+--------------+--------------------+
    | num | name      | ssex | birthday | product_time | dept         | address            |
    +-----+-----------+------+----------+--------------+--------------+--------------------+
    | 901 | 张军      ||     2003 |         NULL | 计算机系     | 北京市海淀区       |
    | 904 | 李五一    ||     2001 |         NULL | 英语系       | 辽宁省阜新市       |
    | 905 | 王芳      ||     2001 |         NULL | 英语系       | 福建省厦门市       |
    | 906 | 王桂      ||     2005 |         NULL | 计算机系     | 湖南省衡阳市       |
    +-----+-----------+------+----------+--------------+--------------+--------------------+
    4 rows in set (0.01 sec)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • BETWEEN AND查询;
      SELECT * FROM table_name WHERE 条件 [NOT] BETWEEN 取值1 AND 取值2;
    从student表中查询年龄为18到22岁的学生的信息:
    mysql> select * from student where birthday between 2000 and 2004;
    +-----+-----------+------+----------+--------------+--------------+--------------------+
    | num | name      | ssex | birthday | product_time | dept         | address            |
    +-----+-----------+------+----------+--------------+--------------+--------------------+
    | 901 | 张军      ||     2003 |         NULL | 计算机系     | 北京市海淀区       |
    | 903 | 张美      ||     2002 |         NULL | 中文系       | 湖南省永州市       |
    | 904 | 李五一    ||     2001 |         NULL | 英语系       | 辽宁省阜新市       |
    | 905 | 王芳      ||     2001 |         NULL | 英语系       | 福建省厦门市       |
    +-----+-----------+------+----------+--------------+--------------+--------------------+
    4 rows in set (0.00 sec)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • AND多查询;
      SELECT * FROM table_name WHERE 条件1 AND 条件2 [AND …条件n];
    从student表中查询年龄为18到22岁的学生的信息:
    mysql> select * from student where birthday>=2000 and birthday<=2004;
    +-----+-----------+------+----------+--------------+--------------+--------------------+
    | num | name      | ssex | birthday | product_time | dept         | address            |
    +-----+-----------+------+----------+--------------+--------------+--------------------+
    | 901 | 张军      ||     2003 |         NULL | 计算机系     | 北京市海淀区       |
    | 903 | 张美      ||     2002 |         NULL | 中文系       | 湖南省永州市       |
    | 904 | 李五一    ||     2001 |         NULL | 英语系       | 辽宁省阜新市       |
    | 905 | 王芳      ||     2001 |         NULL | 英语系       | 福建省厦门市       |
    +-----+-----------+------+----------+--------------+--------------+--------------------+
    4 rows in set (0.00 sec)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • LIKE查询;
      select * from 表名 where id like ‘数据%’;
      “%”可以代表任意长度的字符串,长度可以为0 ,例如’明%白’可以是’明白’ ;“_”只代表一个字符,例如m_n 。
    查询student表里的num列中以9开头的数据:
    mysql> select * from student where num like '9%';
    +-----+-----------+------+----------+--------------+--------------+--------------------+
    | num | name      | ssex | birthday | product_time | dept         | address            |
    +-----+-----------+------+----------+--------------+--------------+--------------------+
    | 901 | 张军      ||     2003 |         NULL | 计算机系     | 北京市海淀区       |
    | 902 | 张超      ||     2005 |         NULL | 中文系       | 北京市昌平区       |
    | 903 | 张美      ||     2002 |         NULL | 中文系       | 湖南省永州市       |
    | 904 | 李五一    ||     2001 |         NULL | 英语系       | 辽宁省阜新市       |
    | 905 | 王芳      ||     2001 |         NULL | 英语系       | 福建省厦门市       |
    | 906 | 王桂      ||     2005 |         NULL | 计算机系     | 湖南省衡阳市       |
    +-----+-----------+------+----------+--------------+--------------+--------------------+
    6 rows in set (0.00 sec)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • IS NULL查询
      SELECT 字段名1,字段名2,…… FROM table_name WHERE 条件 IS [NOT] NULL;
    查询表student里的num列是空值的数据:
    mysql> select * from student where num is null;
    Empty set (0.00 sec)
    
    查询表student里的num列是非空值的数据:
    mysql> select * from student where num is not null;
    +-----+-----------+------+----------+--------------+--------------+--------------------+
    | num | name      | ssex | birthday | product_time | dept         | address            |
    +-----+-----------+------+----------+--------------+--------------+--------------------+
    | 901 | 张军      ||     2003 |         NULL | 计算机系     | 北京市海淀区       |
    | 902 | 张超      ||     2005 |         NULL | 中文系       | 北京市昌平区       |
    | 903 | 张美      ||     2002 |         NULL | 中文系       | 湖南省永州市       |
    | 904 | 李五一    ||     2001 |         NULL | 英语系       | 辽宁省阜新市       |
    | 905 | 王芳      ||     2001 |         NULL | 英语系       | 福建省厦门市       |
    | 906 | 王桂      ||     2005 |         NULL | 计算机系     | 湖南省衡阳市       |
    +-----+-----------+------+----------+--------------+--------------+--------------------+
    6 rows in set (0.00 sec)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • DISTINCT查询(去除重复的值);
      SELECT DISTINCT 字段名 FROM 表名;
    去除student表里dept那列数据里相同的项:
    mysql> select distinct dept from student;
    +--------------+
    | dept         |
    +--------------+
    | 计算机系     |
    | 中文系       |
    | 英语系       |
    +--------------+
    3 rows in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • ORDER BY查询(对数据做升序或者降序排列,一般放在语句后面);
      ORDER BY 字段名 [ASC | DESC]
      1、ASC:升序,默认值。
      2、DESC:降序。
      3、进行排序的列如果有NULL,则升序时NULL在最前,降序在最后。
    将计算机成绩按从高到低进行排序:
    mysql> select * from score where c_name='计算机' order by grade desc;
    +----+-----------+------+-------+
    | id | c_name    | s_id | grade |
    +----+-----------+------+-------+
    |  1 | 计算机    |  901 |    98 |
    |  9 | 计算机    |  906 |    90 |
    |  6 | 计算机    |  904 |    70 |
    |  3 | 计算机    |  902 |    65 |
    +----+-----------+------+-------+
    4 rows in set (0.00 sec)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • GROUP BY查询;
      SELECT column_name, aggregate_function(column_name)
      FROM table_name
      WHERE column_name operator value
      GROUP BY column_name;
      GROUP BY关键字可以将查询的数据行根据某些列分组。
    student表中查询每个院系有多少人,为统计的人数列取别名sum_of_dept:
    mysql> select dept,count(All name) as sum_of_dept from student group by (dept);
    +--------------+-------------+
    | dept         | sum_of_dept |
    +--------------+-------------+
    | 中文系       |           2 |
    | 英语系       |           2 |
    | 计算机系     |           2 |
    +--------------+-------------+
    3 rows in set (0.00 sec)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • LIMIT查询;
      select _column,_column from _table [where Clause] [limit N][offset M]
      LIMIT关键字可以限制查询结果的输出行数。
    查询student表的第二条到第四条记录:
    mysql> select * from student limit 2,4;
    +-----+-----------+------+----------+--------------+--------------+--------------------+
    | num | name      | ssex | birthday | product_time | dept         | address            |
    +-----+-----------+------+----------+--------------+--------------+--------------------+
    | 903 | 张美      ||     2002 |         NULL | 中文系       | 湖南省永州市       |
    | 904 | 李五一    ||     2001 |         NULL | 英语系       | 辽宁省阜新市       |
    | 905 | 王芳      ||     2001 |         NULL | 英语系       | 福建省厦门市       |
    | 906 | 王桂      ||     2005 |         NULL | 计算机系     | 湖南省衡阳市       |
    +-----+-----------+------+----------+--------------+--------------+--------------------+
    4 rows in set (0.00 sec)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    二、连表查询

    • 内联表查询

    写法1:用where连接
    SELECT 表1名.表列, 表1名.表列,…, 表2名.表列,表2名.表列,…,
    FROM 表1名, 表2名
    WHERE 表1名.表列=表2名.表列;

    mysql> select * from student,score where student.num=score.s_id;
    +-----+-----------+------+----------+--------------+--------------+--------------------+----+-----------+------+-------+
    | num | name      | ssex | birthday | product_time | dept         | address            | id | c_name    | s_id | grade |
    +-----+-----------+------+----------+--------------+--------------+--------------------+----+-----------+------+-------+
    | 901 | 张军      ||     2003 |         NULL | 计算机系     | 北京市海淀区       |  1 | 计算机    |  901 |    98 |
    | 901 | 张军      ||     2003 |         NULL | 计算机系     | 北京市海淀区       |  2 | 英语      |  901 |    80 |
    | 902 | 张超      ||     2005 |         NULL | 中文系       | 北京市昌平区       |  3 | 计算机    |  902 |    65 |
    | 902 | 张超      ||     2005 |         NULL | 中文系       | 北京市昌平区       |  4 | 中文      |  902 |    88 |
    | 903 | 张美      ||     2002 |         NULL | 中文系       | 湖南省永州市       |  5 | 中文      |  903 |    95 |
    | 904 | 李五一    ||     2001 |         NULL | 英语系       | 辽宁省阜新市       |  6 | 计算机    |  904 |    70 |
    | 904 | 李五一    ||     2001 |         NULL | 英语系       | 辽宁省阜新市       |  7 | 英语      |  904 |    92 |
    | 905 | 王芳      ||     2001 |         NULL | 英语系       | 福建省厦门市       |  8 | 英语      |  905 |    94 |
    | 906 | 王桂      ||     2005 |         NULL | 计算机系     | 湖南省衡阳市       |  9 | 计算机    |  906 |    90 |
    | 906 | 王桂      ||     2005 |         NULL | 计算机系     | 湖南省衡阳市       | 10 | 英语      |  906 |    85 |
    +-----+-----------+------+----------+--------------+--------------+--------------------+----+-----------+------+-------+
    10 rows in set (0.00 sec)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    写法二:使用INNER JOIN连接
    select 表1名.表列, 表1名.表列,…, 表2名.表列,表2名.表列,…,
    from 表1名 inner join 表2名
    on(where) 表1名.表列=表2名.表列;

    mysql> select * from student inner join score on student.num=score.s_id;
    +-----+-----------+------+----------+--------------+--------------+--------------------+----+-----------+------+-------+
    | num | name      | ssex | birthday | product_time | dept         | address            | id | c_name    | s_id | grade |
    +-----+-----------+------+----------+--------------+--------------+--------------------+----+-----------+------+-------+
    | 901 | 张军      ||     2003 |         NULL | 计算机系     | 北京市海淀区       |  1 | 计算机    |  901 |    98 |
    | 901 | 张军      ||     2003 |         NULL | 计算机系     | 北京市海淀区       |  2 | 英语      |  901 |    80 |
    | 902 | 张超      ||     2005 |         NULL | 中文系       | 北京市昌平区       |  3 | 计算机    |  902 |    65 |
    | 902 | 张超      ||     2005 |         NULL | 中文系       | 北京市昌平区       |  4 | 中文      |  902 |    88 |
    | 903 | 张美      ||     2002 |         NULL | 中文系       | 湖南省永州市       |  5 | 中文      |  903 |    95 |
    | 904 | 李五一    ||     2001 |         NULL | 英语系       | 辽宁省阜新市       |  6 | 计算机    |  904 |    70 |
    | 904 | 李五一    ||     2001 |         NULL | 英语系       | 辽宁省阜新市       |  7 | 英语      |  904 |    92 |
    | 905 | 王芳      ||     2001 |         NULL | 英语系       | 福建省厦门市       |  8 | 英语      |  905 |    94 |
    | 906 | 王桂      ||     2005 |         NULL | 计算机系     | 湖南省衡阳市       |  9 | 计算机    |  906 |    90 |
    | 906 | 王桂      ||     2005 |         NULL | 计算机系     | 湖南省衡阳市       | 10 | 英语      |  906 |    85 |
    +-----+-----------+------+----------+--------------+--------------+--------------------+----+-----------+------+-------+
    10 rows in set (0.00 sec)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    写法三:直接用JOIN连接
    select 表1名.表列, 表1名.表列,…, 表2名.表列,表2名.表列,…,
    from 表1名 join 表2名
    on 表1名.表列=表2名.表列;

     mysql> select * from student join score on student.num=score.s_id;
    +-----+-----------+------+----------+--------------+--------------+--------------------+----+-----------+------+-------+
    | num | name      | ssex | birthday | product_time | dept         | address            | id | c_name    | s_id | grade |
    +-----+-----------+------+----------+--------------+--------------+--------------------+----+-----------+------+-------+
    | 901 | 张军      ||     2003 |         NULL | 计算机系     | 北京市海淀区       |  1 | 计算机    |  901 |    98 |
    | 901 | 张军      ||     2003 |         NULL | 计算机系     | 北京市海淀区       |  2 | 英语      |  901 |    80 |
    | 902 | 张超      ||     2005 |         NULL | 中文系       | 北京市昌平区       |  3 | 计算机    |  902 |    65 |
    | 902 | 张超      ||     2005 |         NULL | 中文系       | 北京市昌平区       |  4 | 中文      |  902 |    88 |
    | 903 | 张美      ||     2002 |         NULL | 中文系       | 湖南省永州市       |  5 | 中文      |  903 |    95 |
    | 904 | 李五一    ||     2001 |         NULL | 英语系       | 辽宁省阜新市       |  6 | 计算机    |  904 |    70 |
    | 904 | 李五一    ||     2001 |         NULL | 英语系       | 辽宁省阜新市       |  7 | 英语      |  904 |    92 |
    | 905 | 王芳      ||     2001 |         NULL | 英语系       | 福建省厦门市       |  8 | 英语      |  905 |    94 |
    | 906 | 王桂      ||     2005 |         NULL | 计算机系     | 湖南省衡阳市       |  9 | 计算机    |  906 |    90 |
    | 906 | 王桂      ||     2005 |         NULL | 计算机系     | 湖南省衡阳市       | 10 | 英语      |  906 |    85 |
    +-----+-----------+------+----------+--------------+--------------+--------------------+----+-----------+------+-------+
    10 rows in set (0.00 sec)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 外连接

    方法1:左连接(将左表中的所有数据分别与右表中的每条数据进行连接组合,返回的结果不仅包含内连接的数据,而且包含左表中不符合条件的数据,同时在右表的相应列中添加NULL值。)
    SELECT 字段名1,字段名2 … FROM 表1 LEFT|RIGHT JOIN 表2 ON 表1.字段1=表2.字段2;

    用连接查询的方式查询所有学生的信息和考试信息:
    mysql> select * from student left join score on student.num=score.s_id;
    +-----+-----------+------+----------+--------------+--------------+--------------------+------+-----------+------+-------+
    | num | name      | ssex | birthday | product_time | dept         | address            | id   | c_name    | s_id | grade |
    +-----+-----------+------+----------+--------------+--------------+--------------------+------+-----------+------+-------+
    | 901 | 张军      ||     2003 |         NULL | 计算机系     | 北京市海淀区       |    1 | 计算机    |  901 |    98 |
    | 901 | 张军      ||     2003 |         NULL | 计算机系     | 北京市海淀区       |    2 | 英语      |  901 |    80 |
    | 902 | 张超      ||     2005 |         NULL | 中文系       | 北京市昌平区       |    3 | 计算机    |  902 |    65 |
    | 902 | 张超      ||     2005 |         NULL | 中文系       | 北京市昌平区       |    4 | 中文      |  902 |    88 |
    | 903 | 张美      ||     2002 |         NULL | 中文系       | 湖南省永州市       |    5 | 中文      |  903 |    95 |
    | 904 | 李五一    ||     2001 |         NULL | 英语系       | 辽宁省阜新市       |    6 | 计算机    |  904 |    70 |
    | 904 | 李五一    ||     2001 |         NULL | 英语系       | 辽宁省阜新市       |    7 | 英语      |  904 |    92 |
    | 905 | 王芳      ||     2001 |         NULL | 英语系       | 福建省厦门市       |    8 | 英语      |  905 |    94 |
    | 906 | 王桂      ||     2005 |         NULL | 计算机系     | 湖南省衡阳市       |    9 | 计算机    |  906 |    90 |
    | 906 | 王桂      ||     2005 |         NULL | 计算机系     | 湖南省衡阳市       |   10 | 英语      |  906 |    85 |
    +-----+-----------+------+----------+--------------+--------------+--------------------+------+-----------+------+-------+
    10 rows in set (0.00 sec)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    方法二:右连接(将右表中的所有数据分别与左表中的每条数据进行连接组合,返回的结果不仅包含内连接的数据,而且包含右表中不符合条件的数据,同时在左表的相应列中添加NULL值。)
    SELECT 字段名1,字段名2 … FROM 表1 LEFT|RIGHT JOIN 表2 ON 表1.字段1=表2.字段2;

    mysql> select * from student right join score on student.num=score.s_id;
    +------+-----------+------+----------+--------------+--------------+--------------------+----+-----------+------+-------+
    | num  | name      | ssex | birthday | product_time | dept         | address            | id | c_name    | s_id | grade |
    +------+-----------+------+----------+--------------+--------------+--------------------+----+-----------+------+-------+
    |  901 | 张军      ||     2003 |         NULL | 计算机系     | 北京市海淀区       |  1 | 计算机    |  901 |    98 |
    |  901 | 张军      ||     2003 |         NULL | 计算机系     | 北京市海淀区       |  2 | 英语      |  901 |    80 |
    |  902 | 张超      ||     2005 |         NULL | 中文系       | 北京市昌平区       |  3 | 计算机    |  902 |    65 |
    |  902 | 张超      ||     2005 |         NULL | 中文系       | 北京市昌平区       |  4 | 中文      |  902 |    88 |
    |  903 | 张美      ||     2002 |         NULL | 中文系       | 湖南省永州市       |  5 | 中文      |  903 |    95 |
    |  904 | 李五一    ||     2001 |         NULL | 英语系       | 辽宁省阜新市       |  6 | 计算机    |  904 |    70 |
    |  904 | 李五一    ||     2001 |         NULL | 英语系       | 辽宁省阜新市       |  7 | 英语      |  904 |    92 |
    |  905 | 王芳      ||     2001 |         NULL | 英语系       | 福建省厦门市       |  8 | 英语      |  905 |    94 |
    |  906 | 王桂      ||     2005 |         NULL | 计算机系     | 湖南省衡阳市       |  9 | 计算机    |  906 |    90 |
    |  906 | 王桂      ||     2005 |         NULL | 计算机系     | 湖南省衡阳市       | 10 | 英语      |  906 |    85 |
    +------+-----------+------+----------+--------------+--------------+--------------------+----+-----------+------+-------+
    10 rows in set (0.00 sec)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    方法三:全外连接
    SELECT 字段名1,字段名2 … FROM 表1 LEFT|RIGHT JOIN 表2 ON 表1.字段1=表2.字段2;
    UNION
    SELECT 字段名1,字段名2 … FROM 表1 LEFT|RIGHT JOIN 表2 ON 表1.字段1=表2.字段2;

    从student表和score表中查询出学生的学号,然后合并查询结果:
    mysql> select num from student union select s_id from score;
    +-----+
    | num |
    +-----+
    | 901 |
    | 902 |
    | 903 |
    | 904 |
    | 905 |
    | 906 |
    +-----+
    6 rows in set (0.00 sec)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 复合条件连接查询(多条件复合成一条复杂的select查询语句)
      在连接查询时,可以增加限制条件以使查询结果更加准确;

    复合条件连接查询的案例属于综合例子:

    查询计算机成绩低于95的学生的信息:
    mysql> select * from score,student where student.num=score.s_id and score.c_name='计算机' and                                                                                            score.grade<95;
    +----+-----------+------+-------+-----+-----------+------+----------+--------------+--------------+--------------------+
    | id | c_name    | s_id | grade | num | name      | ssex | birthday | product_time | dept         | address            |
    +----+-----------+------+-------+-----+-----------+------+----------+--------------+--------------+--------------------+
    |  3 | 计算机    |  902 |    65 | 902 | 张超      ||     2005 |         NULL | 中文系       | 北京市昌平区       |
    |  6 | 计算机    |  904 |    70 | 904 | 李五一    ||     2001 |         NULL | 英语系       | 辽宁省阜新市       |
    |  9 | 计算机    |  906 |    90 | 906 | 王桂      ||     2005 |         NULL | 计算机系     | 湖南省衡阳市       |
    +----+-----------+------+-------+-----+-----------+------+----------+--------------+--------------+--------------------+
    3 rows in set (0.01 sec)
    
    查询同时参加计算机和英语考试的学生的信息
    mysql> select * from student as stu,score as s1,score as s2 where stu.num= s1.s_id and s1.c_name='计算机'  and stu.num=s2.s_id and s2.c_name='英语';
    +-----+-----------+------+----------+--------------+--------------+--------------------+----+-----------+------+-------+----+--------+------+-------+
    | num | name      | ssex | birthday | product_time | dept         | address            | id | c_name    | s_id | grade | id | c_name | s_id | grade |
    +-----+-----------+------+----------+--------------+--------------+--------------------+----+-----------+------+-------+----+--------+------+-------+
    | 901 | 张军      ||     2003 |         NULL | 计算机系     | 北京市海淀区       |  1 | 计算机    |  901 |    98 |  2 | 英语   |  901 |    80 |
    | 904 | 李五一    ||     2001 |         NULL | 英语系       | 辽宁省阜新市       |  6 | 计算机    |  904 |    70 |  7 | 英语   |  904 |    92 |
    | 906 | 王桂      ||     2005 |         NULL | 计算机系     | 湖南省衡阳市       |  9 | 计算机    |  906 |    90 | 10 | 英语   |  906 |    85 |
    +-----+-----------+------+----------+--------------+--------------+--------------------+----+-----------+------+-------+----+--------+------+-------+
    3 rows in set (0.00 sec)
    
    查询姓张或者姓王的同学的姓名、院系、考试科目和成绩:
    mysql> select student.num,name,dept,c_name,grade from student, score where(name like '张%' or                                                                                            name like '王%')and student.num=score.s_id ;
    +-----+--------+--------------+-----------+-------+
    | num | name   | dept         | c_name    | grade |
    +-----+--------+--------------+-----------+-------+
    | 901 | 张军   | 计算机系     | 计算机    |    98 |
    | 901 | 张军   | 计算机系     | 英语      |    80 |
    | 902 | 张超   | 中文系       | 计算机    |    65 |
    | 902 | 张超   | 中文系       | 中文      |    88 |
    | 903 | 张美   | 中文系       | 中文      |    95 |
    | 905 | 王芳   | 英语系       | 英语      |    94 |
    | 906 | 王桂   | 计算机系     | 计算机    |    90 |
    | 906 | 王桂   | 计算机系     | 英语      |    85 |
    +-----+--------+--------------+-----------+-------+
    8 rows in set (0.00 sec)
    
    计算每个学生的总成绩(需显示学生姓名):
    mysql> select student.name,sum(All grade) as sum_of_grade from score left join student on student.num=score.s_id group by (s_id);
    +-----------+--------------+
    | name      | sum_of_grade |
    +-----------+--------------+
    | 张军      |          178 |
    | 张超      |          153 |
    | 张美      |           95 |
    | 李五一    |          162 |
    | 王芳      |           94 |
    | 王桂      |          175 |
    +-----------+--------------+
    6 rows in set (0.00 sec)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 合并查询
      合并的查询结果必须包含相同的列数

    写法1:union
    将所有的查询结果合并到一起,删除相同的记录
    SELECT 字段名1,字段名2 … FROM 表1;
    UNION
    SELECT 字段名1,字段名2 … FROM 表2;

    mysql> select num from student union select s_id from score;
    +-----+
    | num |
    +-----+
    | 901 |
    | 902 |
    | 903 |
    | 904 |
    | 905 |
    | 906 |
    +-----+
    6 rows in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    写法2:union all
    将所有的查询结果合并到一起,不删除相同的记录
    SELECT 字段名1,字段名2 … FROM 表1;
    UNION ALL
    SELECT 字段名1,字段名2 … FROM 表2;

    mysql> select num from student union all select s_id from score;
    +-----+
    | num |
    +-----+
    | 901 |
    | 902 |
    | 903 |
    | 904 |
    | 905 |
    | 906 |
    | 901 |
    | 901 |
    | 902 |
    | 902 |
    | 903 |
    | 904 |
    | 904 |
    | 905 |
    | 906 |
    | 906 |
    +-----+
    16 rows in set (0.00 sec)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
  • 相关阅读:
    【广州华锐互动】VR营销心理学情景模拟培训系统介绍
    OpenWrt如何公网ssh远程连接【内网穿透】
    锁-分布式锁
    06 逻辑回归
    [C++]打开新世界的大门之C++入门
    Spring Cloud(Finchley版本)系列教程(一) 服务注册与发现(eureka)
    【学习笔记】《Python深度学习》第三章:神经网络入门
    Facebook耐用号养成攻略!如何实现自动化高效养号
    照着这本“书”,3年量产自动驾驶卡车
    linux文件系统卷标管理
  • 原文地址:https://blog.csdn.net/HelloWorld_4396/article/details/127793504