MySql数据库的学习——day02数据查询语句DQL

本文介绍了SQL查询的基础,包括简单的查询、条件查询、数据排序、分组函数和分组查询。通过实例演示了如何使用DQL语句进行数据筛选、排序、分组等操作,如模糊查询、条件运算符、聚合函数等。同时强调了WHERE和HAVING子句的使用区别,以及在实际应用中的效率考虑。
摘要由CSDN通过智能技术生成

目录

1、简单的查询语句(DQL)

2、条件查询。

3、数据排序

4、分组函数/聚合函数/多行处理函数

5、分组查询 group by

6、总结(DQL语法)


1、简单的查询语句(DQL)

语法格式
        select 字段名1,字段名2,字段名3,.... from 表名;

note:

  1.         任何一条sql语句以“;”结尾。
  2.         sql语句不区分大小写。

    
   1) 查询员工的年薪?(字段可以参与数学运算。)
        select ename,sal * 12 from emp;

   2)如何给查询结果的列重命名
        select ename,sal * 12 as yearsal from emp;
        select ename,sal * 12 yearsal from emp;  (as也可以省略)

   

   3)  别名中出现中文?
        select ename,sal * 12 as 年薪 from emp; // 报错
        select ename,sal * 12 as '年薪' from emp;

        
    注意:标准sql语句中要求字符串使用单引号''括起来。虽然mysql支持双引号,尽量别用。


2、条件查询。

   语法格式:
        select 
            字段,字段...
        from
            表名
        where
            条件;

    执行顺序:from>where>select

条件查询需要用到where语句,where必须放到from语句表的后面

支持如下运算符:

练习:


#1.查询工资等于5000的员工姓名?
mysql> select ename from emp where sal = 5000 ;
+-------+
| ename |
+-------+
| KING  |
+-------+
#2.查询SMITH的工资?
mysql> select ename,sal from emp where ename = 'SMITH';
+-------+--------+
| ename | sal    |
+-------+--------+
| SMITH | 800.00 |
+-------+--------+
#3.找出工资高于3000的员工?
mysql> select ename,sal from emp where sal > 3000;
+-------+---------+
| ename | sal     |
+-------+---------+
| KING  | 5000.00 |
+-------+---------+
	
#4.找出工资不等于3000的?
select ename,sal from emp where sal <> 3000;
select ename,sal from emp where sal != 3000;

#5.找出工资在1100和3000之间的员工,包括1100和3000?
select ename,sal from emp where sal >= 1100 and sal <= 3000;
select ename,sal from emp where sal between 1100 and 3000; #between...and...是闭区间 

#between and除了可以使用在数字方面之外,还可以使用在字符串方面。(用在字符串上是左闭右开)
mysql> select ename from emp where ename between 'A' and 'C';
+-------+
| ename |
+-------+
| ALLEN |
| BLAKE |
| ADAMS |
+-------+

#6.NUll代表空,不是一个值,必须用is null 或者is not null
#找出哪些人津贴为NULL?
select ename,sal,comm from emp where comm is null;
#找出哪些人没有津贴?
select ename,sal,comm from emp where comm is null or comm = 0;
+--------+---------+------+
| ename  | sal     | comm |
+--------+---------+------+
| SMITH  |  800.00 | NULL |
| JONES  | 2975.00 | NULL |
| BLAKE  | 2850.00 | NULL |
| CLARK  | 2450.00 | NULL |
| SCOTT  | 3000.00 | NULL |
| KING   | 5000.00 | NULL |
| TURNER | 1500.00 | 0.00 |
| ADAMS  | 1100.00 | NULL |
| JAMES  |  950.00 | NULL |
| FORD   | 3000.00 | NULL |
| MILLER | 1300.00 | NULL |
+--------+---------+------+

#7.找出工作岗位是MANAGER和SALESMAN的员工?
select ename,job from emp where job = 'MANAGER' or job = 'SALESMAN';
select ename,job from emp where job in ('MANAGER' ,'SALESMAN');#in后面的值不是区间,是具体的值。

+--------+----------+
| ename  | job      |
+--------+----------+
| ALLEN  | SALESMAN |
| WARD   | SALESMAN |
| JONES  | MANAGER  |
| MARTIN | SALESMAN |
| BLAKE  | MANAGER  |
| CLARK  | MANAGER  |
| TURNER | SALESMAN |
+--------+----------+

