编程无涯乐在其中

导航

day2

1、

--where关键字

--作用:过滤行

--例:查询工资大于2000的员工信息

select * from emp where sal <= 5000

 

-- =,!=,<>,<,>,<=,>=,any,some,all

--查询员工信息,条件:薪水要大于1000,薪水还要大于1500,薪水还要大于2000

select * from emp where sal != any(1000,1500,2000)

--some和any用法一样

--all表示所有

-- is null,is not null

select * from emp where comm is not null;

--错误:select * from emp where comm = null

-- between x and y

--查询员工薪水在2000-3000的员工信息

select * from emp where sal between 2000 and 3000

--and、or 、not逻辑运算符

select * from emp where sal >= 2000 and sal <=3000

-- in(list),not in(list)

--查询职务为MANAGER和ANALYST的员工信息

select * from emp where job in ('MANAGER','ANALYST')

--查询工资不为3000和5000的员工信息

select * from emp where sal not in (3000,5000)

-- exists(sub-query)、not exists(sub-query)

select * from emp where exists(select * from dept where deptno != 50)

-- like _ ,%,escape ‘\‘ _\% escape ‘\’

--like关键字

--模糊查询,有两个特殊的符号"%" ,"_"

--“%”表示匹配零个或若干字符

--“_”表示匹配一个字符

--查询:员工姓名中含有“%”的员工信息

select * from emp where ename like '%\%%' escape '\'

--插入一条信息:insert into emp(empno,ename) values(9527,'huan%an');

  • 使用IS NULL运算符进行空值判断
  • 用法举例
    • select * from emp where comm is null;
    • select * from emp where comm is not null;

2、where

3、sql查询原理

SQL select查询原理--查询语句执行原则<转>

1.单表查询:根据WHERE条件过滤表中的记录,形成中间表(这个中间表对用户是不可见的);然后根据SELECT的选择列选择相应的列进行返回最终结果。

 

 

1)简单的单表查询

 

SELECT 字段

FROM 表名

WHERE 条件表达式

 

那它们是按什么顺序执行呢?分析器会先看语句的第一个词,当它发现第一个词是SELECT关键字的时候,它会跳到FROM关键字,然后通过FROM关键字找到表名并把表装入内存。接着是找WHERE关键字,如果找不到则返回到SELECT找字段解析,如果找到WHERE,则分析其中的条件,完成后再回到SELECT分析字段。最后形成一张我们要的虚表。

WHERE关键字后面的是条件表达式。如果学过C语言等编程语言就会知道,条件表达式计算完成后,会有一个返回值,即非0或0,非0即为真(true),0即为假(false)。同理WHERE后面的条件也有一个返回值,真或假,来确定接下来执不执行SELECT。

 

例:

SELECT *

FROM STUDENT

WHERE SNO = '1';

 

分析器先找到关键字SELECT,然后跳到FROM关键字将STUDENT表导入内存,并通过指针p1找到第一条记录,接着找到WHERE关键字计算它的条件表达式,如果为真那么把这条记录装到一个虚表当中,p1再指向下一条记录。如果为假那么p1直接指向下一条记录,而不进行其它操作。一直检索完整个表,并把虚表返回给用户。

再说EXISTS谓词,EXISTS谓词也是条件表达式的一部分。当然它也有一个返回值(true或false)。

 

例:

SELECT Sname

FROM Student

WHERE EXISTS

(SELECT *

FROM SC

WHERE SC.Sno = Student.Sno AND SC.Cno = '1');

 

这是一个SQL语句的嵌套使用,但和上面说的SQL语句的执行过程也是相同的。嵌套的意思也就是说当分析主SQL语句(外面的那个SELECT)到WHERE关键字的时候,又进入了另一个SQL语句中。那么也就是说,分析器先找到表Student并装入内存,一个指针(例如p1)指向Student表中的第一条记录。然后进入WHERE里分析里面的SQL语句,再把SC表装入内存,另一个指针(例如p2)指向SC表中的第一条记录,分析WHERE后面的条件表达式,依次进行分析,最后分析出一个虚表2,也就变成

 

SELECT Sname

FROM Student

WHERE EXISTS 虚表2

 

如果虚表为空表,EXISTS 虚表2 也就为false,不返回到SELECT,而p1指向下一条记录。如果虚表2不为空也就是有记录,那么EXISTS 虚表2 为true同,返回到SELECT并把p1指向的记录添加到主SQL语句的虚表1当中。(这也是为什么嵌套的SQL语句SELECT 后面为一般为*的原因,因为它EXISTS返回的只是真或假,字段的名没有意义,用*就行,当然用别的也不会错。 )

 

注意,这里虽然嵌套的SQL语句分析完了,但主SQL语句只执行了一遍,也就是说p1指向Student的第一条记录,p1还要再指向Student表的下一条记录并分析,这样又进入了嵌套中的SQL语句,同上面说的一样分析。当p1也到了Student表的结尾,整个SQL语句结束。返回虚表1Sname这一列。

 

嵌套就像:

 

for(int i = 0,i < n, ++i)

for(int j = 0, j < n, ++j)

 

2,两表连接查询:对两表求积(笛卡尔积)并用ON条件和连接连接类型进行过滤形成中间表;然后根据WHERE条件过滤中间表的记录,并根据SELECT指定的列返回查询结果。

 

3.多表连接查询:先对第一个和第二个表按照两表连接做查询,然后用查询结果和第三个表做连接查询,以此类推,直到所有的表都连接上为止,最终形成一个中间的结果表,然后根据WHERE条件过滤中间表的记录,并根据SELECT指定的列返回查询结果.

 

4.不同类型的连接查询什么时候用

 

查两表关联列相等的数据用内连接。

左表的连接列是右表的子集时用右外连接。

右表的连接列是左表的子集时用左外连接。

左表的连接列和右表的连接列彼此有交集但彼此互不为子集时候用全外。

求差操作的时候用联合查询。

多个表查询的时候,这些不同的连接类型可以写到一块。

ON只进行连接操作,WHERE只过滤中间表的记录

 

转自http://blog.csdn.net/chenjian198819/article/details/6794316

4、散记

(1)使用字段别名

select empno as 员工编号, ename 员工姓名, sal*12 年薪  from emp;

select empno, ename "Ename", sal*12 "Anual Salary" from emp;

select sal*12+5000  as "年度工资(加年终奖)" from emp;

字段别名

重命名查询结果中的字段,以增强可读性

别名如果含有空格或其他特殊字符或大小写敏感,需用双引号引起来。

AS可以省略

(2)字符串

•      指定查询条件使用where子句

•      用法举例

•      select * from emp where deptno=10;

•      select * from emp where ename = 'SMITH';

•      select * from emp where hiredate = '02-4月-81';

•      注意:

•      字符串和日期值要用单引号扩起来                 

•      字符串大小写敏感

日期值格式敏感,缺省的日期格式是'DD-MON-R

 

 

posted on 2019-04-17 11:31  编程无涯乐在其中  阅读(57)  评论(0编辑  收藏  举报