sql——day02

一、去重(distinct)
去除重复记录
注意:原表中不会被修改,知识查询结果去重
语法: select  distinct  job  from  emp;
统计工作岗位的数量
语法: select count(distinct job) from emp;  可以允许这么写
二、连接查询
1.查询员工在哪个部门
语法: select e.ename,d.dname from emp as e, dept as d where e.deptno = d.deptno; //表起别名很重要,效率问题。
sql99语法:select e.ename,d.dname from emp e join dept d on e.deptno = d.deptno;//表起别名很重要,效率问题。
2、sql99语法: 
           select 查询列表
           from 表1别名(连接类型)
           join 表2别名    
           on 连接条件
         【where筛选条件】
         【group by 分组】
         【having筛选条件】
         【oder by 筛选列表】
    分类:
           内连接:inner
           外连接:左外left【outer】、右外right【outer】、全外full【outer】
           交叉连接:cross
3、外连接
查询每个员工的上级领导,要求显示所有员工的名字和领导名?
语法:select 
           a.ename as 'yuan', b.ename as 'lingdao'
            from
           emp a
          left join 
           emp b 
           on
           a.mgr = b.empno;
4、三张表、四张表怎么连接?
语法: select .....
            from 
                   a
             join
                  b
              on
                 a和b的连条件
              join
                  c
              on
                  a和c的连接条件
              join
                  d
              on
                 a和d的连接条件
案例1:找出每个员工的部门名称以及工资等级,要求显示员工名、部门名、薪资、薪资等级?
 select
    -> e.ename,e.sal,d.dname,s.grade
    -> from
    -> emp e
    -> join
    -> dept d
    -> on
    -> e.deptno = d.deptno
    -> join
    -> salgrade s
    -> on
    -> e.sal between s.losal and s.hisal;
案例2:找出每个员工的部门名称以及工资等级,还有上级领导,要求显示员工名、领导名、部门名、薪资、薪资等级?
语法:
 select e.ename,e.sal,d.dname,s.grade,l.ename
    -> from
    -> emp e
    -> join
    -> dept d
    -> on
    -> e.deptno = d.deptno
    -> join salgrade s
    -> on
    -> e.sal between s.losal and s.hisal
    -> left join
    -> emp l
    -> on
    -> e.mgr = l.empno;
三、子查询
1.子查询是select语句中嵌套select语句,被嵌套的select语句称为子查询;
案例:找出比最低工资的名字跟工资
第一步先查询出最低工资:
select min(sal) from emp;
第二步:找出大于最低工资的:
 select ename,sal from emp where sal > 800;
第三部:合并:
select ename,sal from emp where sal > (select min(sal) from emp);
2.from字句中的字查询
案例:找出每个岗位的平均工资的薪资等级。
代码: 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;
3.select后面出现的子查询
案例:找出每个员工的部门名称,要求显示员工名,部门名?
语法: select
    -> e.ename,e.deptno,
    -> (select d.dname from dept d where e.deptno = d.deptno)
    -> as dname
    -> from
    -> emp e;
注意事项:对呀select后面的子查询来说,这个子查询只能一次返回1条结果,多余1条,就报错。!
四、union合并查询结果集
案例:查询工作岗位是MANAGER和SALESMAN的员工?
语法: select ename,job from emp where job = 'MANAGER'
    -> union
    -> select ename,job from emp where job = 'SALESMAN';

union的效率要高一些。对呀表连接来说,每连接一次新表,则匹配的次数满足笛卡尔积,成倍的翻。。。
但是union可以减少匹配的次数。在减少匹配次数的情况下,还可以完成两个结果集的拼接。
注意:union在进行结果集合并的时候,要求两个结果集的列数相同。
五、limit的使用(重点)
1.完整用法:limit startIndex,length ;//startIdex是起始下标(从零开始),length是长度。
案例:按照薪资降序,取出排名在前5名的员工?
语法:select ename,sal from emp order by sal desc limit 5;
2.注意事项:mysql当中limit在order by之后执行!!!!!
案例:取出工资排名找【3~5】名的员工?
     select 
         ename,sal
   from
        emp
   order by
         sal desc
   limit
        2,3;
         2表示起始位置从下标2开始,就是第三条记录。
         3表示长度。
