当前位置:   article > 正文

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

select from 查询语句

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
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/189115
推荐阅读
相关标签
  

闽ICP备14008679号