1.简单的查询语句(DQL)
   语法格式:select 字段名1,字段名2… from 表名;
   注意:
      (1)任何一条sql语句以“;”结尾。
      (2)sql语句不区分大小写。
      (3)字段可以参与数据运算。如:select ename,sal*12 as ‘年薪’ from emp;
      (4)标准sql语句中要求字符串使用单引号括起来,虽然mysql支持双引号,但尽量别用。
      (5)取别名时,as关键字可以省略。如:select ename,sal*12 ‘年薪’ from emp;
      (6)select * from emp; //实际开发中不建议使用*,效率较低。
2.条件查询
   语法格式:select 字段名1,字段名2… from 表名 where 条件;

支持如下运算符:

sql server 查询根据条件过滤_mysql


注意:

   (1)between…and…是闭区间,且在使用的时候必须左小右大。

   (2)between…and…还可以用在字符串方面,此时它属于左闭右开区间。如:select ename from emp where ename between ‘A’ and ‘D’;

   (3)在数据库中,NULL不是一个值,代表什么也没有,为空,其不等于0,不能用等号衡量,必须使用is null或者is not null。

   (4)and的优先级大于or,当运算符的优先级不确定的时候加小括号。

   (5)in等同于or,in后面的值不是区间,是具体的值。如:select ename,job from emp where job=‘SALESMAN’ or job=‘MANAGER’;等同于select ename,job from emp where job in(‘SALESMAN’,‘MANAGER’);

3.模糊查询like

   在模糊查询中,必须掌握两个特殊的符号,一个是‘%’,一个是‘_’。

   ‘%’代表任意多个字符,‘_’代表1个字符。

如:

(1)找出名字中第三个字母是A的?
    select ename from emp where ename like ‘__A%’;
 (2)找出名字中带下划线的?
    select ename from emp where ename like ‘%\_%’;     //使用了转义字符

4.排序(升序、降序)

   asc表示升序,desc表示降序。order by默认升序。

(1)按照工资升序,找出员工名和薪资?
    select ename,sal from emp order by sal;    //order by默认升序
 (2)按照工资降序,找出员工名和薪资?
    select ename,sal from emp order by sal desc;
 (3)按照工资降序排列,当工资相同时再按照名字的升序排列?
    select ename,sal from emp order by sal desc,ename asc;    //越靠前的字段越能起到主导作用,只有当前面的字段无法完成排序的时候(相等的时候),才会启用后面的字段。
 (4)找出工作岗位是SALESMAN的员工,并且要求按照薪资的降序排列?
    select ename,job,sal from emp where job=‘SALESMAN’ order by sal desc;    //先from,后where,再select,最后order

5.分组函数(多行处理函数)

分组函数一共只有五个:

sql server 查询根据条件过滤_字段_02


记住:(1)所有的分组函数都是对“某一组”数据进行操作的。如:

找出工资总和?

   select sum(sal) from emp;

找出工资总和总人数?

   select count() from emp;
   select count(ename) from emp;
(2)分组函数自动忽略NULL。如:count不将值为NULL的计算在内,count(
)和count(某个字段)得到的结果可能不一样。

(3)多行处理函数:输入多行,输出一行;单行处理函数:输入一行,输出一行。

(4)sql语句中有一语法规则,分组函数不可直接使用在where子句当中。如:select ename,sal from emp where sal>avg(sal);这是错误的。改正:select ename,sal from emp where sal>(select avg(sal) from emp);

6.单行处理函数

ifnull()函数:可能为NULL的数据,被当做什么处理。

如:计算每个员工的年薪?

select ename,(sal+comm)*12 as yearsal from emp; //这是不当的,因为comm可能为NULL,所有数据库都是这样规定的:只要有NULL参与的运算结果一定是NULL。
 改正:select ename,(sal+ifnull(comm,0))*12 as yearsal from emp;

7.分组查询group by、having

      group by:按照某个字段或者某些字段进行分组。having:对分组之后的数据进行再次过滤。

(1)分组函数一般都会和group by联合使用,这也是为什么被称为分组函数的原因,并且任何一个分组函数都是在group by语句执行结束之后才会执行的,这也是为什么分组函数不能用在where中使用的原因(没有group by的sql语句中实际上存在一个缺省的group by语句)。当一条sql语句没有group by的话,整张表的数据会自成一组。如:找出每个工作岗位的最高薪资?

select max(sal) from emp group by job;

sql server 查询根据条件过滤_分组函数_03


上图表示SQL语句中各子句的执行顺序。

(2)select ename,max(sal),job from emp group by job;这条sql语句在MySQL当中查询结果是有的,但是结果没有意义,ename结果是乱的,在Oracle数据库中会报错;Oracle的语法规则比MySQL语法规则严谨。记住:当一条语句中有group by的时候,select后面只能跟分组函数和参与分组的字段

(3) 多个字段可以联合起来一起分组。如:select max(sal),deptno,job from emp group by deptno,job;

(4)having的使用,having不能单独使用,必须跟着group by一起使用。建议:能够使用where过滤的尽量使用where,where的效率比较高。select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;这是不得不用having过滤的例子。

8.关于查询结果集的去重

(1)select distinct job from emp;
 (2)select ename,distinct job from emp;   //错误,distinct只能出现在所有字段的最前面
 (3)select distinct deptno,job from emp;   //deptno与job联合起来去重
 (4)统计岗位的数量?
 select count(distinct job) from emp;