where子查询

限定查询(WHERE子句)


之前的查询是将一张表的全部记录查询出来,那么现在如果希望可以根据指定的条件查询的话,则必须指定限定查询。

格式:

[SELECT] [{DISTINCT}] [* |具体的列别名FROM表名称] [{WHERE 条件(s)}]

例:查询出工资大5000的雇员的信息。

数学计算中,工资大于5000:sal > 5000

l  SELECT * FROM emp WHERE sal > 4000 ;

输出如下:

例:查询每月可以得到奖金的雇员信息

奖金是comm字段,只要字段中存在内容,则表示内容不为空(null),如果存在内容,则会显示具体的值。

l  不为空的表示:字段 IS NOT NULL

l  SELECT * FROM emp WHERE comm IS NOT NULL ;

输出如下:

例:查询没有奖金的雇员

没有奖金则comm字段的内容肯定是NULL,

l  肯定是空的表示:IS NULL

l  SELECT * FROM emp WHERE comm IS NULL ;

输出如下:

例:要求查询出基本工资大于1500,同时可以领取奖金的雇员信息。

l  此时应该是两个条件,而且两个条件必须同时满足

l  既然要求两个条件全部满足,则必须使用AND操作符进行条件的连接。

l  SELECT * FROM emp WHERE sal > 1500 AND comm IS NOT NULL ;

输出如下:

例:要求查询出基本工资大于1500,或者可以领取奖金的雇员信息。

l  如果要表现出或者的概念是由OR 进行连接,表示两个条件有一个满足就输出信息。

l  SELECT * FROM emp WHERE sal > 3000 OR comm IS NOT NULL ;

输出如下:

之前使用NOT可以取反,把真的条件变为假,把假的变为真的。

例:要求查询出基本工资不大于1500或者不可以领取奖金的雇员信息。

l  此时相当于是对(基本工资大于1500并且可以领取奖金的雇员)整体的条件取反,我们可以用()来表示一组整体。

l  SELECT * FROM emp WHERE NOT (sal > 1500 AND comm IS NOT NULL) ;

l  上面的取反后的意思就是基本工资小于等于1500或者不可以领取奖金的雇员信息。所以,也可以用下面的语句查询,输出都是一样的

l  SELECT * FROM emp WHERE sal <= 1500 OR comm IS NULL ;

输出如下:(第一条语句)

输出如下:(第二条语句)

例:查询基本工资大于1500并且小于3000的全部雇员的信息。

l  SELECT * FROM emp WHERE sal > 1500 AND sal < 3000 ;

输出如下:

在SQL语法中,提供了一个专门的指定范围的查询的过滤语句,BETWEEN … AND…

语句格式:字段 BETWEEN最小值 AND 最大值 ;

例:使用BETWEEN …AND …完成(基本工资大于等于1500并且小于等于3000)的查询。

l  SELECT * FROM emp WHERE BETWEEN 1500 AND 3000 ;

输出如下:

实际上BETWEEN … AND … 操作等价:sal >= 1500 AND sal <= 3000 ;包含了等于的功能。

例:要求查询出在1981年雇佣的全部雇员信息。

l  从1981年1月1日 ~ 1981年12月31日之间的雇员

l  日期加入的时候要加入“‘“。

l  SELECT * FROM emp WHERE hiredate BETWEEN ‘1-1月 -81’ AND ’31-12月 -81’ ;

输出如下:

结论:BETWEEN … AND … 查询除了可以支持数字之外,也可以支持日期的查询

l  随着深入的学习会发现,日期实际上也是以数字的形式表示出来的。

           例:查询出姓名是SMITH的雇员信息。

l  此时告诉了要查询的姓名,条件:ename = ‘smith’ ;

l  SELECT * FROM emp WHERE ename = ‘smith’ ;

输出如下:

执行以上的查询语句之后,并不会返回查询结果,再次查询数据库表的信息,发现smith是采用大写的形式表示出来的,在ORACLE中是对大小写敏感的,所以在查询的时候必须以大写的形式进行条件的编写,语句修改如下:

