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)
- 查询指定字段;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)
-
查询指定数据 ;
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)
运算符表
-
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)
-
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)
-
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)
-
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)
-
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)
-
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)
-
DISTINCT查询(去除重复的值);
SELECT DISTINCT 字段名 FROM 表名;
去除student表里dept那列数据里相同的项:
mysql> select distinct dept from student;
+--------------+
| dept |
+--------------+
| 计算机系 |
| 中文系 |
| 英语系 |
+--------------+
3 rows in set (0.00 sec)
-
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)
-
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)
-
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:用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)
写法二:使用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)
写法三:直接用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:左连接(将左表中的所有数据分别与右表中的每条数据进行连接组合,返回的结果不仅包含内连接的数据,而且包含左表中不符合条件的数据,同时在右表的相应列中添加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)
方法二:右连接(将右表中的所有数据分别与左表中的每条数据进行连接组合,返回的结果不仅包含内连接的数据,而且包含右表中不符合条件的数据,同时在左表的相应列中添加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)
方法三:全外连接
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)
-
复合条件连接查询(多条件复合成一条复杂的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: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)
写法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)