2.DQL数据查询语句

1.简单查询

1.1格式

>>select 字段名 from 表名;

>>select a,b from dept;

>>select * from dept;  (全部查询)

1.2起别名(用as关键字)

select deptno,dname as deptname from dept;

若有空格或中文:select deptno,dname 'dept name' from dept; //加单引号

1.3字段可用数学表达式

select ename,sal*12 from emp;

select ename,sal*12 as '年薪' from emp;

2.条件查询

  1. = 等于;<>或!= 不等于;<= 小于等于
  2. and (用于两个条件)
  3. or (and先运算)
  4. in  (加强版or ,格式:字段 in (值1,值2)
  5. between … and …. 两个值之间
  6. is null 查询空值;is not null 不为空;不能用= null,数据库中null不是一个值)
  7. not (取非,is not;not in)
  8. like (模糊查询,%匹配任意多个字符;_匹配一个字符)

例子:

  1.   
  2. select empno,ename,job,sal from emp where job = 'MANAGER' and sal > 2500;
  3. select * from emp where sal > 2500 and (deptno = 10 or deptno = 20);
  4. select ename,sal from emp where sal in(800, 5000); //这个不是表示800到5000都找出来。select empno,ename,job from emp where job in('MANAGER', 'SALESMAN');
  5.   
  6.   
  7.   
  8. select ename from emp where ename like '%T'   //找出名字以T结尾的                           select ename from emp where ename like '_A%';  //找出第二个字每是A的                              转义字符用反斜杠\     找出名字中有“_”的                                                                mysql> select name from t_student where name like '%\_%';

3.排序

3.1 格式:

    select 
        字段1,字段2,,,
    from
        表
    order by
       字段;

(升序:字段 asc;降序:字段 desc;默认是升序)

(这个字段可以有多个,用逗号连接,前面是主要指标,后面是次要指标

例子:

    select ename,sal from emp order by sal asc, ename asc

特例:

order by 2; (按照第二列排,实际开发不建议使用)

3.2 排序与条件筛选

 找出工资在1250到3000之间的员工信息,要求按照薪资降序排列。
select  ename,sal  from emp  where sal between 1250 and 3000  order by sal desc;

排序写在最后面!

4.数据处理函数

4.1分类

>>select语句的特点

如 select enamel from emp where sal = 300;

select语句本身就具有单行函数的特点,遍历每行数据,并逐个验证where条件,再将其依次打印在屏幕上。

>>单行处理函数:

特点:对每行数据单独操作,单独输出。多次执行(多次进行输入输出)!

输入:某字段(column)的一个

输出:处理后的一个值

>>多行处理函数

>>字段表达式

case表达式

CASE [col_name] WHEN [value1] THEN [result1]…ELSE [default] END
SELECT
CASE job_level    
    WHEN '1' THEN   '1111'    
        WHEN  '2' THEN  '1111'    
        WHEN  '3' THEN  '1111'   
        ELSE 'eee' 
END 
FROM
    employee

CASE WHEN [expr] THEN [result1]…ELSE [default] END
UPDATE employee      
SET e_wage =      
CASE   
    WHEN job_level = '1' THEN e_wage * 1.97      
    WHEN job_level = '2' THEN e_wage * 1.07      
    WHEN job_level = '3' THEN e_wage * 1.06      
    ELSE e_wage * 1.05      
END

当员工的工作岗位是MANAGER的时候,工资上调10%,当工作岗位是SALESMAN的时候,工资上调50%,其它正常。
        (注意:不修改数据库,只是将查询结果显示为工资上调)

select 
            ename,
            job, 
            sal as oldsal,
            (case job when 'MANAGER' then sal*1.1 when 'SALESMAN' then sal*1.5 else sal end) as newsal 
        from 
            emp;

4.2常见单行处理函数

lower

   upper(转换大小写)

select lower(ename) as ename from emp;

substr 取子串   substr( 被截取的字符串, 起始下标,截取的长度))

>>不仅可以写在select后,也可以写在条件关键字where后

    select  ename from emp  where substr(ename,1,1) = 'A';

concat 函数进行字符串的拼接

>>select concat(empno,ename) from emp;

length 取长度

>>select length(ename) enamelength from emp;

trim 去空格

>>select * from emp where ename = trim('   KING');

round 四舍五入

>>默认取整

>>select round(1236.567, 2) as result from emp; //保留2个小数
>>select round(1236.567, -1) as result from emp; // 保留到十位

rand 生成随机数

>>默认生成0-1的

ifnull 空处理函数  (SQL中,NULL只要参与运算,最终结果一定是NULL)

>>ifnull(字段名, 指定值)

>>select ename, (sal + ifnull(comm, 0)) * 12 as yearsal from emp;

4.3常见多行处理函数(分组函数)

 count    计数  (count(字段)求该字段不为空的个数,count(*)求整个表行数)

②  sum    求和

③  avg    平均值

④  max    最大值

⑤  min    最小值

注意:分组函数还是可以用在select语句后面。

分组函数特点

>>自动忽略null

>>分组函数不可以与一般字段操作混用

如select ename,sal from emp where sal > min(sal);会报错

例子:

        mysql> select max(sal) from emp;
        +----------+
        | max(sal) |
        +----------+
        |  5000.00 |
        +----------+

一个有趣的现象:

“abc"这种字符串,或者2000这种在select语句中是会被视为一个已有字段(column)

