当前位置: 代码迷 >> 综合 >> MySQL-SQL2
  详细解决方案

MySQL-SQL2

热度:73   发布时间:2023-11-21 18:42:24.0
  1. in后面的跟着具体的值,不是区间!!
    注意:in的用法和普通的不加in的用法一样,只不过可读性强(个人认为)
    例如:select ename, sal from emp where sal in (1000, 5000);
    上述语句指的不是查找出来工资在1000到5000之间的,而是工资为1000和工资为5000的!!
    若要查找区间的:
    SELECT ENAME, SAL FROM EMP WHERE SAL >= 1000 AND SAL <= 5000;

     					+--------+-----------+---------+| ENAME  | JOB       | SAL     |+--------+-----------+---------+| ALLEN  | SALESMAN  | 1600.00 || WARD   | SALESMAN  | 1250.00 || JONES  | MANAGER   | 2975.00 || MARTIN | SALESMAN  | 1250.00 || BLAKE  | MANAGER   | 2850.00 || CLARK  | MANAGER   | 2450.00 || SCOTT  | ANALYST   | 3000.00 || KING   | PRESIDENT | 5000.00 || TURNER | SALESMAN  | 1500.00 || ADAMS  | CLERK     | 1100.00 || FORD   | ANALYST   | 3000.00 || MILLER | CLERK     | 1300.00 |+--------+-----------+---------+
    

2.NOT和is或者in相互搭配,取非。

3.模糊查询like:select ename from emp where ename like ‘_A%’;

3.1):找出名字中含有A的员工:select ename from emp where ename like '%A%';+--------+| ename  |+--------+| ALLEN  || WARD   || MARTIN || BLAKE  || CLARK  || ADAMS  || JAMES  |+--------+3.2):找出名字中第二个字母为A的员工:select ename from emp where ename like '_A%';+--------+| ename  |+--------+| WARD   || MARTIN || JAMES  |+--------+3.3):找出名字中有'_'的员工:select ename from emp where ename like '%\_%';3.4):找出名字中最后一个字母是'T'的:select ename from emp where ename like '%T';重点:_代表的任意一个字符,%代表的任意多个字符。
  1. 排序(升序、降序):
    按照工资排序找出员工名和薪资:
    语法:order by :
    select ename, sal from emp order by sal;
    数据:
    +--------+---------+ | ename | sal | +--------+---------+ | SMITH | 800.00 | | JAMES | 950.00 | | ADAMS | 1100.00 | | WARD | 1250.00 | | MARTIN | 1250.00 | | MILLER | 1300.00 | | TURNER | 1500.00 | | ALLEN | 1600.00 | | CLARK | 2450.00 | | BLAKE | 2850.00 | | JONES | 2975.00 | | SCOTT | 3000.00 | | FORD | 3000.00 | | KING | 5000.00 | +--------+---------+ 14 rows in set (0.00 sec)
    注意:默认按照升序排序。如何指定排序规则?asc表示升序,desc表示降序。
    select ename, sal from emp order by sal; //升序
    select ename, sal from emp order by sal asc; //升序

     	降序排序:select ename, sal from emp order by sal desc; //降序+--------+---------+| ename  | sal     |+--------+---------+| KING   | 5000.00 || SCOTT  | 3000.00 || FORD   | 3000.00 || JONES  | 2975.00 || BLAKE  | 2850.00 || CLARK  | 2450.00 || ALLEN  | 1600.00 || TURNER | 1500.00 || MILLER | 1300.00 || WARD   | 1250.00 || MARTIN | 1250.00 || ADAMS  | 1100.00 || JAMES  |  950.00 || SMITH  |  800.00 |+--------+---------+14 rows in set (0.00 sec)
    

    案例:按照工资的降序排列,当工资相同时按照名字的升序排列。
    select ename, sal from emp order by sal desc, ename asc;
    字段越靠前,起的主导作用就越大,只有当前面的字段排序后出现相等的情况才会执行后面的字段排序
    否则后面的字段排序不会执行。

    EXAMPLE:找出工作岗位是SALESMAN的员工,并且要求按照薪资的降序排列:
    select
    ename, sal, job 3
    from
    emp 1
    where
    job = ‘salesman’ 2
    order by
    sal desc; 4

     	order by 是最后执行的。
    

5、分组函数(多行处理函数):
count 计数
sum 求和
ave 平均值
max 最大值
min 最小值

