zoukankan      html  css  js  c++  java
  • MySQL知识点-1(超详细)

    day01

    1、SQL、DB、DBMS分别是什么,他们之间的关系?

    DBMS(数据库管理系统)负责执行sql语句,通过执行sql语句来操作DB当中的数据

    DBMS-(执行)-SQL-(操作)-DB

    2、什么是表

    表:table是数据库的基本组成单元,所有的数据都以表格的形式组织,目的是可读性强

    一个表包括行和列:

    行:被称为数据/记录(data)

    列:被称为字段(column)

    每一个字段应该包括哪些属性?

    字段名,数据类型,相关的约束

    3、通用的SQL语句,包括增删改查,怎么分类?

    DQL(数据查询):查询语句,凡是select语句都是DQL

    DML(数据操作语言):insert delete updata 对表当中的数据进行增删改查

    DDL(数据定义语言):create drop alter, 对表结构的增删改

    TCL(事务控制语言):commit提交事务,rollback回滚事务

    DCL(数据控制语言):grant授权,revoke撤销权限

    4、导入数据

    第一步:登录mysql-数据库管理系统

    dos命令窗口:

    mysql -uroot -p333

    第二步:查看有哪些数据库

    show database;

    第三步:创建属于我们自己的数据库

    create database bjpowernode;

    第四步:使用bjpowernode数据

    user bjpowernode;

    第五步:查看当前使用的数据库中有那些表

    show tables;

    第六步:初始化数据

    mysql>source D:course5-MySQL

    5、什么是sql脚本

    bjpowernode.sql 这个文件以sql结尾,这样的文件被称为sql脚本,什么是sql脚本

    当一个文件的扩展名是.sql,并且该文件编写了大量sql语句

    SQL脚本的数据量太大的时候,无法打开,请使用source命令完成初始化

    6、删除数据库

    drop database bjpowernode;

    7、查看表结构:

    desc dept;查看部门表

    image.png

    8、表中的数据

    select * from dept;

    9、常用命令

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

    select version();查看mysql版本号

    c 结束一条语句

    exit 退出

    10、查看创建表的语句

    show create table emp;

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

    语法格式:

    select 字段名1,字段名2,字段名3,,,from 表名;

    提示:

    1、任何一条SQL语句以‘;’结尾

    2、SQL不区分大小写

    例子:查询员工的年薪?(字段可以参与数学运算)

    select ename,sal * 12 from emp;

    给查询结果的列重命名

    select ename,sal * 12 as yearsal from emp;

    别名中有中文?
    select ename,sal * 12 as ‘年薪’from emp;

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

    as关键字可以省略

    查询所有字段

    select * from emp;

    12、条件查询

    语法格式:

    select

    字段,字段,,,

    from

    表名

    where

    条件;

    执行顺序,先from 然后where 最后select

    查询工资等于5000的员工姓名?

    select ename from emp where sal=5000;

    查询SMITH的工资?

    select sal from emp where ename = ‘SMITH’;

    找出工资高于3000的员工?

    select ename,sal from emp where sal >3000;

    找出工资在1100和3000之间的员工,包括1100和3300?

    select ename,sal from emp where sal >=1100 and sal <=3000;

    select ename,sal from emp where sal between 1100 and 3000;

    between and 除了 可以使用在数字方面之外,还可以在使用字符串方面

    select ename from emp where ename between ‘A’and ‘C’;#左闭右开

    找出哪些人没有津贴?
    在数据库当中NULL不是一个值,代表什么也没有,为空

    空不是一个值,不能用等号衡量

    必须使用is null 或者is not null

    select ename,sal,comm from emp where comm is null;

    找出工作岗位是MANAGER和SALESMAN的员工?

    select ename,job from emp where job = ‘MANAGER’or job = ‘SALESMAN’;

    and和or联合起来用:找出薪资大于1000的并且部门编号是20或30部门的员工

    select ename,sal,deptno from emp where sal >1000 and (deptno = 20 or deptno =30);

    注意:优先级不确定时,加小括号

    in等于or:找出工作岗位是MANGER和SALESMAN的员工?
     select ename,job,from emp where job = 'SALWSMAN' or 'MANAGER';

    select ename,job,from emp where job in ('SALESMAN','MANAGER');

    in后面的值不是区间,是具体的值

    not in:不在这几个值当中

    select ename,job,from emp where sal not in (800,5000);

     

    模糊查询like

    在模糊查询中,必须掌握两个特殊的符号,一个是%,一个是_

    找出名字当中含有0的?

    %代表任意多个字符,_代表任意1个字符

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

     找出名字中第二个字母是A的

    select ename from emp where ename like '_A%';

    找出名字中有下划线的?

    select ename from emp where ename like '%\_%';

    找出名字中最后一个字母是T的?

    select ename from emp where ename like'%T';

     

    13、排序(升序、降序)

    按照工资升序,找出员工名和薪资?
    select ename,sal from emp order by sal;

    注意:默认是升序,怎么指定升序或者降序呢?asc表示升序,desc表示降序

    select ename,sal from emp order by sal;升序

    select ename,sal from emp order by sal asc; 升序

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

    按照工资的降序排列,当工资相同的时候再按照名字的升序排列

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

    注意:越靠前的字段越能起到主导作用,只有当前的字段无法完成排序的时候,才会启用后面的字段

     

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

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

     

    14、分组函数?

    image.png

    记住:所有的分组函数都是对“某一组”数据进行操作的

    找出工资总和?    

    select sum(sal) from emp;

    分组函数一共5个

    分组函数还有另一个名字:多行处理函数

    多行处理函数的特点:输入多行,最终输出的结果是1行

    分组函数自动忽略NULL

    select count(count)from emp;

    select sum(comm) from emp where comm is not null; //不需要额外添加这个过滤条件,sum函数自动忽略NULL

    找出工资高于平均工资的员工?

    select ename,sal from emp where sal > avg(sal); //[Err] 1111 - Invalid use of group function无效使用分组函数

    原因:SQL语句中有一个语法规则,分组函数不可直接使用在where子句中

    因为group by 是在where 执行之后 才会执行

    第一步:找出平均工资

    第二步:找出高于平均的工资

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

     

    count(*)和count(具体的某个字段),他们有什么区别?

    count(*):不是统计某个字段中数据的个数,二是统计总记录条数(和统计字段无关)

    count(comm):表示统计comm字段中不为NULL的数据总量

     

    分组函数也能组合起来使用:

    select count(*),sum(sal),avg(sal),min(sal),max(sal) from emp;

    15、单行处理函数

    什么是单行处理函数?

    输入一行,输出一行。

    计算每个员工 的年薪?

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

    重点:只要有NULL参与的运算结果一定是NULL

    ifnull()空处理函数?

    ifnull(可能为null的数据,被当做什么处理)

    select ename, ifnull(comm,0) from emp;

     

    16、group by 和having

    group by:按照某个字段或某些字段进行分组

    having:对分组之后的数据进行再次过滤

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

    select max(sal)from emp group by job;

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

     

     

    注意:分组函数一般都会和group by联合使用,这也是为什么成为分组函数的原因

    并且任何一个分组函数(count,sum,avg,max,min)都是在group by语句执行结束后才会执行

    当一条sql语句没有group by的话,整张表的数据会自成一组

     

    select ename,max(sal),job from emp group by job;  //错误

    以上在MySQL当中,查询结果是有的,但是没有意义,在oracle数据库当中会报错,语法错误

    Oracle的语法规则比mysql语法规则更严谨

    记住一个规则:当一条语句中有group by的话,select后面只跟分组函数和参与分组的函数

     

    select 5

    ..

    from 1

    ..

    where 2

    ..

    group by 3

    ..

    having 4

    ..

    order by 6

    ..

    每个工作岗位的平均薪资?

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

    image.png

    多个字段能不能联合一块分组?

    找出每个部门不同工作岗位的最高薪?

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

     

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

    第一步:找出每个部门的最高薪资

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

    第二步:找出薪资大于2900

    select max(sal),deptno from emp group by deptno having max(sal)>2900 //效率低

    使用此方法:

    select max(sal),deptno from emp where sal>2900 group by deptno; //效率高,建议使用where过滤

    image.png

    不能使用where的情况

    找出每个部门的平均薪资,要求显示薪资大于2000的数据;

    第一步:找出每个部门的平均薪资

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

    第二步:要求薪资大于2900

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

     

    select deptno,avg(sal) from emp where avg(sal)>2000 group by deptno;//错误 where后面不能使用分组函数

     

    17、总结一个完整的DQL语句怎么写?

    select 5

    ..

    from 1

    ..

    where 2

    ..

    group by 3

    ..

    having 4

    ..

    order by 6

    ..

     

    day02

    1、关于查询结果集的去重

    select  distinct job from emp;

    select ename,distinct job from emp;

    以上的sql是错误的

    记住:distinct只能出现在所有字段的最前面

    select distinct deptno,job from emp;

    后面字段联合去重

     

    统计岗位的数量?

    select count(distinct job) from emp;

     

    2、连接查询

    2.1、什么是连接查询

    在实际开发中,大部分的情况下都不是从单表中查询数据,一般都是多张表联合查询取出最终的数据。

    在实际开发中,一般一个业务都会对应多张表,比如:学生和班级,起码两张表

    存放在一张表中,数据会出现大量的重复,导致数据冗余

     

    2.2、连接查询的分类?

    根据语法出现的年代来划分,包括:

    SQL92(一些老的DBA可能还在使用这种语法)

    SQL99(比较新的语法)

    根据表的连接方式划分,包括

    内连接:

    等值联结

    非等值联结

    自连接

    外连接:

    左外连接(左连接)

    右外连接(右连接)

    全连接(不讲)

     

    2.3、在表的连接查询方面有一种现象被称为:笛卡尔积现象

    案例:找出每一个员工的部门名称,要求显示员工名和部门名

    select ename,dname from emp,dept;

     

    笛卡尔积现象:当两张表进行查询的时候,没有任何条件进行限制,最终查询的结果条数是两张表记录条数的乘积

     

    关于表的别名:

    select e.ename,d.dname from emp e dept d;

    表的别名有什么好处?

    第一:执行效率高

    第二:可读性好

     

    2.4、怎么避免笛卡尔积现象?当然是加条件进行过滤

    思考:避免笛卡尔积现象,会减少记录的匹配次数吗?

    不会,次数还是56次,只不过显示的是有效记录

     

    案例:找出每一个员工的部门名称,要求显示员工名和部门名

    select e.ename,d.dname from emp e,dept d  where e.deptno = d.deptno; // SQL92语法,以后不用

     

    2.5、内连接之等值连接:最大的特点是:条件是等量关系

    案例:找每个员工的部门名称,要求显示员工名和部门名

    SQL99:

    select e.ename,d.dname from emp e join dept d on  e.deptno = d.deptno;

    语法:

    ....

    A

    join

    B

    on

    连接条件

    where

    ...

    SQL 99语法结构更清晰一些:表的连接条件和后来的where条件分离

     

    //inner可以省略的,带着inner目的是可读性好一些

    select e.ename,d.dname from emp e inner join dept d on e,deptno= d.deptno;

     

    2.6、内连接之非等值连接:最大的特点是 连接条件的关系是非等量关系

    image.png

    image.png

    案例:找出每个员工的工资等级,要求显示员工名,工资,工资等级

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

     

    2.7、自连接:最大的特点是:一张表看做两张表 自己连接自己

    案例:找出每个员工的上级领导,要求显示员工名和对应领导名

    image.png 

    image.png

    员工的领导编号=领导的员工编号

    select a.ename,b.ename from emp a inner  join emp b on a.mgr = b.empno; 

     

    2.8、外连接?

    什么是外连接,和内连接有什么区别

    内连接:假设A和B表进行连接,使用内连接的话,凡是A表和B表能匹配上的记录查询出来,这就是内连接

    AB两张表没有主副之分,两张表是平等的

     

    外连接:

    假设A和B表进行连接,使用内连接的话,AB两张表中一张表是主表,一张是副表

    主要查询主表的数据,捎带着查询副表,当副表中的数据没有和主表中的数据匹配上,副表自动模拟出NULL 与之匹配

     

    外连接的分类?

    左外连接(左连接):表示左边的这张表是主表

    右外连接(右连接):表示的右边的表是主表

     

    左连接有右连接的写法,右连接也会有对应的左连接的写法

     

    案例:找出每个员工的上级领导(所有员工必须全部查询出来)

    内连接:

    select a.ename,b.ename from emp a inner  join emp b on a.mgr = b.empno; //null的不匹配

    左外连接:

    select a.ename '员工',b.ename'领导' from emp a left join emp b on a.mgr = b.empno; //左表为主表

    右外连接

    select a.ename '员工',b.ename'领导' from emp b right join emp a on a.mgr = b.empno;

     

    select a.ename,b.ename from emp a  left outer  join emp b on a.mgr = b.empno;

    outer 可省略

     

    外连接最重要的特点是:主表的数据无条件的全部查出来

     

    案例:找出哪个部门没有员工?
    image.png

    image.png

    select e.*,d.*  from emp e  right join dept d on e.deptno = d.deptno where e.empno is null;

    image.png

     

     

    2.9、三张表怎么连接查询?

    案例:找出每一个员工的部门名称以及工资等级

    image.png

    image.png

    image.png

    注意:

    A

    join

    B

    join

    C

    on

    ..

    表示:A表和B表先进行表连接,连接之后A表继续和C表进行连接

    select e.ename,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;

     

    案例:找出每一个员工的部门名称以及工资等级、以及上级领导

    select

    e.ename '员工',d.dname,s.grade ,e1.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 e1

    on

    e.mgr = e1.empno;

    image.png

     

    3、子查询

    3.1、什么是子查询?都可以出现在哪里

    select 语句当中嵌套select 语句,被嵌套的select 语句是子查询

    子查询可以出现在哪里

    select

    .. (select),

    from

    ..(select)

    where

    ..(select)

     

     

    3.2、where子句中使用子查询

    案例:找出高于平均薪资的员工信息

    第一步:找出平均薪资

    select avg(sal)from emp;

    第二步:where过滤

    select * from emp where sal>2073.214286;

    合并

    select * from emp where sal>(select avg(sal) from emp);

     

    3.3、from后面嵌套子查询

    案例:找出每个部门平均薪水的薪资等级(按照部门编号分组,求sal平均水平

    第一步:找出每个部门平均薪水

    select deptno,avg(sal) as avgsal from emp group by deptno;

    image.png

    第二步:将以上的查询结果当做临时表t,让t表和salgrade表连接,条件是t.avgsal between s.losal and s.hisal

     

    image.png

    案例:找出每个部门平均的薪水等级

    第一步:找出每个员工的薪水等级

    image.png

    image.png

    image.png

    第二步:基于以上结果,继续按照deptno分组,求grade平均值

    image.png

    3.4、在select后面嵌套子查询

    案例:找出每个员工所在的部门名称,要求显示员工名和部门名

    image.png

    4、union(可以将查询结果集相加)

    案例:找出工作岗位是SALESMAN和MANAGER的员工?

    第一种:

    image.png

    第二种:

    image.png

    第三种:

    image.png

    两张不相干的表中的数据拼接在一起显示

    image.png

    不同列报错

    image.png

    5、limit(重点中的重点,以后分页查询全靠它)

     

    5.1、limit是mysql特有的,其他数据库没有,不通用。(Oracle中有一个相同的机制,叫做rownum)

    5.2、limit取结果集中的部分数据,这时它的作用

    5.3、语法机制:

    limit startIndex,length

    startIndex表示起始位置,从0开始,0表示第一条数据

    length表示取几个

    案例:取出工资前5名的员工(思路:降序取前5个)

    image.png

    取前5个:

    image.png

    5.4、limit是SQL语句最后一个执行的一个环节

    select 5

    ...

    from 1

    ...

    where 2

    ...

    group by 3

    ..

    having 4

    ..

    order by 6

    ..

    limit 7

    ..;

    5.5、找出工资排名在第4到第9名的员工?
    image.png

    5.6、通用的标准分页sql

    每页显示3条记录:

    第一页:0,3

    第二页:3,3

    第三页:6,3

    第四页:9,3

    每页显示pagesize条记录

    第pageNO页:?,pageSize

    第pageNO页:(pageNO-1)*pageSize,pageSize

     

    pageSiaze是什么?是每页显示多少条记录

    pageNO是什么?显示第几页

     

    limit(pageNO -1) * pageSize,pageSize

  • 相关阅读:
    常用数列
    sqrt
    树状数组
    hash
    P1102 A-B数对
    codevs 1795 金字塔 2
    P2296 寻找道路
    [USACO16JAN]子共七Subsequences Summing to Sevens
    P3397 地毯
    关于调用&&传址
  • 原文地址:https://www.cnblogs.com/kelly11/p/13275106.html
Copyright © 2011-2022 走看看