单表查询、多表查询、子查询

DML语句:

select语句

SELECT select-list  FROM tb WHERE qualification;

FROM子句:要查询的关系 表、多个表、其他的select语句
WHERE子句:布尔型关系表达式 ,还可以是算术运算表达式

符号 代表含义
= 等于
<> 或者 != 不等于
<=> 有NULL也能进行比较,等于
< 小于
<= 小于等于
=
大于等于
< 小于
> 大于
+、-、*、/、% 加、减、乘、除、取余
and 或者 && 逻辑与
or 或者
not 或者 ! 逻辑非
xor 异或

查询语句的类型:简单查询,多表查询,子查询

简单查询

投影:显示所有行的指定的字段(部分字段)

SELECT field1,field2  FROM tb_name;
mysql> SELECT name,cid FROM student;
+------+-----+
| name | cid |
+------+-----+
| jim  |   1 |
| tom  |   2 |
| jack |   3 |
+------+-----+
3 rows in set (0.00 sec)

选择:显示表中与搜索码匹配的行(部分行)

SELECT * FROM tb_name WHERE qualification;
mysql> SELECT * FROM student WHERE id=3;
+----+------+-----+
| id | name | cid |
+----+------+-----+
|  3 | jack |   3 |
+----+------+-----+
1 row in set (0.00 sec)

distinct 字段去重查询

查询的字段去重

mysql> select distinct gender from student;
+--------+
| gender |
+--------+
| M      |
| F      |
+--------+
2 rows in set (0.00 sec)

条件查询

筛选大于20岁的所有学生

mysql> select * from student where age>=20;
+----+-------+-----+--------+-----+
| id | name  | cid | gender | age |
+----+-------+-----+--------+-----+
|  1 | jim   |   1 | M      |  21 |
|  3 | jack  |   3 | M      |  20 |
|  4 | lucy  |   2 | F      |  25 |
|  5 | neccy |   3 | F      |  30 |
+----+-------+-----+--------+-----+
4 rows in set (0.00 sec)

逻辑运算符 and,or,not

筛选大于20的男性同学

mysql> select * from student where age>=20 and gender='M';
+----+------+-----+--------+-----+
| id | name | cid | gender | age |
+----+------+-----+--------+-----+
|  1 | jim  |   1 | M      |  21 |
|  3 | jack |   3 | M      |  20 |
+----+------+-----+--------+-----+
2 rows in set (0.00 sec)

筛选年龄不大于等于20 并且为男性的同学

mysql> select * from student where not age>=20 and gender='M';
+----+------+-----+--------+-----+
| id | name | cid | gender | age |
+----+------+-----+--------+-----+
|  2 | tom  |   2 | M      |  19 |
+----+------+-----+--------+-----+
1 row in set (0.00 sec)

between…and…. 字段

年龄在20-30 之间的同学(大于20小于等于30)

mysql> select * from student where age between 20 and 30;
+----+-------+-----+--------+-----+
| id | name  | cid | gender | age |
+----+-------+-----+--------+-----+
|  1 | jim   |   1 | M      |  21 |
|  3 | jack  |   3 | M      |  20 |
|  4 | lucy  |   2 | F      |  25 |
|  5 | neccy |   3 | F      |  30 |
+----+-------+-----+--------+-----+
4 rows in set (0.00 sec)

like操作符

通配符 含义
% 任意长度任意字符
_ 任意单个字符

查询名字以j开头的同学

mysql> select * from student where name like 'j%';
+----+------+-----+--------+-----+
| id | name | cid | gender | age |
+----+------+-----+--------+-----+
|  1 | jim  |   1 | M      |  21 |
|  3 | jack |   3 | M      |  20 |
+----+------+-----+--------+-----+
2 rows in set (0.00 sec)

姓名中以 j 开头的三个单词组成的同学

mysql> select * from student where name like 'j__';
+----+------+-----+--------+-----+
| id | name | cid | gender | age |
+----+------+-----+--------+-----+
|  1 | jim  |   1 | M      |  21 |
+----+------+-----+--------+-----+
1 row in set (0.00 sec)

REGEXP、RLIKE 字段正则表达

查询姓名以 l、n、t 开头的所有同学

mysql> select * from student where name rlike '^[lnt].*';
+----+-------+-----+--------+-----+
| id | name  | cid | gender | age |
+----+-------+-----+--------+-----+
|  2 | tom   |   2 | M      |  19 |
|  4 | lucy  |   2 | F      |  25 |
|  5 | neccy |   3 | F      |  30 |
+----+-------+-----+--------+-----+
3 rows in set (0.00 sec)

IN 操作符

筛选年龄为19、20、30的学生

