MySQL学习——单表查询语句(DQL)

先来了解下mysq中几个常用命令

        退出mysql:exit;

        查看mysql中有哪些数据库?
   show databases; 
      注意:以分号结尾,分号是英文的分号。

   mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | test               |
    +--------------------+
    mysql默认自带了4个数据库。

使用某个数据库

mysql> use test;
        Database changed
        表示正在使用一个名字叫做test的数据库。

创建数据库

mysql> create database bjpowernode;
        Query OK, 1 row affected (0.00 sec)

查看某个数据库下有哪些表?
        mysql> show tables;

查看mysql数据库的版本号:
    mysql> select version();
 

查看当前使用的是哪个数据库?
    mysql> select database();

    mysql> show
    ->
    -> \c
    mysql>
    \c用来终止一条命令的输入。

bjpowernode.sql 这个文件中是提前准备的数据库表。
    怎么将sql文件中的数据导入呢?
        mysql> source D:\course\03-MySQL\document\bjpowernode.sql(这是我的路径,改成你自己文件所在位置)

        注意:路径中不要有中文!!!!

下面可以获取文件

链接:https://pan.baidu.com/s/182xf5PuvEbfMXnBal1w2IQ 
提取码:java

这边需要注意你要使用哪个数据库中的表,你需要先使用这个数据库也就是use +数据库名

不然会报错!!!!!

关于导入的这几张表?
    mysql> show tables;
    +-----------------------+
    | Tables_in_bjpowernode |
    +-----------------------+
    | dept                  |
    | emp                   |
    | salgrade              |
    +-----------------------+

    dept是部门表
    emp是员工表
    salgrade 是工资等级表
 


    怎么查看表中的数据呢?
        select * from 表名; //统一执行这个SQL语句。

不看表中的数据,只看表的结构,有一个命令:
    desc 表名;

简单查询

查询一个字段?
        select 字段名 from 表名;
        其中要注意:
            select和from都是关键字。
            字段名和表名都是标识符。
        
        强调:
            对于SQL语句来说,是通用的,
            所有的SQL语句以“;”结尾。
            另外SQL语句不区分大小写,都行。
        
        查询部门名字?
            mysql> select dname from dept;
            +------------+
            | dname      |
            +------------+
            | ACCOUNTING |
            | RESEARCH   |
            | SALES      |
            | OPERATIONS |
            +------------+
            4 rows in set (0.00 sec)

查询两个字段,或者多个字段怎么办?
        使用逗号隔开“,”
        查询部门编号和部门名?
            select deptno,dname from dept;
            +--------+------------+
            | deptno | dname      |
            +--------+------------+
            |     10 | ACCOUNTING |
            |     20 | RESEARCH   |
            |     30 | SALES      |
            |     40 | OPERATIONS |
            +--------+------------+
    

查询所有字段怎么办?

        第一种方式:可以把每个字段都写上
            select a,b,c,d,e,f... from tablename;

        第二种方式:可以使用*
            select * from dept;

这种方式的缺点:
                1、效率低
                2、可读性差。

给查询的列起别名?
        mysql> select deptno,dname as deptname from dept;

as关键字可以省略

假设起别名的时候,别名里面有空格,怎么办?

select deptno,dname 'dept name' from dept; //加单引号
select deptno,dname "dept name" from dept; //加双引号

(如果需要起中文名也需要用单引号扩起来)

条件查询

什么是条件查询?
    不是将表中所有数据都查出来。是查询出来符合条件的。
    语法格式:
        select
            字段1,字段2,字段3....
        from 
            表名
        where
            条件;

都有哪些条件?

    = 等于
    查询薪资等于800的员工姓名和编号?
        select empno,ename from emp where sal = 800;
    查询SMITH的编号和薪资?
        select empno,sal from emp where ename = 'SMITH'; //字符串使用单引号

    <>或!= 不等于
    查询薪资不等于800的员工姓名和编号?
        select empno,ename from emp where sal != 800;
        select empno,ename from emp where sal <> 800; // 小于号和大于号组成的不等号

    < 小于
    查询薪资小于2000的员工姓名和编号?
        mysql> select empno,ename,sal from emp where sal < 2000;

