条件查询

条件查询 通常使用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 … 是闭区间,首尾两个值都会包含进去。 不仅可以用于数字,也可以用于日期类型。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注