mysql> select * from student where age in (19,20,30);
+----+-------+-----+--------+-----+
| id | name  | cid | gender | age |
+----+-------+-----+--------+-----+
|  2 | tom   |   2 | M      |  19 |
|  3 | jack  |   3 | M      |  20 |
|  5 | neccy |   3 | F      |  30 |
+----+-------+-----+--------+-----+
3 rows in set (0.00 sec)

查询null

筛选课程二字段为空的学生

mysql> select * from student where cid2 is null;
+----+-------+-----+--------+-----+------+
| id | name  | cid | gender | age | cid2 |
+----+-------+-----+--------+-----+------+
|  2 | tom   |   2 | M      |  19 | NULL |
|  5 | neccy |   3 | F      |  30 | NULL |
+----+-------+-----+--------+-----+------+
2 rows in set (0.00 sec)
mysql> select * from student where cid2 is not null;
+----+------+-----+--------+-----+------+
| id | name | cid | gender | age | cid2 |
+----+------+-----+--------+-----+------+
|  1 | jim  |   1 | M      |  21 |    1 |
|  3 | jack |   3 | M      |  20 |    4 |
|  4 | lucy |   2 | F      |  25 |    4 |
+----+------+-----+--------+-----+------+
3 rows in set (0.00 sec)

ORDER BY filed_name [ASC|DESC]字段

将查询结果通过姓名排序,正序和反序

mysql> select * from student where cid2 is not null order by name;
+----+------+-----+--------+-----+------+
| id | name | cid | gender | age | cid2 |
+----+------+-----+--------+-----+------+
|  3 | jack |   3 | M      |  20 |    4 |
|  1 | jim  |   1 | M      |  21 |    1 |
|  4 | lucy |   2 | F      |  25 |    4 |
+----+------+-----+--------+-----+------+
3 rows in set (0.00 sec)

mysql> select * from student where cid2 is not null order by name DESC;
+----+------+-----+--------+-----+------+
| id | name | cid | gender | age | cid2 |
+----+------+-----+--------+-----+------+
|  4 | lucy |   2 | F      |  25 |    4 |
|  1 | jim  |   1 | M      |  21 |    1 |
|  3 | jack |   3 | M      |  20 |    4 |
+----+------+-----+--------+-----+------+
3 rows in set (0.00 sec)

AS ,显示结果字段重命名

mysql> select name as stu_name from student where age >=20;
+----------+
| stu_name |
+----------+
| jim      |
| jack     |
| lucy     |
| neccy    |
+----------+
4 rows in set (0.00 sec)

LIMIT ,显示指定行数

LIMIT [offiset,]count

offset:偏移量
count:显示的总个数。

mysql> select name from student where age >=20;
+-------+
| name  |
+-------+
| jim   |
| jack  |
| lucy  |
| neccy |
+-------+
4 rows in set (0.00 sec)

mysql> select name from student where age >=20 limit 2;
+------+
| name |
+------+
| jim  |
| jack |
+------+
2 rows in set (0.00 sec)

mysql> select name from student where age >=20 limit 2,2;
+-------+
| name  |
+-------+
| lucy  |
| neccy |
+-------+
2 rows in set (0.00 sec)

聚合函数

MAX()、MIN()、SUM()、AVG()、COUNT()

显示男同学和女同学的平均年龄

mysql> select avg(age) from student where gender='M';
+----------+
| avg(age) |
+----------+
|  20.0000 |
+----------+
1 row in set (0.00 sec)

mysql> select avg(age) from student where gender='F';
+----------+
| avg(age) |
+----------+
|  27.5000 |
+----------+
1 row in set (0.00 sec)

group 分组

根据相同规则的分组,利用聚合函数

求男、女同学的平均年龄

mysql> select avg(age),gender from student group by gender;
+----------+--------+
| avg(age) | gender |
+----------+--------+
|  20.0000 | M      |
|  27.5000 | F      |
+----------+--------+
2 rows in set (0.00 sec)

HAVING 和GROUP BY 连用

HAVING 和GROUP BY 连用,用于过滤满足条件的内容。

打印同一门课,选修人数超过2个的选修人数以及课程ID。

mysql> select count(name) as num_person,cid from student group by cid having num_person >= 2;
+------------+-----+
| num_person | cid |
+------------+-----+
|          2 |   2 |
|          2 |   3 |
+------------+-----+
2 rows in set (0.00 sec)

多表查询

