单表查询等等

数据库

  1. show databases 查看一共有几个表

  2. creat database 表明:创建一个表

  3. select * form 表名:查询表中的数据

  4. 不看表中的数据,只看表中的结构用:desc 表名;

  5. 查看mysql的版本号 select version();

  6. 查看当前用的哪个数据库:select database;

  7. \c用来终止一个语句的输入

简单查询

  1. 查询一个字段

    • select 字段名 from 表名; 其中select 和from 是关键字

    • sql语句不用区分大小写

  2. 查询两个或者多个字段

    • select 字段名,字段名 from 表名;用,号隔开

  3. 查询所有字段

    • select * from 表名(这种方式效率低,因为要先转换成字段)

    • 或者select 字段名,字段名.... from 表名;用,号隔开

  4. 将dept表中显示出来的dname,改成deptname

    • select dname as deptname from dept;

    • 注意select 永远不会进行修改的,只是将显示出来的dname改成了deptname,所以原列表还是dname;

    • 如果起别名的时候别名有空格,那么要将别名用"" 或''括起来(单引号是标准的)

  5. 查询 emp员工表,员工的年薪

    • select ename,sal * 12 as years from emp; 可以得到,支持使用运算表达式

    • 如果想把years改成年薪,那么要给年薪加上单引号

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

条件查询

  1. 将符合条件的数据查询出来语法格式为:

    • select

      字段1,字段2,字段3...

      from

      表名

      where

      条件;

  2. 数据库中的条件

    大于> 小于< 等于= 不等于!= 和<>

    大于等于>= 小于等于<= 两个值之间 between .. and ..或者>= ..and <=..使用betwee and的时候必须遵守左小右大

    is null 等于空(is not null不等于空)不能用=null 等于='' (后面跟的东西要加单引号) 或者用or 和用and

    注意! and的优先级比 or高

    1. 如果要找一个工资大于2500,并且 办公室为10或者20的人语句应该是:

    1. select empno,ename from emp where sal>2500(class = 10 or class = 20);

    1. in() 相当于多个or ()里面加条件的值,他并不是一个区间

    比如查找工资为2500 和800的人的值

    select empno,ename from emp where sal in(2500,800);

    1. 比如查找工资为2500 和800和2450的人的值

    • select empno,ename from emp where sal in(5000,800,2450);

    1. not in() 不在这些值的数据 比如

    • 查找工资不为2500 和800和2450的人的值

    • select empno,ename from emp where sal not in(2450,500,800.2500);

    注意!between and 是一个区间,而且必须是前面小后面大

    in()不是一个区间

    总结not : 主要用在is或者in

    • is null

    • is not null

    • in

    • not in

    1. 模糊查询

    2. like

      • 支持%或下划线匹配

      • %匹配任意多个字符

      • 下划线:任意一个字符

      • %和下划线都是一个特殊的符号

      • 比如找出一个名字带有o的?

        select empno,ename from emp where ename like '%o%';

      • 找出名字是以o结尾的

        select empno,ename from emp where ename like '%o';

      • 找出名字是o开头的

        select empno,ename from emp where ename like 'o%';

      • 找出第三个字母是r的名字

        select empno,ename from emp where ename like '__r%';(两个下划线)

    3. 如果一个人的名字里面带有_这种东西字查询的时候应该先转义字符,比如要查询一个带有 _ 的名字

      select empno,ename from emp where ename like '%_%';注意加了一个\这就是转义字符

      1. 查询员工所有的薪资,并且按照升序排列(默认的是升序,也可以加asc指定升序)

        select ename,sal from emp order by sal;

      2. 降序排列呢,在末尾价格desc

        select ename,sal from emp order by sal desc;

      3. 查询员工的工资,按照升序排列,如果工资一样按照员工名字首字母的 升序排列

        select ename,sal from emp order by sal asc , ename asc;(中间用,隔开)

      4. 查询工资在1250到3000之间的员工,并且按照工资降序排列

        select ename,sal from emp where sal between 1250 and 3000 order by sal desc;

      数据处理函数

      1. 数据处理函数又被称为单行处理函数特点是:一个输入对应一个输出

      2. 和单行处理函数相对的是:多行处理函数(对行处理函数特点:多个输入对应一个输出)

      3. 常见的单行处理函数有哪些

        • lower():转换成小写

          比如将ename的名字全部转换成小写

          select lower(ename) from emp;(多少个输入就有多少个输出)

        • upper():转换成大写 (其他同上)

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

          截取表中第一个字母为A的人的名字

          • 第一种方式

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

          • 第二种方式

            select ename from emp where ename like 'K';

        • contant(字符串1,字符串2)字符串拼接

        • 获取length 长度

          select length(ename) enamelength from emp;

          +-------------+ | enamelength | +-------------+ | 5 | | 5 | | 4 | | 5 | | 6 | | 5 | | 5 | | 5 | | 4 | | 6 | | 5 | | 5 | | 4 | | 6 | +-------------+

        • trim去掉空格

          比如我在输入的时候给名字加了空格

          select * from emp where ename = ' King';

          这样输出不了 用trim取空格

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

        • round 四舍五入 , select后面要么跟字段,要么跟字面值

        • mysql> select 1000 from emp; +------+ | 1000 | //这个1000只是个名字 +------+ | 1000 | | 1000 | | 1000 | | 1000 | | 1000 | | 1000 | | 1000 | | 1000 | | 1000 | | 1000 | | 1000 | | 1000 | | 1000 | | 1000 | +------+

          为什么会有14个1000呢,因为我们创建的emp表有14个数据

          用round(数,保留位置)0是整数位,1是小数点后一位

          select round(3.1415926, 0);

          +---------------------+ | round(3.1415926, 0) | +---------------------+ | 3 | +---------------------+

          当保留位置是-1的时候四舍五入的就是个数为比如

          select round(333.333,-1); 如果是-2那就是十位

          +-------------------+ | round(333.333,-1) | +-------------------+ | 330 | +-------------------+

        • rand()*一个数: 其中这个数如果输入100 就是生产一个100以内的随机数,同理20的话就生成20以内的随机数

          select round(rand()*5,0) 这个加了round 方法,生产的随机数都会变成整数

        • 在数据库中,只要有null参与的数学运算,最终结果就是null

        • +--------+-----------+ | ename | allmonkey | +--------+-----------+ | SMITH | NULL | | ALLEN | 1900.00 | | WARD | 1750.00 | | JONES | NULL | | MARTIN | 2650.00 | | BLAKE | NULL | | CLARK | NULL | | SCOTT | NULL | | KING | NULL | | TURNER | 1500.00 | | ADAMS | NULL | | JAMES | NULL | | FORD | NULL | | MILLER | NULL | +--------+-----------+

        if null ,当某个数据为null是把ifnull加上去就不会出现上述情况

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

        ename | (sal + ifnull(comm,0))*12 | +--------+---------------------------+ | SMITH | 9600.00 | | ALLEN | 22800.00 | | WARD | 21000.00 | | JONES | 35700.00 | | MARTIN | 31800.00 | | BLAKE | 34200.00 | | CLARK | 29400.00 | | SCOTT | 36000.00 | | KING | 60000.00 | | TURNER | 18000.00 | | ADAMS | 13200.00 | | JAMES | 11400.00 | | FORD | 36000.00 | | MILLER | 15600.00 |

      其中ifnull(为null的值,0)为什么是0呢 意思是这个是null的值,我们把它当成0看待,如果协议那么我们 就把他当成1看待

      case .. when ... then...when ..then..else end

      当员工的职位是manager时工资上涨10%,是salsman时上涨50%

