MySQL之DQL条件查询

1、 单条件查询

2.1 单条件查询

语法:

SELECT [ DISTINCT ] * | 列名 | 表达式 [别名] [,...]

FROM 表名

[ WHERE 条件表达式 ] ;

说明:

1、条件查询使用WHERE子句来完成,WHERE子句必须紧跟在FROM子句后面。

2、条件表达式的格式为:列名 比较运算符 要比较的值 ,如 deptno = 10 表示部门编号为10号。

3、比较运算符包括 = 、>、>=、 <、 <=、 <>,含义分别是等于、大于、大等于、小于、小等于、不等于。

4、数值型、字符型、日期型数据都可以使用比较运算符进行比较。

5、字符型和日期型数据做为查询条件时,条件表达式右边的值,必须加单引号。

下面通过几个例子,体会不同数据类型的列做为查询条件的写法。

1、数值型列做为查询条件:

例:查询部门编号为20的员工编号、姓名、所在部门编号。

SELECT empno, ename, deptno 
FROM   emp 
WHERE  deptno=20;

查询结果如下:

EMPNO

ENAME

DEPTNO

7369

SMITH

20

7566

JONES

20

7788

SCOTT

20

7876

ADAMS

20

7902

FORD

20

2、字符型列做为查询条件:

例:查询职位为CLERK的员工编号、姓名、职位。

SELECT empno,ename,job 
FROM   emp 
WHERE  job='CLERK';

查询结果如下:

EMPNO

ENAME

JOB

7369

SMITH

CLERK

7876

ADAMS

CLERK

7900

JAMES

CLERK

7934

MILLER

CLERK

3、日期型列做为查询条件:

例:查询入职日期在1985年1月1日之后的员工编号、姓名、入职日期。

SELECT empno,ename,hiredate 
FROM   emp 
WHERE  hiredate > '1985-01-01';

查询结果如下:

EMPNO

ENAME

HIREDATE

7788

SCOTT

1987-04-19

7876

ADAMS

1987-05-23

2.3. 特殊比较运算符

接下来介绍4种常用的特殊比较运算符,分别是BETWEEN...AND...、IN、LIKE、IS NULL。

2.3.1 BETWEEN..AND..运算符

使用BETWEEN .. AND.. 可以查询出某列的值在某个范围内(包括边界值)的数据行。

语法:WHERE 列名 BETWEEN 值1 AND 值2;

例:查询工资在1000到1500之间的员工编号,姓名,工资。

SELECT   empno,ename,sal 
FROM     emp 
WHERE    sal BETWEEN 1000 AND 1500;

通过结果可以看出,工资等于1000和1500的员工也被查出来了,所以BETWEEN..AND..是闭区间查询。

EMPNO

ENAME

SAL

7521

WARD

1000

7654

MARTIN

1250

7844

TURNER

1500

7876

ADAMS

1100

7934

MILLER

1300

2.3.2 IN运算符

使用IN运算符可以查询出某列的值是否和给定集合内的任意一个值相等。

语法:WHERE 列名 IN (值1, 值2, ....值n)

例:使用IN运算符,查询出部门为10号或者20号的员工编号,姓名,部门编号。

SELECT empno, ename, deptno 
FROM   emp 
WHERE  deptno  IN (10 , 20)

通过结果可以看出,部门编号为1020的员工都被查出来了。

EMPNO

ENAME

DEPTNO

7369

SMITH

20

7566

JONES

10

7788

SCOTT

20

7876

ADAMS

10

7902

FORD

20

2.3.4 LIKE运算符

使用LIKE运算符可以查询出某列的值是否满足关键字匹配,也叫模糊查询。如查询员工名字中含有字母S的员工,就可以使用LIKE运算符来解决。

先介绍两个通配符:

% : 百分号,代表匹配零个或任意个字符。

_ : 下划线,代表匹配1个任意字符。

例:查询员工姓名中以S开头的员工。

SELECT   ename 
FROM     emp 
WHERE    ename LIKE 'S%';

结果如下:

ENAME

SMITH

SCOTT

例:查询员工姓名中第二个字母是L的员工。

SELECT   ename 
FROM     emp 
WHERE    ename LIKE '_L%';

结果如下:

ENAME

ALLEN

BLAKE

CLARK

2.3.4.1 区分大小写的比较(扩展)

如果想要在比较的时候区分大小写,可以在字符串前面添加关键字 BINARY

例:查询员工姓名中第二个字母是L的员工(值区分大小写)

select ename
from emp
where binary ename like '%L%';