连接方式 举例
交叉连接 笛卡尔乘积(a+b)(c+d)= ac+ad + bc+bd,表A和表B的每一行都做匹配
自然连接(内连接) 两张表中对应字段存在等值关系
外连接 两张表中,不是完全的等值关系,表A和表B,以某字段作为连接关系,包括左外连接和右外连接。
左外连接 两张表中,不是完全的等值关系,显示所有学生的选修情况,如果还没有选择,选修课为空。 … LEFT JOIN … ON …
右外连接 两张表中,不是完全的等值关系,显示所有学生的选修情况,如果有一门课没有人选择,学生姓名显示为空 … RIGHT JOIN … ON …
自连接 一样表,不同的字段确立等值关系。
mysql> select * from student;
+----+-------+-----+--------+-----+------+
| id | name  | cid | gender | age | cid2 |
+----+-------+-----+--------+-----+------+
|  1 | jim   |   1 | M      |  21 |    1 |
|  2 | tom   |   2 | M      |  19 | NULL |
|  3 | jack  |   3 | M      |  20 |    4 |
|  4 | lucy  |   2 | F      |  25 |    4 |
|  5 | neccy |   3 | F      |  30 | NULL |
|  6 | mary  |   4 | F      |  21 |    5 |
|  7 | kaka  |   5 | M      |  21 |    3 |
|  8 | suke  |   3 | M      |  20 |    5 |
+----+-------+-----+--------+-----+------+
8 rows in set (0.00 sec)

mysql> select * from courses;
+-----+------------+
| cid | course     |
+-----+------------+
|   1 | Chinese    |
|   2 | English    |
|   3 | math       |
|   4 | computer   |
|   5 | biological |
+-----+------------+
5 rows in set (0.00 sec)

自然连接

显示所有同学的选修的第一门课程。

mysql> select student.name,courses.course from student,courses where student.cid = courses.cid;
+-------+------------+
| name  | course     |
+-------+------------+
| jim   | Chinese    |
| tom   | English    |
| lucy  | English    |
| jack  | math       |
| neccy | math       |
| suke  | math       |
| mary  | computer   |
| kaka  | biological |
+-------+------------+
8 rows in set (0.00 sec)

mysql> select s.name,c.course from student as s,courses as c where s.cid = c.cid;
+-------+------------+
| name  | course     |
+-------+------------+
| jim   | Chinese    |
| tom   | English    |
| lucy  | English    |
| jack  | math       |
| neccy | math       |
| suke  | math       |
| mary  | computer   |
| kaka  | biological |
+-------+------------+
8 rows in set (0.00 sec)

左外连接

表A... LEFT JOIN   表B... ON ...匹配条件

显示所有学生的第二门选修课程

mysql> select s.name,c.course from student as s left join courses as c on s.cid2 = c.cid;
+-------+------------+
| name  | course     |
+-------+------------+
| jim   | Chinese    |
| tom   | NULL       |
| jack  | computer   |
| lucy  | computer   |
| neccy | NULL       |
| mary  | biological |
| kaka  | math       |
| suke  | biological |
+-------+------------+
8 rows in set (0.00 sec)

右外连接

表A... RIGHT JOIN   表B... ON ...匹配条件

显示第二门选修课程对应的人

mysql> select s.name,c.course from student as s right join courses as c on s.cid2 = c.cid;
+------+------------+
| name | course     |
+------+------------+
| jim  | Chinese    |
| NULL | English    |
| kaka | math       |
| jack | computer   |
| lucy | computer   |
| mary | biological |
| suke | biological |
+------+------------+
7 rows in set (0.00 sec)

自连接

cid代表选修科目,cid2代表补考科目,显示选修课挂了的同学。(选修课和补考一样)

mysql> select s.id,s.name,s.cid,c.name,c.cid2 from student as s,student as c where s.cid=c.cid2 and s.name=c.name;
+----+------+-----+------+------+
| id | name | cid | name | cid2 |
+----+------+-----+------+------+
|  1 | jim  |   1 | jim  |    1 |
+----+------+-----+------+------+
1 row in set (0.00 sec)

子查询

一个查询中嵌套另外一个查询语句

  • 比较查询中使用子查询,子查询只能返回单值
  • in()中的子查询的方法
  • from中使用子查询

查询大于平均年龄的同学

mysql> select name,age from student where age > (select avg(age) from student);
+-------+-----+
| name  | age |
+-------+-----+
| lucy  |  25 |
| neccy |  30 |
+-------+-----+
2 rows in set (0.00 sec)

显示学生年龄和老师年龄相同的学生

mysql> select name from student  where age in (select age from teacher);
+-------+
| name  |
+-------+
| lucy  |
| neccy |
+-------+
2 rows in set (0.00 sec)

查询学生中大于30岁的人

mysql> select name,age from (select name,age from student) as t where t.age >=30;
+-------+-----+
| name  | age |
+-------+-----+
| neccy |  30 |
+-------+-----+
1 row in set (0.00 sec)

联合查询union