<= 小于等于
    查询薪资小于等于3000的员工姓名和编号?
        select empno,ename,sal from emp where sal <= 3000;


    > 大于
    查询薪资大于3000的员工姓名和编号?
        select empno,ename,sal from emp where sal > 3000;

    >= 大于等于
    查询薪资大于等于3000的员工姓名和编号?
        select empno,ename,sal from emp where sal >= 3000;

    between … and …. 两个值之间, 等同于 >= and <=

注意:
                使用between and的时候,必须遵循左小右大。
                between and是闭区间,包括两端的值。

查询哪些员工的津贴/补助不为null?
        select empno,ename,sal,comm from emp where comm is not null; 

(这边不能用comm <> null这种表达方法)

注意:在数据库当中null不能使用等号进行衡量。需要使用is null
        因为数据库中的null代表什么也没有,它不是一个值,所以不能使用
        等号衡量。

 and 并且
    查询工作岗位是MANAGER并且工资大于2500的员工信息?
        select 
            empno,ename,job,sal 
        from 
            emp 
        where 
            job = 'MANAGER' and sal > 2500;

or 或者
    查询工作岗位是MANAGER和SALESMAN的员工?
        select empno,ename,job from emp where job = 'MANAGER';
        select empno,ename,job from emp where job = 'SALESMAN';
 

and和or同时出现的话,有优先级问题吗?
    查询工资大于2500,并且部门编号为10或20部门的员工?
        select 
            *
        from
            emp
        where
            sal > 2500 and deptno = 10 or deptno = 20;
        分析以上语句的问题?
            and优先级比or高。
            以上语句会先执行and,然后执行or。(如果要避免这种情况可以用小括号解决优先级问题)

in 包含,相当于多个 or (not in 不在这个范围中)
        查询工作岗位是MANAGER和SALESMAN的员工?
            select empno,ename,job from emp where job = 'MANAGER' or job = 'SALESMAN';
            select empno,ename,job from emp where job in('MANAGER', 'SALESMAN');

注意:in不是一个区间。in后面跟的是具体的值

like 
        称为模糊查询,支持%或下划线匹配
        %匹配任意多个字符
        下划线:任意一个字符。
        (%是一个特殊的符号,_ 也是一个特殊符号)

        找出名字中含有O的?
        mysql> select ename from emp where ename like '%O%';

找出名字以T结尾的?
            select ename from emp where ename like '%T';
            
        找出名字以K开始的?
            select ename from emp where ename like 'K%';

        找出第二个字每是A的?
            select ename from emp where ename like '_A%';
        
        找出第三个字母是R的?
            select ename from emp where ename like '__R%';

找出名字中有“_”的?
            select name from t_student where name like '%_%'; //这样不行。

            mysql> select name from t_student where name like '%\_%'; // \转义字符。(需要转移字符)

排序

 查询所有员工薪资,排序?
    select 
        ename,sal
    from
        emp
    order by
        sal; // 默认是升序!!!

怎么降序?

    指定降序:
    select 
        ename,sal
    from
        emp
    order by
        sal desc;

以两个字段排序吗?或者说按照多个字段排序?
    查询员工名字和薪资,要求按照薪资升序,如果薪资一样的话,
    再按照名字升序排列。
    select 
        ename,sal
    from
        emp
    order by
        sal asc, ename asc; // sal在前,起主导,只有sal相等的时候,才会考虑启用ename排序。

关键字顺序不能变:
        select
            ...
        from
            ...
        where
            ...
        order by
            ...
        
        以上语句的执行顺序必须掌握:
            第一步:from
            第二步:where
            第三步:select
            第四步:order by(排序总是在最后执行!)

数据处理函数