select ename
from emp
where binary ename like '%l%';
2.3.4 IS NULL 运算符

如果要查询某列的值是否为NULL,使用 “列名 = NULL”是查询不出来的。只能使用 “列名 IS NULL

例:查询上级为空的员工姓名、上级编号。

SELECT  ename, mgr 
FROM    emp 
WHERE   mgr IS NULL;

结果如下:

ENAME

MGR

KING

注意:查询某列不为空,使用 “列名 IS NOT NULL”

2、多条件查询

3.1 逻辑运算符

多条件查询是按照多个条件同时进行查询,查询出的结果集要同时满足多个条件。多个条件之间需要使用逻辑运算符进行连接。

语法:

SELECT [ DISTINCT ] * | 列名 | 表达式 [别名] [,...]

FROM 表名

[ WHERE 条件表达式1 逻辑运算符 条件表达式2 ] ;

说明:

逻辑运算符包含逻辑与 AND,逻辑或 OR,逻辑非 NOT。下表分别介绍3类逻辑运算符的含义。

运算符

含义

AND

逻辑与,用来连接两个条件表达式。如果每个条件表达式的结果都为TRUE,整个表达式的结果才为TRUE。

OR

逻辑或,用来连接两个条件表达式。只要有1个条件表达式的结果为TRUE,整个表达式的结果就为TRUE。

NOT

逻辑非,用来对条件表达式取反。TRUE取反为FALSE,FALSE取反为TRUE。

例:查询工资大于1100职位为‘CLERK’的员工编号、姓名、职位、工资。

分析:本题查询出的员工,需要同时满足两个条件,条件1:工资>1100,条件2:职位='CLERK',因此本题可以用逻辑来解决,SQL语句为:

SELECT empno, ename, job, sal 
FROM   emp 
WHERE  sal>=1100 
AND    job='CLERK';

例:查询工资大于1100职位为‘CLERK’的员工编号、姓名、职位、工资。

分析:本题查询出的员工,只需要满足‘工资>1100’ 或‘职位='CLERK' ’中的一个条件即可,因此本题可以用逻辑来解决,SQL语句为:

SELECT empno, ename, job, sal 
FROM   emp 
WHERE sal>=1100 
OR    job='CLERK';

例:查询职位不为CLERK的员工编号、姓名、职位、工资。

分析:本题查询出的员工,需要满足的条件“职位不是CLERK”。那如何用条件表达式表示职位不是CLERK呢? 我们可以先写出职位是CLERK的条件表达式 job = 'CLERK',然后加上逻辑非就可以,因此SQL语句为:

SELECT empno, ename, job, sal 
FROM   emp 
WHERE   NOT (job='CLERK');

当然,本题直接使用比较运算符解决更简单,如下:

SELECT empno, ename, job, sal 
FROM   emp 
WHERE   job <> 'CLERK';

NOT运算符还可以和BETWEEN…AND、IN、LIKE、IS NULL一起使用,表示的含义分别为:

NOT BETWEEN .. AND .. :不在某个区间

NOT IN (集合):不在某个集合内

NOT LIKE :不像.....

IS NOT NULL: 不是空

例:

1.查询工资不在3000到5000之间的员工姓名

SELECT ename 
FROM emp 
WHERE sal NOT BETWEEN 3000 AND 5000;

2.查询部门该编号不在10号或20号的员工姓名

SELECT ename 
FROM emp 
WHERE deptno NOT IN (10,20);

3.查询姓名不以字母D开头的员工姓名

SELECT ename 
FROM emp 
WHERE ename NOT LIKE 'D%';

4.查询有津贴的员工姓名

SELECT ename 
FROM emp 
WHERE comm IS NOT  NULL;
3.2 运算符的优先级

至此,我们已经学习了算术运算符、比较运算符、特殊比较运算符、逻辑运算符,如果在一个WHERE子句中,这几种运算符同时出现,那么各种预算符的优先级如何呢?

运行如下SQL语句,分析查询结果。

SELECT ename, job, sal 
FROM   emp 
WHERE  job='SALESMAN'  
OR  job='PRESIDENT'  
AND  sal>1500;

ENAME

JOB

SAL

ALLEN

SALESMAN

1600

WARD

SALESMAN

1250

MARTIN

SALESMAN

1250

KING

PRESIDENT

5000

TURNER

SALESMAN

1500

通过如上结果可以看出,该SQL语句,查询出:

职位是SALESMAN工资不限,或者职位是PRESIDENT同时工资大于1500的员工信息。

