条件查询 通常使用where语句,增加一些逻辑、比较、表达式,来对查询到的结果集进一步过滤。
PostgreSQL条件的列表: 通常包含下面的语法
- AND 条件:并且的意思
- OR 条件:或者的意思
- AND & OR 条件:并且和或者混合使用
- NOT 条件:取反
- LIKE 条件:模糊查询
- IN 条件:集合查询
- NOT IN 条件:集合查询的相反
- BETWEEN 条件:范围查询
下面我们逐一讲解
a and b 只要a和b同时为真,那么结果才为真 否则结果为假 相当于我们的串联电路。 明天天气好 并且我有空 就去钓鱼。
and条件
and条件 用于把两个条件并起来。就是我们平常说的 xxx 并且 xxx
比如 查找 subjects为a 并且年龄 少于60岁的学生。
SELECT * FROM student WHERE subjects = 'a' AND age < 60;
Code language: JavaScript (javascript)
这里 两个条件 subjects = ‘a’ 和 age < 60 然后使用and 把两个条件 并且起来。 也就是 两个条件要同时成立
只要任意一个条件不满足,这条记录就不会被查询出来,和串联电路逻辑一致。

OR条件
和AND条件一样。OR条件是或者的意思。 也就是两个条件 只要满足其中一个条件 就可以。 通常 我们的postgresql 会一行行 检查 满足的就显示 不满足的不显示。
SELECT * FROM student WHERE subjects = 'a' OR age < 60;
Code language: JavaScript (javascript)
比如 学习成绩大于90 或者 是三好学生 就参加会议。
笔记要点: AND 需要全部条件成立;OR只需要至少一个条件成立,类似并联电路。

AND 和 OR 混合使用
如果条件语句里面 出现and和or,则按从左到右来运算。
注意:AND 的优先级高于 OR,不是单纯从左往右! 比如 当然 我们可以使用小括号 来改变这种运算顺序。
SELECT * FROM student WHERE subjects = 'a' OR age < 60 AND id <4 ;
Code language: JavaScript (javascript)
这时候 它会先计算AND,也就是先计算 age < 60 AND id <4 得到的结果 是true或者false 然后再和前面的 subjects = 'a' 进行OR运算。
我们也可以使用小括号 来改变 运行顺序。
SELECT * FROM student WHERE subjects = 'a' OR (age < 60 AND id <4 );
Code language: JavaScript (javascript)
也就是先计算括号里面的,然后再和前面的 进行or运算。
例子:
SELECT * from student
where
subjects = 'a' or (age < 60 and id < 3)
Code language: JavaScript (javascript)
加括号版本和不加括号版本效果是一样的,因为AND优先级本来就比OR高。
不加括号时,数据库优先执行AND,再执行OR,不是简单从左向右。如果想让OR先执行,就必须加上小括号。


NOT条件
NOT条件与WHERE子句一起使用以否定查询中的条件 就是取条件的对立面。比如 原来是对,加NOT之后就是错。
比如 获取id 是 1 3 5的学生
SELECT * FROM student WHERE id IN(1,3,5);
但是 如果我们希望查找 id 不在 1 3 5 里面的。也就是取相反的条件。 可以在前面加个not
SELECT * FROM student WHERE id NOT IN(1,3,5);
另外 not 还通常 有IS NOT NULL的用法 也就是 判断一个字段 获取不为null 空的记录。
SELECT * from student
where
--id not in (1,3,5)
--age is not null
--name not like
Code language: JavaScript (javascript)
要点: NOT 可以放在 IN、LIKE、IS NULL 前面做取反。
IS NOT NULL不能写成NOT IS NULL,是固定写法。



LIKE条件
LIKE条件与WHERE子句一起用于从指定条件满足LIKE条件的表中获取数据
首先看一下我们的student表的所有记录 下面我们要查找名字有国字的 为了方便查找 我们增加一条记录 增加一个张国忠的人
INSERT INTO public.student( id, name, subjects,age) VALUES (7, '张国忠', 'd',80);
Code language: PHP (php)
这时候 表数据如下 下面我们查找 名字name带有国的
SELECT * FROM student WHERE name LIKE '%国%';
Code language: JavaScript (javascript)
也可以使用not 来取反 比如 名字不带国的
SELECT * FROM student WHERE name NOT LIKE '%国%';
Code language: JavaScript (javascript)
这里的% 意思是 匹配任意其他的字符
我们可以不写 比如我希望 查找 以张开头的人
SELECT * FROM student WHERE name LIKE '张%';
Code language: JavaScript (javascript)
以友结尾的
SELECT * FROM student WHERE name LIKE '%友';
Code language: JavaScript (javascript)
但是我们发现 结尾友的 我们查不出来。 原因是我们的name字段的类型 写了character,应该改为可变字符串。否则 结尾会自动填充空白的。 上面的name 改为 character varying,这样 就是可变字符串。也就是字符串长度不是固定的,根据字符大小为准。所以 友就是结尾的。如果是character 则结尾不是友,而是空白。
SELECT * from student where
--name like '%国%' -- 名字出现国字的
--name like '张%' --姓张的人 张前面没有字符 后面可以有字符
name like '%友'
Code language: JavaScript (javascript)
笔记要点:
%:通配符,匹配0个或者多个任意字符。char(固定长度)类型会自动在字符串末尾补空格,使用
LIKE '%结尾字符'容易查询失败,推荐使用varchar(character varying)。


IN语句
in语句 用于 查找一个字段 在一个集合里面。比如 id in (1,2,3) id在1 2 3里面的 或者name in (‘张国荣’,’张卫健’) 名字在 张国荣 张卫健里面的。
所有记录如下。我们查找 id 在1 4 5里面的
SELECT * FROM student WHERE id IN (1,4,5);
SELECT * from student
where
name IN ('张学友','周','张卫健')
Code language: JavaScript (javascript)
IN里面的内容,不只是整数,还可以是字符串。
IN 相当于多个 OR 的简写。
id IN (1,4,5)等价于id = 1 OR id =4 OR id =5


NOT IN语句
我们上节课说 IN是表示 某个字段 在某个范围里面的。 那么NOT IN 则表示不在这个范围里面的。
SELECT * FROM student WHERE id NOT IN (1,4,5);
查找 名字不在 张国荣 张卫健里面的
SELECT * FROM student WHERE name NOT IN ('张卫健','张国荣');
Code language: JavaScript (javascript)
注意 字符串 需要用引号括起来。
not 还可以和like搭配,比如 not like 还可以和null搭配,比如 is not null
要点: NOT IN 就是 IN 的取反。
注意:集合里面如果存在NULL值,NOT IN 查询会返回空结果,这点后续可以留意。


BETWEEN条件
获取开始结束范围
SELECT * FROM student WHERE id BETWEEN 2 AND 12;
BETWEEN 用来查询字段落在开始值和结束值之间的数据,包含两端的值。 上面这条语句含义:查找id大于等于2,并且小于等于12的学生记录。 等价写法:
SELECT * FROM student WHERE id >= 2 AND id <= 12;
也可以搭配 NOT 使用,表示不在这个区间内:
SELECT * FROM student WHERE id NOT BETWEEN 2 AND 12;
含义:id小于2 或者 id大于12。
要点: BETWEEN … AND … 是闭区间,首尾两个值都会包含进去。 不仅可以用于数字,也可以用于日期类型。