mysql> select 'abc' as bieming from emp;
        +---------+
        | bieming |
        +---------+
        | abc     |
        | abc     |
        | abc     |
        | abc     |
        | abc     |
        | abc     |
        | abc     |
        | abc     |
        | abc     |
        | abc     |
        | abc     |
        | abc     |
        | abc     |
        | abc     |
        +---------+
		select 21000 as num from dept;
		+-------+
		| num   |
		+-------+
		| 21000 |
		| 21000 |
		| 21000 |
		| 21000 |
		+-------+

而mysql> select abc from emp;

ERROR 1054 (42S22): Unknown column 'abc' in 'field list'

abc这一字段名不存在

5.分组查询(重要)

5.1语句执行顺序

        1. from
        2. where
        3. group by
        4. having
        5. select
        6. order by

    从某张表中查询数据,
    先经过where条件筛选出有价值的数据。
    对这些有价值的数据进行分组。
    分组之后可以使用having继续筛选。
    select查询出来。
    最后排序输出!
"表筛组查排“

5.2例子与特点

例子:找出每个工作岗位的工资和?
            select 
                job,sum(sal)
            from
                emp
            group by
                job;

特点:

>>分组后的select只能接分组字段或者分组函数

select ename,job,sum(sal) from emp group by job;这是没有意义的。

>>可以按多个字段分组

如: select deptno, job, max(sal)  from emp group by deptno, job;

>>可以使用having对分组后的数据进行二次过滤(having只能和group by连用

5.3综合实例

    找出每个岗位的平均薪资,要求显示平均薪资大于1500的,除MANAGER岗位之外,
    要求按照平均薪资降序排。

        select 
            job, avg(sal) as avgsal
        from
            emp
        where
            job <> 'MANAGER'
        group by
            job
        having
            avg(sal) > 1500
        order by
            avgsal desc;

>>  avgsal可以用在排序中,因为执行select时已经分完组了

6.连接查询

>>如a表包含n个员工名与部门编号,b表包含n个部门名与部门编号,想要显示全部员工及所在部门名称。

>>如果不加连接条件,连接两个表会产生n*m条数据。(两集合的笛卡尔积)

>>连接查询时可以给表起别名:(不需要as)

select 
    e.ename, e.sal, s.grade
from
    emp e
join
    salgrade s
on
    e.sal between s.losal and s.hisal;

连接种类:

        内连接:
            等值连接        (连接条件如:e.deptno = d.deptno;)
            非等值连接       (连接条件如:e.sal between s.losal and s.hisal;)
            自连接                (表与自己的连接)

        外连接:(两张表有了主次关系,主表所有数据都显示)
            左外连接(左连接)
            右外连接(右连接)

实例

①自连接:

select 
    a.ename as '员工名', b.ename as '领导名'
from
    emp a
join
    emp b
on
    a.mgr = b.empno; //员工的领导编号 = 领导的员工编号

②左连接

案例:查询每个员工的上级领导,要求显示所有员工的名字和领导名?
    select 
        a.ename as '员工名', b.ename as '领导名'
    from
        emp a
    left join
        emp b
    on
        a.mgr = b.empno; 

结果:    +--------+--------+
    | 员工名      | 领导名     |
    +--------+--------+
    | SMITH  | FORD   |
    | ALLEN  | BLAKE  |
    | WARD   | BLAKE  |
    | JONES  | KING   |
    | MARTIN | BLAKE  |
    | BLAKE  | KING   |
    | CLARK  | KING   |
    | SCOTT  | JONES  |
    | KING   | NULL   |
    | TURNER | BLAKE  |
    | ADAMS  | SCOTT  |
    | JAMES  | BLAKE  |
    | FORD   | JONES  |
    | MILLER | CLARK  |
    +--------+--------+

多表连接

    

 牛客题目:查找所有员工的last_name和first_name以及对应的dept_name_牛客题霸_牛客网 (nowcoder.com)

7.1基本思想:

select语句的输出结果以理解为一张表(from中)或者连续返回的单个值(select中)

7.2分类

    select
        ..(select).
    from
        ..(select).
    where
        ..(select).

7.3where子句中的子查询

>>select ename,sal from emp where sal > (select min(sal) from emp);

7.4from子句中的子查询

>>子查询的查询结果当做一张临时表

>>案例:找出每个岗位的平均工资的薪资等级。

        select 
            t.*, s.grade
        from
            (select job,avg(sal) as avgsal from emp group by job) t
        join
            salgrade s
        on
            t.avgsal between s.losal and s.hisal;  \\t.avg(sal)会报错

注意:①中间表一定要起别名,否则会报错(上例中命名为t)

7.5 select后面出现的子查询

>>子查询结果只能返回一条

>>    实例:select 
        e.ename,e.deptno,(select d.dname from dept d where e.deptno = d.deptno) as dname 
    from 
        emp e;

>>错误:    select 
        e.ename,e.deptno,(select dname from dept) as dname
    from
        emp e;
    

8. 合并查询和限制结果

8.1合并查询

使用union可以合并两个查询结果

>>注意:两个结果的列数要一致;

    select ename,job from emp where job = 'MANAGER'
    union
    select ename,job from emp where job = 'SALESMAN';

8.2限制结果

>>显示查询结果的一部分

写在oeder by后面

注意:

>>下标从0开始,limit 5;取前五条

                            limit 2,5;从第三行开始往后取5行;

>>分页查询公式: 每页N条数据,则第P页应显示:

limit (P-1)* N,N;

猜你喜欢

转载自blog.csdn.net/weixin_44593786/article/details/121125861