查询语法:
select 主查询,主要查询语句都需要它
select 属性列表 from 表名 [ where 条件表达式1]
[group by 属性名 [ Having 条件表达式2]] ->分组
[order by 属性名 [ASC|DESC]] ->排序
*表示查询全部属性
示例:
// 全部属性
mysql> select * from Student;
+-----+-------+------+------+
| SID | Sname | Sage | Ssex |
+-----+-------+------+------+
| 1 | 赵雷 | 20 | 男 |
| 2 | 钱电 | 20 | 男 |
| 3 | 孙风 | 21 | 男 |
| 4 | 吴兰 | 18 | 女 |
| 5 | 孙兰 | 17 | 女 |
+-----+-------+------+------+
5 rows in set (0.05 sec)
//指定属性
mysql> select SID,Sname from Student;
+-----+-------+
| SID | Sname |
+-----+-------+
| 1 | 赵雷 |
| 2 | 钱电 |
| 3 | 孙风 |
| 4 | 吴兰 |
| 5 | 孙兰 |
+-----+-------+
5 rows in set (0.00 sec)
合并查询结果:
union(联合) 关键字和 union all关键字都可以合并查询结果,但是两者有一点区别,union关键字合并查询结果时,需要将相同的记录消除掉。而union all关键字则相反,不会消除相同的记录,而是将所有的记录合并在一起。
mysql> select SID from Student union select SID from SC;
+------+
| SID |
+------+
| 4 |
| 5 |
| 3 |
| 1 |
| 2 |
| 6 |
+------+
6 rows in set (0.00 sec)
mysql> select SID from Student union all select SID from SC;
+------+
| SID |
+------+
| 4 |
| 5 |
| 3 |
| 1 |
| 2 |
| 1 |
| 1 |
| 1 |
| 2 |
| 2 |
| 2 |
| 3 |
| 3 |
| 3 |
| 4 |
| 4 |
| 4 |
| 5 |
| 5 |
| 6 |
+------+
20 rows in set (0.04 sec)
子查询
in:
in(元素1,元素2…) 包含括号里面元素的列表,
not in(元素1,元素2…)不包含括号里面元素里面的列表
示例:
mysql> select * from Student where SID in(1,3,4);
+-----+-------+------+------+
| SID | Sname | Sage | Ssex |
+-----+-------+------+------+
| 1 | 赵雷 | 20 | 男 |
| 3 | 孙风 | 21 | 男 |
| 4 | 吴兰 | 18 | 女 |
+-----+-------+------+------+
3 rows in set (0.04 sec)
//不包括
mysql> select * from Student where SID not in(1,3,4);
+-----+-------+------+------+
| SID | Sname | Sage | Ssex |
+-----+-------+------+------+
| 2 | 钱电 | 20 | 男 |
| 5 | 孙兰 | 17 | 女 |
+-----+-------+------+------+
2 rows in set (0.00 sec)
带比较运算符的子查询
select * from SC where SID=(select SID from Student where Sage=20);
带exists关键字的子查询
exists关键字表示存在。使用exists关键字时,内层查询语句不返回查询的记录。而是返回一个真假值。如果内层查询语句查询到满足条件的记录,就返回一个真值,否则返回一个假值。当返回的值为true时,外层查询语句将进行查询,当返回为false时,外层语句不进行查询或者查询不出记录。
mysql> select * from SC where exists(select * from Student where SID=10);
Empty set (0.00 sec)
mysql> select * from SC where exists(select * from Student where SID=1);
+------+------+-------+
| SID | CID | score |
+------+------+-------+
| 1 | 1 | 80 |
| 1 | 2 | 71 |
| 1 | 3 | 87 |
| 2 | 1 | 88 |
| 2 | 2 | 70 |
| 2 | 3 | 89 |
| 3 | 1 | 68 |
| 3 | 2 | 78 |
| 3 | 3 | 87 |
| 4 | 1 | 67 |
| 4 | 2 | 58 |
| 4 | 3 | 89 |
| 5 | 1 | 56 |
| 5 | 2 | 89 |
| 6 | 3 | 38 |
+------+------+-------+
15 rows in set (0.00 sec)
带any关键字的子查询:
any关键字表示满足其中任何一个条件,使用any关键字时,只要满足内层查询语句返回结果中的任何一个,就可以通过该条件来执行外层查询语句。
any通常与比较运算符一起使用 如>ANY 表示大于任何一个值,=any表示等于任何一个值
//只要内层返回的结果中,有一个能满足外层的条件,那么内层返回的所有结果都会被显示。
mysql> select * from Course;
+-----+-------+------+
| CID | Cname | TID |
+-----+-------+------+
| 1 | 语文 | 2 |
| 2 | 数学 | 1 |
| 3 | 英语 | 3 |
+-----+-------+------+
3 rows in set (0.05 sec)
mysql> select * from Teacher;
+-----+-------+
| TID | Tname |
+-----+-------+
| 1 | 张三 |
| 2 | 李四 |
| 3 | 王五 |
+-----+-------+
3 rows in set (0.05 sec)
mysql> select * from Course where TID>any(select TID from Teacher where TID>=!<2);
+-----+-------+------+
| CID | Cname | TID |
+-----+-------+------+
| 1 | 语文 | 2 |
| 3 | 英语 | 3 |
+-----+-------+------+
2 rows in set (0.00 sec)
带all关键字的子查询:
all关键字表示满足所有条件。使用all关键字时,只有满足内层查询语句返回的所有结果,才能执行外层查询语句。all关键字也可以与比较运算符一起使用。
//通俗来说过,内层返回的结果,只有满足外层的条件才可以
mysql> select * from Course where TID>all(select TID from Teacher where TID>=!<2);
Empty set (0.00 sec)
mysql> select * from Course where TID>all(select TID from Teacher where TID=2);
+-----+-------+------+
| CID | Cname | TID |
+-----+-------+------+
| 3 | 英语 | 3 |
+-----+-------+------+
1 row