l  SELECT * FROM emp WHERE ename = ‘SMITH’ ;

输出如下:

例:要求查询出雇员编号是7369、7499、7521的雇员的具体信息

l  如果此时按照之前的做法,则设置条件要使用OR连接

l  SELECT * FROM emp WHERE empno = 7369 OR empno = 7499 OR empno = 7521;

输出如下:

我们发现这样也是可以的,但是,如果让我们查询几十条呢?实际上,此时是指定了查询的范围,既然有范围了,那么,在SQL语句中就可以使用IN操作符完成。

l  语法格式:

字段 IN (值1,值2, ………, 值n) ;

l  如果现在要求查询的内容不在此范围之中,则可以使用NOT IN,语法如下

字段 NOT IN (值1,值2, ………, 值n) ;

例:使用以上的格式完成(雇员编号是7369、7499、7521)的雇员信息查询

l  SELECT * FROM emp WHERE empno IN (7369, 7499, 7521) ;

输出如下:

例:要求查询出雇员编号不是7369、7499、7521的雇员的具体信息。

l  SELECT * FROM emp WHERE empno NOT IN (7369, 7499, 7521) ;

输出如下:

另外,需要说明的是,使用IN操作符不光可以用在数字上,也可以用在字符串的信息上。

例:要求查询出雇员姓名是SMITH、ALLEN、KING的雇员的信息。

l  SELECT * FROM emp WHERE ename IN (‘SMITH’, ‘ALLEN’, ‘KING’) ;

输出如下:

提示:如果在指定的查询范围中指了额外的内容,则不影响程序的运行。

例:要求查询出雇员姓名是SMITH、ALLEN、KING、jdkjdk$#的雇员的信息。

