-- 添加 3 个条件:年龄是20 岁,或者不是20 岁,或者年龄未知
- -- 添加 3 个条件:年龄是20 岁,或者不是20 岁,或者年龄未知
- SELECT * FROM t_student
- WHERE age = 20
- OR age <> 20
- OR age IS NULL;
CASE 表达式和 NULL。简单 CASE 表达式如下:
- CASE col_1
- WHEN = 1 THEN 'o'
- WHEN NULL THEN 'x'
- END
这个 CASE 表达式一定不会返回 ×。这是因为,第二个 WHEN 子句是 col_1 = NULL 的缩写形式。正如我们所知,这个式子的逻辑值永远是 unknown ,而且 CASE 表达式的判断方法与 WHERE 子句一样,只认可逻辑值为 true 的条件。正确的写法是像下面这样使用搜索 CASE 表达式:
- CASE WHEN col_1 = 1 THEN 'o'
- WHEN col_1 IS NULL THEN 'x'
- END
NOT IN 和 NOT EXISTS 并非等价
我们在对 SQL 语句进行性能优化时,经常用到的一个技巧是将 IN 改写成 EXISTS ,这是等价改写,并没有什么问题。但是,将 NOT IN 改写成 NOT EXISTS 时,结果未必一样。
我们来看个例子,我们有如下两张表:t_student_A 和 t_student_B,分别表示 A 班学生与 B 班学生。
- DROP TABLE IF EXISTS t_student_A;
- CREATE TABLE t_student_A (
- id INT(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键',
- name VARCHAR(50) NOT NULL COMMENT '名称',
- age INT(3) COMMENT '年龄',
- city VARCHAR(50) NOT NULL COMMENT '城市',
- remark VARCHAR(500) NOT NULL DEFAULT '' COMMENT '备注',
- primary key(id)
- ) COMMENT '学生信息';
-
- INSERT INTO t_student_A(name, age, city)
- VALUE
- ('zhangsan', 25,'深圳市'),('wangwu', 60, '广州市'),
- ('bruce', 32, '北京市'),('yzb', NULL, '深圳市'),
- ('boss', 43, '深圳市');
-
- DROP TABLE IF EXISTS t_student_B;
- CREATE TABLE t_student_B (
- id INT(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键',
- name VARCHAR(50) NOT NULL COMMENT '名称',
- age INT(3) COMMENT '年龄',
- city VARCHAR(50) NOT NULL COMMENT '城市',
- remark VARCHAR(500) NOT NULL DEFAULT '' COMMENT '备注',
- primary key(id)
- ) COMMENT '学生信息';
-
- INSERT INTO t_student_B(name, age, city)
- VALUE
- ('马化腾', 45, '深圳市'),('马三', 25, '深圳市'),
- ('马云', 43, '杭州市'),('李彦宏', 41, '深圳市'),
- ('年轻人', 25, '深圳市');
-
- SELECT * FROM t_student_A;
- SELECT * FROM t_student_B;
(编辑:晋中站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|