数据处理函数又被称为单行处理函数

    单行处理函数的特点:一个输入对应一个输出。

    和单行处理函数相对的是:多行处理函数。(多行处理函数特点:多个输入,对应1个输出!)
 

单行处理函数

    lower 转换小写
        mysql> select lower(ename) as ename from emp;

14个输入,最后还是14个输出。这是单行处理函数的特点。

upper 转换大写
        mysql> select * from t_student;
        +----------+
        | name     |
        +----------+
        | zhangsan |
        | lisi     |
        | wangwu   |
        | jack_son |
        +----------+

        mysql> select upper(name) as name from t_student;
        +----------+
        | name     |
        +----------+
        | ZHANGSAN |
        | LISI     |
        | WANGWU   |
        | JACK_SON |
        +----------+

substr 取子串(substr( 被截取的字符串, 起始下标,截取的长度))
        select substr(ename, 1, 1) as ename from emp;
        注意:起始下标从1开始,没有0.

concat函数进行字符串的拼接
        select concat(empno,ename) from emp;

length 取长度
        select length(ename) enamelength from emp;

trim 去空格(ltrim去左空格 rtrim去右空格)
        mysql> select * from emp where ename = '  KING';

case..when..then..when..then..else..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;

round 四舍五入

select round(1236.567, 0) as result from emp; //保留整数位。

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

rand() 生成随机数
        mysql> select round(rand()*100,0) from emp; // 100以内的随机数

ifnull 可以将 null 转换成一个具体值
        ifnull是空处理函数。专门处理空的。
        在所有数据库当中,只要有NULL参与的数学运算,最终结果就是NULL。

注意:NULL只要参与运算,最终结果一定是NULL。为了避免这个现象,需要使用ifnull函数。
            ifnull函数用法:ifnull(数据, 被当做哪个值)
                如果“数据”为NULL的时候,把这个数据结构当做哪个值。

补助为NULL的时候,将补助当做0
                select ename, (sal + ifnull(comm, 0)) * 12 as yearsal from emp;

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


    多行处理函数的特点:输入多行,最终输出一行。

    5个:
        count    计数
        sum    求和
        avg    平均值
        max    最大值
        min    最小值
    
    注意:
        分组函数在使用的时候必须先进行分组,然后才能用。
        如果你没有对数据进行分组,整张表默认为一组。
    
    找出最高工资?
        mysql> select max(sal) from emp;

    计算工资和:
        mysql> select sum(sal) from emp;

    计算平均工资:
        mysql> select avg(sal) from emp;
        +-------------+
        | avg(sal)    |
        +-------------+
        | 2073.214286 |
        +-------------+
        14个工资全部加起来,然后除以14。

分组函数在使用的时候需要注意哪些?

        第一点:分组函数自动忽略NULL,你不需要提前对NULL进行处理。

       第二点:分组函数中count(*)和count(具体字段)有什么区别?
            mysql> select count(*) from emp;
            +----------+
            | count(*) |
            +----------+
            |       14 |
            +----------+

            mysql> select count(comm) from emp;
            +-------------+
            | count(comm) |
            +-------------+
            |           4 |
            +-------------+

            count(具体字段):表示统计该字段下所有不为NULL的元素的总数。
            count(*):统计表当中的总行数。(只要有一行数据count则++)
                        因为每一行记录不可能都为NULL,一行数据中有一列不为NULL,则这行数据就是有效的。

      第三点:分组函数不能够直接使用在where子句中。

      第四点:所有的分组函数可以组合起来一起用。

select sum(sal),min(sal),max(sal),avg(sal),count(*) from emp;
            +----------+----------+----------+-------------+----------+
            | sum(sal) | min(sal) | max(sal) | avg(sal)    | count(*) |
            +----------+----------+----------+-------------+----------+
            | 29025.00 |   800.00 |  5000.00 | 2073.214286 |       14 |
            +----------+----------+----------+-------------+----------+

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值