l  SELECT * FROM emp WHERE ename IN (‘SMITH’, ‘ALLEN’, ‘KING’, ‘jdkjdk$#’);

输出如下:

在一般的日常见到的站点中经常发现有模糊查找功能,即:输入一个指定的关键字,把符合的内容全部查询出来,在SQL中使用LIKE语句完成。

在使用LIKE语句的时候要注意通配符的使用,在LIKE语句中主要使用以下两种通配符

l  “%”:可以匹配任意长度的内容;

l  “_”:可以匹配一个长度的内容;

     例:查询出所有雇员姓名中第二个字母是“M”的雇员信息。

l  SELECT * FROM emp WHERE ename LIKE ‘_M%’ ;

输出如下:

例:要求查询雇员姓名中包含字母M的雇员信息。

l  此时,表示可以任意的位置上出现字母M

l  SELECT * FORM emp WHERE ename LIKE ‘%M%’ ;

输出如下:

但是,要提醒大家的是:“如果在使用LIKE的时候没有指定查询的关键字,则表示查询全部“。

使用LIKE 还可以方便的进行日期的查找功能。

例:要求查询出在1981年雇佣的雇员信息。

l  SELECT * FROM emp WHERE hiredate LIKE ‘%81%’ ;

输出如下:

在操作条件中还可以使用:>、>=、=、<=等计算符。

不等于符号:在SQL中如果要想使用不等于符号,可以有两种形式:“<>”、“!=”

例:要求查询编号不为7369的雇员的信息

l  使用“<>”完成

l  SELECT * FROM emp WHERE empno <> 7369 ;

输出如下:

l  使用“!=”完成

l  SELECT * FROM emp WHERE empno != 7369 ;

输出如下:

时间: 2024-08-28 18:57:32

where子查询的相关文章

子查询

子查询返回单行多列: ANY三种用法: ALL两种用法:

SQL Server子查询填充DataSet时报500内部错误的解决办法

运行环境为Visual Studio 2010,数据库为SQL Server 2008. 执行下面SQL语句 SELECT SubsiteId, SubsiteTitle, count(CollectionID) CollectionNumber,count(LName) PlantNumber FROM (SELECT DISTINCT SubsiteId, SubsiteTitle, CollectionID, LName, CName FROM Cumplag_Garden_Plants

Mysql数据库理论基础之五--SELECT单多表查询、子查询、别名

一.简介 由MySQL AB公司开发,是最流行的开放源码SQL数据库管理系统,主要特点: 1.是一种数据库管理系统 2.是一种关联数据库管理系统 3.是一种开放源码软件,且有大量可用的共享MySQL软件 4.MySQL数据库服务器具有快速.可靠和易于使用的特点 5.MySQL服务器工作在客户端/服务器模式下,或嵌入式系统中 InnoDB存储引擎将InnoDB表保存在一个表空间内,该表空间可由数个文件创建.这样,表的大小就能超过单独文件的最大容量.表空间可包括原始磁盘分区,从而使得很大的表成为可能

前端学数据库之子查询

查询数据库,当查询条件比较复杂时,常常需要用到子查询.子查询(Subquery)是指出现在其他SQL语句内的SELECT子句.本文将详细介绍子查询 定义 子查询(Subquery)是指出现在其他SQL语句内的SELECT子句 SELECT * FROM t1 WHERE col1 = (SELECT col2 FROM t2); 其中,SELECT * FROM t1,称为外层查询(Outer Query/Outer Statement),SELECT col2 FROM t2,称为子查询(Su

ThinkPHP3.2 SQL alias 子查询

SELECT info_key, info_value, info_status, edit_time FROM (SELECT * FROM `detail` WHERE login = '[email protected]' ORDER BY edit_time DESC  ) AS aaa GROUP BY info_key 希望通过Thinkphp实现基于alias的子查询,终于参考下面这个文章实现了. http://www.thinkphp.cn/update/122.html 如下是

sql的基础语句-单行函数,dual,数字函数,日期函数,表连接,集合运算,分组报表,单行子查询,多行子查询

3. 单行函数 3.1 转换函数 select ascii('A'),chr(65) from dual; select to_char(1243123),1231451 from dual;靠左边的就是字符串,靠右边的就是数字 select to_char(123512a121) from dual;   --错误的写法,没有引号表示数字,但是数字里面包含了字母,不合法的输入值 select to_number('123141211') from dual; select to_number(

mysql子查询慢的问题

当你在用explain工具查看sql语句的执行计划时,若select_type 字段中出现"DEPENDENT SUBQUERY"时,你要注意了,你已经掉入了mysql子查询慢的"坑"...下面我们来看一个具体的例子 有这样一条查询语句: SELECT gid,COUNT(id) as count FROM shop_goods g1 WHERE status =0 and gid IN (SELECT gid FROM shop_goods g2 WHERE si

Mysql——子查询

子查询的位置: select 中.from 后.where 中.group by 和order by 中无实用意义. 子查询分为如下几类: 1,标量子查询:返回单一值的标量,最简单的形式. 2,列子查询:返回的结果集是 N 行一列. 3,行子查询:返回的结果集是一行 N 列. 4,表子查询:返回的结果集是 N 行 N 列. 可以使用的操作符:= > < >= <= <> ANY IN SOME ALL EXISTS 标量子查询:是指子查询返回的是单一值的标量,如一个数字

彻底搞懂oracle的标量子查询

oracle标量子查询和自定义函数有时用起来比较方便,而且开发人员也经常使用,数据量小还无所谓,数据量大,往往存在性能问题. 以下测试帮助大家彻底搞懂标量子查询. SQL> create table a (id int,name varchar2(10)); Table created. SQL> create table b (id int,name varchar2(10)); Table created. SQL> insert into a values (1,'a1'); 1

SQL----关联子查询

在where子句中使用子查询时,该子查询的结果必须是单一的 所以在以不同商品为单位,对售价进行比较就要用到关联子查询 如下表格:Table_2 ID 商品 售价 1 苹果 15 2 猕猴桃 11 3 梨 22 4 梨 23 5 猕猴桃 23 6 梨 12 7 猕猴桃 10 8 猕猴桃 3 9 苹果 5 SELECT * FROM Table_2 AS S1 WHERE 售价>(SELECT AVG(售价) FROM Table_2 AS S2 WHERE S1.商品=S2.商品 /*结合条件一定