而我们实际想查询的可能是:

职位是SALESMAN工资高于1500,或者职位是PRESIDENT同时工资大于1500的员工信息

为什么会出现这种查询结果呢? 因为AND的优先级比OR高,上面WHERE子句的3个表达式,会优先完成AND条件表达式判断,然后再和第一个条件表达式做OR判断。

因此,如果想要查询出我们想要的结果,可以通过增加()来改变优先级,修改后的SQL如下:

SELECT ename, job, sal 
FROM   emp 
WHERE ( job='SALESMAN'  
OR  job='PRESIDENT') 
AND  sal>1500;

该语句的查询结果如下。

ENAME

JOB

SAL

KING

PRESIDENT

5000

ALLEN

SALESMAN

1600

各种运算符的优先级如下表。

优先级

运算分类

运算符举例

1

算术运算符

*, \, +, -

2

比较运算符

=, <>, <, >, <=, >=

3

特殊比较运算符

BETWEEN..AND.. ,IN,LIKE,IS NULL

4

逻辑非

NOT

5

逻辑与

AND

6

逻辑或

OR

3、 ORDER BY子句

2.1 语法

SELECT [ DISTINCT ] * | 列名 | 表达式 [别名] [,...]

FROM 表名

[WHERE 条件]

[ORDER BY 列名1 | 列别名1 | 列序号1 [ ASC | DESC ], 列名2 | 列别名2 | 列序号2 [ ASC | DESC ];

说明:

1、ORDER BY子句前面的内容,已经讲过,不再赘述。

2、可以按照3种方式进行排序:分别是按列名排序、按列别名排序、按列序号排序。

3、ASC表示按升序排序(默认值), DESC表示按降序排序。

4、可以同时按照多个列名进行排序

5、ORDER BY 子句必须写在SELECT语句的最后

6、数字升序排列小值在前,大值在后。即按照数字大小顺序由小到大排列。

7、日期升序排列相对较早的日期在前,较晚的日期在后。

8、字符升序排列按照字母由小到大的顺序排列,即由A-Z排列。

9、空值在升序排列中排在最前面,在降序排列中排在最后。

2.2 按列名排序

例:查询所有员工姓名,职位,部门编号,入职日期,并把结果集按入职日期升序排序。

SELECT   ename, job, deptno, hiredate 
FROM     emp 
ORDER BY hiredate;

注意观察下面查询结果。

ENAME

JOB

DEPTNO

HIREDATE

SMITH

CLERK

20

1980-12-17

ALLEN

SALESMAN

30

1981-02-20

...

例:查询所有员工姓名,职位,部门编号,入职日期,并把结果集按入职日期降序排序

SELECT   ename, job, deptno, hiredate 
FROM     emp 
ORDER BY hiredate DESC;

注意观察下面查询结果。

ENAME

JOB

DEPTNO

HIREDATE

ADAMS

CLERK

20

1987-05-23

SCOTT

ANALYST

20

1987-04-19

MILLER

CLERK

10

1982-01-23

...

2.3 按列别名排序

例:查询所有员工编号,姓名,全年工资总和,并把结果集按全年工资总和升序排序,全年工资总和的别名是 annsal。

SELECT   empno, ename, sal*12 annsal 
FROM     emp 
ORDER BY annsal;

注意观察下面查询结果

EMPNO

ENAME

ANNSAL

7369

SMITH

9600

7900

JAMES

11400

7876

ADAMS

13200

7654

MARTIN

15000

7521

WARD

15000

7934

MILLER

15600

7844

TURNER

18000

...

2.3 按列序号排序

ORDER BY子句后的列名也可以写数字,该数字是SELECT语句后列的顺序号

例:

SELECT     ename, deptno, sal 
FROM      emp 
ORDER BY  2 ;

此处的2代表的是deptno列。

ENAME

DEPTNO

SAL

KING

10

5000

CLARK

10

2450

MILLER

10

1300

FORD

20

3000

....

2.4 同时按多列排序

ORDER BY子句后的排序列名也可以同时写多个。

例:

SELECT    ename, deptno, sal 
FROM      emp 
ORDER BY  deptno ASC, sal DESC;

该SQL的作用是查询员工姓名,部门编号,工资,并把查询结果集先按照部门编号升序排序,如果有相同部门编号的数据再按照工资降序排序。

ENAME

DEPTNO

SAL

KING

10

5000

CLARK

10

2450

MILLER

10

1300

FORD

20

3000

...

你可能感兴趣的:(mysql,android,数据库)