mysql> (select name,age from student) union (select name,age from teacher);
+------------+------+
| name       | age  |
+------------+------+
| jim        |   21 |
| tom        |   19 |
| jack       |   20 |
| lucy       |   25 |
| neccy      |   30 |
| mary       |   21 |
| kaka       |   21 |
| suke       |   20 |
| yuehan     |   25 |
| tomxu      |   30 |
| tangyouyou |   50 |
| caiyuanpei |  100 |
+------------+------+
12 rows in set (0.00 sec)

实例

mysql> select * from student;
+----+-------+-----+--------+-----+------+
| id | name  | cid | gender | age | cid2 |
+----+-------+-----+--------+-----+------+
|  1 | jim   |   1 | M      |  21 |    1 |
|  2 | tom   |   2 | M      |  19 | NULL |
|  3 | jack  |   3 | M      |  20 |    4 |
|  4 | lucy  |   2 | F      |  25 |    4 |
|  5 | neccy |   3 | F      |  30 | NULL |
|  6 | mary  |   4 | F      |  21 |    5 |
|  7 | kaka  |   5 | M      |  21 |    3 |
|  8 | suke  |   3 | M      |  20 |    5 |
+----+-------+-----+--------+-----+------+
8 rows in set (0.00 sec)
mysql> select * from courses;
+-----+------------+-----+
| cid | course     | tid |
+-----+------------+-----+
|   1 | Chinese    |   3 |
|   2 | English    |   2 |
|   3 | math       |   1 |
|   4 | computer   |   3 |
|   5 | biological |   4 |
+-----+------------+-----+
5 rows in set (0.00 sec)
mysql> select * from teacher;
+-----+------------+------+
| tid | name       | age  |
+-----+------------+------+
|   1 | yuehan     |   25 |
|   2 | tomxu      |   30 |
|   3 | tangyouyou |   50 |
|   4 | caiyuanpei |  100 |
|   5 | hongqigong |   88 |
|   6 | huangrong  |   45 |
+-----+------------+------+
6 rows in set (0.00 sec)



1.挑选出courses表中没有被students中的CID2学习的课程的课程名字

mysql> select * from courses where cid  not in (select distinct cid2 from student where cid2 is not null);
+-----+---------+
| cid | course  |
+-----+---------+
|   2 | English |
+-----+---------+
1 row in set (0.00 sec)
显示CID选择相同的学生大于2的学科
mysql> select course from courses where cid in (select cid from student group by cid having count(cid)>=2);
+---------+
| course  |
+---------+
| English |
| math    |
+---------+
2 rows in set (0.00 sec)

2.显示每一位老师以及其所有教授的课程,没有教授的课程的保持null

mysql> select t.name,c.course from teacher as t left join courses as c on c.tid=t.tid; 
+------------+------------+
| name       | course     |
+------------+------------+
| yuehan     | math       |
| tomxu      | English    |
| tangyouyou | Chinese    |
| tangyouyou | computer   |
| caiyuanpei | biological |
| hongqigong | NULL       |
| huangrong  | NULL       |
+------------+------------+
7 rows in set (0.00 sec)

3.显示每一个课程及其相关的老师,没有老师教授的课程将其老师显示为null

mysql> select t.name,c.course from teacher as t right join courses as c on c.tid=t.tid; 
+------------+------------+
| name       | course     |
+------------+------------+
| tangyouyou | Chinese    |
| tomxu      | English    |
| yuehan     | math       |
| tangyouyou | computer   |
| caiyuanpei | biological |
+------------+------------+
5 rows in set (0.00 sec)

4.显示每位同学CID1课程的课程名称及其讲授相关课程的老师的名称

mysql> select obj.name,obj.course,t.name from (select s.name,c.course,c.tid from student as s,courses as c where s.cid=c.cid) as obj,teacher as t where obj.tid = t.tid;
+-------+------------+------------+
| name  | course     | name       |
+-------+------------+------------+
| jack  | math       | yuehan     |
| neccy | math       | yuehan     |
| suke  | math       | yuehan     |
| tom   | English    | tomxu      |
| lucy  | English    | tomxu      |
| jim   | Chinese    | tangyouyou |
| mary  | computer   | tangyouyou |
| kaka  | biological | caiyuanpei |
+-------+------------+------------+
8 rows in set (0.00 sec)
mysql> select s.name,c.course,t.name from student as s,courses as c,teacher as t where s.cid=c.cid and c.tid=t.tid;
+-------+------------+------------+
| name  | course     | name       |
+-------+------------+------------+
| jim   | Chinese    | tangyouyou |
| tom   | English    | tomxu      |
| lucy  | English    | tomxu      |
| jack  | math       | yuehan     |
| neccy | math       | yuehan     |
| suke  | math       | yuehan     |
| mary  | computer   | tangyouyou |
| kaka  | biological | caiyuanpei |
+-------+------------+------------+
8 rows in set (0.00 sec)

你可能感兴趣的:(……【mysql】,MySQL)