SQL语句的顺序
SELECT
[DISTINCT]
查询列表
[FROM 表名]
[WHERE 布尔表达式]
[GROUP BY 分组列表 ]
[HAVING 分组过滤条件]
[ORDER BY 排序列表]
[LIMIT 开始行, 限制条数]
AND 优先级比 OR 高
SQL 语句:
SELECT * FROM score WHERE score > 90 OR score < 50 AND subject = '计算机网络';
该语句的判断条件在SQL中解析如下:
score < 50 AND subject = '计算机网络'
scire > 90
傻眼了,原本你以为的是score > 90 OR score < 50
AND subject = '计算机网络'
,结果变成上面那样了。
原因:AND操作符的 优先级高于OR操作符
所以你应该用括号括起来:
SELECT * FROM score WHERE (score > 90 OR score < 50) AND subject = '计算机网络';
WHERE语句中不能用聚集函数 & 子查询中对同个表的子查询
聚集函数是对列进行计算的,它是对当前结果集中全列的结果进行计算,结果集的全列需要是固定的。而WHERE
是根据条件对所有行进行筛选,是处于一个正在筛选的过程中。
子查询对同个表进行子查询
例如:我想查询一下课程名为计算机网络
,并且该该课程平均分大于90
的学号。
SELECT num_id FROM student_score WHERE subject = '计算机网络'
AND
score > (SELECT AVG(score) FROM student_score WHERE subject = '计算机网络');
内、外连接
- 内连接:
对于内连接
的两个表,参照表中的记录在被参照表中找不到匹配的记录,该记录不会加入到最后的结果集。
引自小册: MySQL 是怎样使用的:从零蛋开始学习 MySQL
例如:下面这个表是学生信息表,是完整的,但是下面的20180105
在另外一张成绩表中是没有的,做内连接后,最后的结果集中是没有该学生字段的信息。
+----------+--------+------+--------------------+------------+------------------+-----------------+
| number | name | sex | id_number | department | major | enrollment_time |
+----------+--------+------+--------------------+------------+------------------+-----------------+
| 20180101 | 杜子腾 | 男 | 158177199901044792 | 计算机学院 | 计算机科学与工程 | 2018-09-01 |
| 20180102 | 杜琦燕 | 女 | 151008199801178529 | 计算机学院 | 计算机科学与工程 | 2018-09-01 |
| 20180103 | 范统 | 男 | 17156319980116959X | 计算机学院 | 软件工程 | 2018-09-01 |
| 20180104 | 史珍香 | 女 | 141992199701078600 | 计算机学院 | 软件工程 | 2018-09-01 |
| 20180105 | 范剑 | 男 | 181048199308156368 | 航天学院 | 飞行器设计 | 2018-09-01 |
| 20180106 | 朱逸群 | 男 | 197995199501078445 | 航天学院 | 电子信息 | 2018-09-01 |
+----------+--------+------+--------------------+------------+------------------+-----------------+
- 外连接:
对于外连接
的两个表,参照表中的记录即使在被参照表中没有匹配的记录,也仍然需要加入到结果集。缺失的内容以NULL填充。
【忽略】批量语句时,对有主键或唯一限制的规则,保证正确的内容插入,重复的内容忽略
使用INSERT IGNORE
语句。例如表info
中有字段a
不允许插入重复的值,现在表中字段a
已经有111
现在有这样以一个语句
INSERT IGNORE INTO info (a, b) VALUES(111, '哈哈'), (222, '哈哈哈');
则最终结果是(222, '哈哈哈')
插入成功。(111, '哈哈')
被忽略。
【更新】批量语句时,对有主键或唯一限制的规则,保证正确的内容插入,重复的内容更新
ON DUPLICATE KEY UPDATE 字段名 = 更新值
INSERT INTO info (a, b) VALUES(111, '嘻嘻') ON DUPLICATE KEY UPDATE b = '嘻嘻';
触发器的注意事项
- 触发器中不要用
SELECT
返回结果集。 NEW
代表记录的列的值可以被更改,OLD
代表记录的列的值无法更改。可以SET NEW.列名 = ...
。- 某个操作语句有问题了,
AFTER
触发器无效。 - 触发器也是SQL操作的一部分,发生了错误会让整个语句回滚。