重点:所有的分组函数都是对“某一组”数据进行操作的。找出工资总和?select sum(sal) from emp;
找出最高工资?select max(sal) from emp;
找出最低工资?select min(sal) from emp;
找出平均工资?select ave(sal) from emp;
找出总人数?select count(*) from emp;select count(ename) from emp;重点:分组函数自动忽略NULL:
select count(comm) from emp;
输出:
+-------------+
| count(comm) |
+-------------+
|           4 |
+-------------+全表:
+---------+
| comm    |
+---------+
|    NULL |
|  300.00 |
|  500.00 |
|    NULL |
| 1400.00 |
|    NULL |
|    NULL |
|    NULL |
|    NULL |
|    0.00 |
|    NULL |
|    NULL |
|    NULL |
|    NULL |
+---------+ 
共十四条数据,但是自动忽略NULL重点1. sum函数会自动忽略null!select sum(comm) from emp;+-----------+| sum(comm) |+-----------+|   2200.00 |+-----------+1 row in set (0.00 sec)  运算结果不是null,但是数据里有null,所以不需要在后面加上过滤条件where。重点2. 找出高于平均工资的员工:错误实例:select sal, ename from emp where sal > ave(sal);注意:SQL语句中有一个语法规则:分组函数不能直接使用在where子句当中。因为分组函数必须在分组之后才能执行,如果没有group by语句,默认有一个group by语句将整张表自成一组。where语句必须在group by语句执行结束之后才会执行,如果在where语句中套用分组函数,那么此时没有分组,所以一定不会执行这个,报错!正确方式:一:分组查询:select ave(sal) from emp;+-------------+| avg(sal)    |+-------------+| 2073.214286 |+-------------+select sal, ename from sal > 2073.214286二:select ename, sal from sal > (select ave(sal) from emp); (子查询);count(*)和count(某个具体的字段)有什么区别?count(*):不是统计某个字段中数据的个数,而是统计总记录条数。(和某个字段无关)count(comm):表示统计comm字段不为NULL的数据总数量。

6、单行处理函数:
什么是单行处理函数?
输入一行,输出一行!

计算员工的年薪?select ename, (sal + comm) * 12 as yearsal from emp; ---------->数据结果不合理!!重点:所有的数据库都是这样规定的:只要有NULL参与了数学运算,其运算结果一定是NULL!处理方法:空值处理函数: ifnull(可能为null的数据,被当作什么处理) : 属于单行处理函数!
上述问题的处理方法: select ename, (sal + ifnull(comm, 0)) * 12 from emp; //值为null的数被当做0处理。数据处理正确!

7、group by和having

group by:按照某个字段或某些字段进行分组。
having:having对分组之后的数据进行再次过滤。1.查找每个工作岗位的最大薪资:
select max(sal) from emp group by job;
select max(sal), job from emp group by job;+----------+-----------+
| max(sal) | job       |
+----------+-----------+
|  1300.00 | CLERK     |
|  1600.00 | SALESMAN  |
|  2975.00 | MANAGER   |
|  3000.00 | ANALYST   |
|  5000.00 | PRESIDENT |
+----------+-----------+注意:分组函数一般都会和group by联合使用,并且分组函数一定会在group by执行完成后在执行,当一个sql语句中没有group by
时,整张表的数据自成一组。重点:当一个sql语句中有group by的话,select后面只能跟分组函数和参与分组的字段。2. 找出每个部门不同工作岗位的最高薪资:selectdeptno, job, max(sal)fromempgroup by job, deptno;3.找出每个部门的最高薪资,要求显示薪资大于2900的数据:第一步:找出每个部门的最高薪资:select max(sal), deptno from emp group by deptno;第二部:找出薪资大于2900的:select max(sal), deptno from emp group by deptno having max(sal) > 2900;注解:考虑到效率问题,这种方式效率较低,有些数据在刚开始就该被过滤掉,这样就减少了数据量,增加了数据但是以上方式有很多无效数据参与了处理过程。高效处理:select max(sal), deptno where sal > 2900 from emp group by deptno;4.找出每个部门的平均薪资,要求显示薪资大于2900的数据:第一步:找出每个部门的平均薪资:select avg(sal), deptno from emp group by deptno;第二步:显示薪资大于2900的数据select avg(sal), deptno from emp group by deptno having avg(sal) > 2900;

8.总结一个DQL语句怎么写

select 				5..
from				1..
where				2..
group by			3..
having				4..
order by			6..
  相关解决方案