3.分页
分页公式: limit (pageNo - 1) * pageSize, pageSize;
六、关于DQL语句的大总结:
     select
               ......
      from
             ........
        where
              .....
         group by
                  ......
          having
                 ......
           order by
                  .....
            limit
                 .....
    执行顺序:
              1.from
              2.where
              3.group by
              4.having
              5.select
              6.order by
              7.limit..
七、表的创建(建表)
1.建表的语法格式:(建表属于DDL语句,DDL包括:create drop alter) 
create table 表名(
       字段名1  数据类型;
       字段名2  数据类型;
       字段名3  数据类型; 
);
表名:建议以t_或者tal_开始,可读性强。
2.关于mysql中的数据类型
(1)varchar(255)
可变长度的字符串
     比较智能,节省空间。
    会根据实际的数据长度动态分配空间。

    优点:节省空间
    缺点:需要动态分配空间,速度慢。
(2)char(255)
  定长字符串
    不管实际的数据长度是多少。
     分配固定长度的空间去存储数据。
     使用不恰当的时候,可能会导致空间的浪费。

     优点:不需要动态分配空间,速度快。
     缺点:使用不当可能会导致空间的浪费。
(3)int(11)
   数字中的整数型
(4)bigint
  数字中的长整型
(5)float
  单精度浮点型数据
(6)double
 双精度浮点型数据
(7)dete
  短日期类型
(8)datetime
  长日期类型
(9)clob
    字符大对象
    最多可以存储4G的字符串
    比如:存储一篇文章,存储一个说明。
    超过255个字符的都要采用clob字符大对象存储。
(10)blob
      二进制大对象
       专门用来存储图片、声音、视频等流媒体数据。列如插入一个图片、视频等
        你需要使用IO流才行。
3.创建一个学生表?
    create table t_student(
     no int,
     name varchar(32),
     sex char(1),
     age int(3),
     email   varchar(255)
);
删除表:
      (1) drop  table  表名;//当这张表不存在的时候会报错!
      (2)drop table  if exists   表名;// 如果这张表存在的话就 删除。

4.插入数据insert(DML)
  语法格式:insert into 表名(字段名1,字段名2,字段名3....)  values(值1,值2,值3....);
   注意事项:字段名和值要一一对应。
语法:insert into t_student(no,name,sex,age,email) values(1,'zhangsan','nan',20,'zhangsan@123.com');
5.insert插入日期
   str_to_date函数可以将字符串转换成日期类型date?
  语法:str_to_date('字符串日期','日期格式');
mysql的日期格式:
                                %y    年
                                %m   月
                                %d    日
                                %h    时 
                                %i     分
                                %s     秒
6.date和datetime的区别
    date是短日期
    datetime是长日期
    mysql短日期默认格式:%y-%m-%d
    mysql长日期默认格式:%y-%m-%d  %h:%i:%s

(1)now()函数;//可以获取系统当前的时间;

7.修改update(DML)
语法格式:
          update 表名 set 字段名1 = 值1,字段名2 = 值2,字段名3 = 值3 ....... where  条件;
          注意:没有条件限制会导致所有数据全部更新。
语法:update t_user set name = 'javke',birth = '1984-06-09', create_time = now() where id =1;

8.删除数据 delete(DML)
语法格式:
           delete  from 表名 where 条件;
注意:没有条件,整张表的数据会全部删除!
delete from t_user where id = 2;
insert into t_user(id) values(2);
delete from 表名;//删除所有!

insert  delete   update  select
 增         删           改           查

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值