#8.模糊查询like
#找出名字当中含有O的?
select ename from emp where ename like '%O%';
+-------+
| ename |
+-------+
| JONES |
| SCOTT |
| FORD  |
+-------+
###在模糊查询当中,必须掌握两个特殊的符号,一个是%,一个是_                                
  (%代表任意多个字符,_代表任意1个字符。)

3、数据排序

排序采用order by子句,order by后面跟排序的字段,多个字段采用逗号间隔,order by默认采用升序(asc),如果存在where子句那么order by必须放到where语句的后面。

语法结构:

select 
        字段                        3
    from
        表名                        1
    where
        条件                        2
    order by
        ....                           4
    
    order by是最后执行的。

实例:1.按照工资的降序排列,当工资相同的时候再按照名字的升序排列。

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

Note:

  1. order by 默认是升序,asc表示升序,desc表示降序。
  2. 越靠前的字段越能起到主导作用。只有当前面的字段无法完成排序的时候,才会启用后面的字段

2.找出工作岗位是SALESMAN的员工,并且要求按照薪资的降序排列。

mysql> select ename ,job ,sal from emp where job = 'SALESMAN' order by sal desc;
+--------+----------+---------+
| ename  | job      | sal     |
+--------+----------+---------+
| ALLEN  | SALESMAN | 1600.00 |
| TURNER | SALESMAN | 1500.00 |
| WARD   | SALESMAN | 1250.00 |
| MARTIN | SALESMAN | 1250.00 |
+--------+----------+---------+

4、分组函数/聚合函数/多行处理函数

  •     count 计数
  •     sum 求和
  •     avg 平均值
  •     max 最大值
  •     min 最小值

练习:1.找出工资高于平均工资的员工?

mysql> select ename,sal from emp where sal > avg(sal);
ERROR 1111 (HY000): Invalid use of group function

报错的原因:分组函数是在group by 之后执行的,而where优先于group by执行。所以在执行where语句时avg(sal)还没有开始计算,是无效的。

正确写法:select ename,sal from emp where sal > (select avg(sal) from emp);     #小括号()里的先执行,相当于先求出平均薪资,再把sal跟计算好的平均薪资比较

      2.count(*)和count(具体的某个字段)的区别?

mysql> select count(*) from emp ;
+----------+
| count(*) |
+----------+
|       14 |
+----------+
1 row in set (0.01 sec)

mysql> select count(comm) from emp ;
+-------------+
| count(comm) |
+-------------+
|           4 |
+-------------+
  • count(*):统计总记录条数。(和某个字段无关)
  • count(comm): 表示统计comm字段中不为NULL的数据总数量。

    3.分组函数也能组合使用:

分组函数的特点:

  1. 所有的分组函数都是对“某一组”数据进行操作的;
  2. 输入多行,最终输出的结果却是1行。
  3. 分组函数自动忽略NULL。
  4. 分组函数不能直接出现在where子句中

单行处理函数:输入一行,输出结果也是一行

典型的单行处理函数:ifnull() 空处理函数

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

select ename,(sal+comm)*12 as yearsal from emp;    //错误,有null参与的运算结果只能是null

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

# infull(comm,0) 将comm字段中出现null的地方,用0代替

5、分组查询 group by

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

案例1:找出每个工作岗位的最高薪资。

mysql> 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 |
+----------+-----------+

语法特点

  1. 分组函数一般都会和group by联合使用,分组函数必须在group by语句执行结束之后才会执行(当一条sql语句没有group by的话,那整张表的数据会自成一组)。
  2. 当一条语句中有group by的话,select后面只能跟分组函数参与分组的字段

案例2:找出每个部门的最高薪资,要求显示薪资大于2900的数据。

mysql> select max(sal),deptno from emp group by deptno having max(sal) > 2900;
+----------+--------+
| max(sal) | deptno |
+----------+--------+
|  3000.00 |     20 |
|  5000.00 |     10 |
+----------+--------+
2 rows in set (0.00 sec)

mysql> select max(sal),deptno from emp where sal > 2900 group by deptno;
+----------+--------+
| max(sal) | deptno |
+----------+--------+
|  3000.00 |     20 |
|  5000.00 |     10 |
+----------+--------+

以上两种方法都可以实现,但是where的效率会比having高很多,所以能够使用where过滤的尽量使用where

6、总结(DQL语法)

一个完整的DQL语句的写法以及执行顺序:

select  字段                        5

from   表名                         1

where   条件                       2

group by  分组的字段         3

having  过滤条件                 4

order by .........                     6

原则:能在where中过滤的数据,尽量在where中过滤,效率较高。having的过滤是专门对分组之后的数据进行过滤的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值