select ename,job,(case job when 'manager' then sal1.1 when 'salesman' then sal1.5 else sal end) as result from emp;

总结 数据处理函数(单行处理函数一共是哪些):

  • rand()*x;生成随机数,x是你输入的数字如果是5就生成5以内的随机数

  • case .. when ... then...when ..then..else end: 如果怎么 就怎么

  • ifnull(为null的值,0)将为null的值看成是0这样结果就不会是null

  • lowr()转换成小写

  • upper()转换成大写

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

  • contant(字符串1,字符串2)字符串拼接

  • trim去掉空格

    比如我在输入的时候给名字加了空格

    select * from emp where ename = ' King';

    这样输出不了 用trim取空格

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

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

    5个:

    count 计数

    sum 求和

    avg 平均数

    max 最大值

    min 最小值

  2. 比如求工资最多的名字

    select max(sal) from emp;

  3. 求工资最少的

    select min(sal) from emp;

  4. 求工资的总和

    select sum(sal) from emp;

  5. 求工资的平均数

    select avg(sal) from emp;

  6. 计算公司有多少人

    select count(ename) from emp;count表示的是该字段下所有不为空的元素的个数

  7. 分组函数自动忽略null

  8. count(*)from emp表示计算这张章一共有多少行

  9. count(comm)from emp;表示这张表comm字段下这一列的不为null的个数总数

  10. 分组函数不能使用在where 后面

    分组查询

    1. 关键字执行的顺序

      select ...

      from...

      where...

      group by...

      order by...

      以上关键字的执行顺序为

      1. from

      2. where

      3. group by

      4. select

      5. order by

    2. 分组函数执行之前必须先分组所以分组函数不能出现在where后面

    3. 但是为什么selec 后面可以出现 sun(sal)这个分组函数呢,因为如果没有分组,那么系统默认整个表为一个组,也就是说已经分组了,只是group by 没有写,所以在执行select的时候其实分组已经完成了,素以可以

    4. 按照职位分组,打印出每个职位的工资总数

      select job,sum(sal) from emp group by job;

      +-----------+----------+ | job | sum(sal) | +-----------+----------+ | ANALYST | 6000.00 | | CLERK | 4150.00 | | MANAGER | 8275.00 | | PRESIDENT | 5000.00 | | SALESMAN | 5600.00 | +-----------+----------+

    结论:在一条select语句当作,如果有group by语句的话,select后面只能跟:参加分组的字段,以及分组函数,其他的一律不能跟

    比如select ename,obj,sum(sal)from emp group by obj 这就是没有意义的 ename 不能出现在这里

  1. 找出每个部门,不同工作岗位的最高工资

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

    注意group by 分了两次组,用,隔开

  2. 找出每个部门工资大于3000的

    这种方式是选选出工资小于3000的在分组

    select deptno,max(sal) from emp where sal>3000 group by deptno;

    也可以先分组在用having筛选sal》3000的

    select deptno,max(sal) from emp group by deptno having max(sal)>3000;

    where和having 优先选择where

  3. 找出每个部门平均工资,并且显示出平均工资高于2500

    select deptno,avg(sal) from emp group by deptno having avg(sal)>2500;

    不能使用where 不然分组函数出现在了where后面会报错

    select deptno,avg(sal) from emp where avr(sal)>2500 group by deptno ;

    大总结

    单表查询关键字有:

    select ...

    from ...

    where...

    group by ...

    having ...

    order by ....

    以上关键字的执行顺序是

    from

    where

    group by

    having

    select

    order by

    作业:

    找出每个岗位的平均工资,要求显示平均工资不高于1500的岗位,除了manager之外

    select job,avg(sal) from emp where job != 'manager' group by job having avg(sal)>1500

    也可以采用job not like 'manager'

    select job,avg(sal) from emp where job not like 'manager' group by job having avg(sal)>1500

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值