主页 > 创业  > 

MySQL数据库

目录

1:数据库概述及数据准备

1.1:什么是数据库?什么是数据库管理系统?什么是SQL?他们之间的关系是什么?

1.2:在Windows操作系统中,怎么使用命令来启动和关闭MySQL服务呢?

1.3:mysql常用命令

1.4:数据库中最基本的元素是表:table

1.5:SQL的分类

1.6:导入演示数据

1.7:表结构描述

2:常用命令

2.1:查看mysql数据库的版本号

2.2:查看当前使用的是哪个数据库?

3:简单的查询

3.1:如何查询一个字段?

3.2:如何查询俩个或多个字段?

3.3:如何给查询的列起别名?

3.4:计算员工的年薪

4:条件查询

4.1:条件查询:不是将表中所有数据都查出来,是查询出来符合条件的

4.2:= 等于

5:排序数据

5.1:查询所有员工薪资,排序?

5.2:指定降序

5.3:指定升序

5.4:可以两个字段排序吗?或者可以多个字段排序吗?

5.5:根据字段的位置也可以排序

5.6:找出工资在1250到3000之间的员工信息,要求按照薪资降序排列

6:数据处理函数

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

6.2:单行处理函数常见的有哪些?

7:分组函数

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

8:分组查询【重点】

8.1:什么是分组查询?

8.2:如何进行分组查询?

8.3:将之前的关键字全部组合在一起,来看一下他们的执行顺序?

8.4:使用having可以对分完组之后的数据进一步过滤;having不能单独使用,having不能代替where,having必须和group by联合使用

8.5:总结

8.6:把查询结果去除重复记录

9:连接查询【重点】

9.1:什么是连接查询?

9.2:连接查询的分类?

9.3:当两张表进行连接查询时,没有任何条件的限制会发生什么现象?

9.4:怎么避免笛卡尔积现象?

9.5:内连接之等值连接

9.6:内连接之非等值连接

9.7:内连接之自连接

9.8:外连接(右外连接又叫右连接)

9.9:外连接(左外连接又叫左连接)

9.10:三张表、四张表怎么连接?

10:子查询

10.1:什么是子查询?

10.2:子查询都可以出现在哪里呢?

10.3:where子句中出现的子查询?

10.4:from子句的子查询

10.5:select后面的出现的子查询(了解)

11:union(合并查询结果集)

11.1:union效率高

12:limit的使用【重点】

12.2:limit怎么用呢?

12.3:注意:MySQL当中limit在order by之后执行

12.4:按照薪资降序,取出排名在三到五名的员工?

12.5:分页

12.6:DQL大总结

13:表的创建(建表)

13.1:建表的语法格式(建表属于DDL语句,DDL包括create,drop,alter)

13.2:关于MySQL中的数据类型

13.3:创建一个学生表?

13.4:删除表

13.5:插入数据(insert)DML

13.6:指定默认值

13.7:insert插入日期

13.8:date和datetime两个类型的区别?

13.9:在MySQL中怎么获取系统当前时间?

13.10:修改update(DML)

13.11:删除数据delete(DML)

13.12:insert语句可以一次插入多条记录

13.13:快速创建表(表的复制)

13.14:将查询结果插入到一张表当中?(insert)

13.15:快速删除表中的数据

13.16:约束(constraint)【重点】

14:存储引擎

14.1:什么是存储引擎?有什么用呢?

14.2:怎么给表添加/指定“存储引擎”呢?

14.3:怎么查看mysql支持哪些存储引擎呢?

14.4:查看mysql版本?

14.5:关于mysql常用的存储引擎?

15:事务【重点】

15.1:什么是事务?

15.2:事务是如何做到多条DML语句同时成功同时失败的呢?

15.3:怎么提交事务?怎么回滚事务?

15.4:事物的四个特性

15.5:事务的隔离性

16:索引

16.1:什么是索引?

16.2:实现原理

16.3:添加索引的条件

16.4:索引的删除和创建

16.5:在mysql当中,怎么查看一个SQL语句是否使用了索引进行检索?

16.6:索引的失效

16.7:索引是各种数据库进行优化的重要手段,优化的时候考虑的因素就是索引

17:视图(view)

17.1:什么是视图?

17.2:创建和删除

17.3:用途

17.4:视图对象在实际开发中到底有什么作用?

18:DBA命令

18.1:DAB常用命令

19:数据库设计的三范式

19.1:什么是数据库设计范式?

19.2:总结表的设计


1:数据库概述及数据准备 1.1:什么是数据库?什么是数据库管理系统?什么是SQL?他们之间的关系是什么?

        ①数据库(DataBase 简称DB):按照指定格式存储数据的一些集合

                顾名思义:存储数据的仓库,实际上就是一堆文件。这些文件中存储了具有特定格式的数据

        ②数据库管理系统(DataBaseManagementSystem 简称DBMS):专门用来管理数据库中的数据,数据库管理系统可以对数据库中的数据进行增删改查

                常见的数据库管理系统

                          MySQL、Oracle、MS Sqlserver、DB2、Sybase等

        ③SQL:结构化查询语言

                SQL一般发音为sequel

                全称:Structured Query Language

                程序员需要学习SQL语句,通过编写SQL语句,然后DBMS负责执行SQL语句,最终来完成数据库中数据的增删改查操作

                SQL是一套标准,程序员主要学习的就是SQL语句,这个SQL在MySQL中可以使用,在DB2中也可以使用

        ④三者之间的关系

                 DBMS--执行-->SQL--操作-->DB

                先安装数据库管理系统MySQL,然后学习SQL怎么写,编写SQL语句后,DBMS对SQL语句进行执行,最终来完成数据库的数据管理

1.2:在Windows操作系统中,怎么使用命令来启动和关闭MySQL服务呢?

        语法:

              net stop 服务名称:关闭

              net start 服务名称:启动

        其它服务的启停都可以采用以上的命令

1.3:mysql常用命令

            ①退出MySQL:exit

            ②查看MySQL中有哪些数据库?

                    show databases;(注意以分号结尾,分号是英文的分号)

mysql> show databases; +--------------------+ | Database ᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠ| +--------------------+ | information_schema | | mysql ᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠ| | performance_schema | | sakila ᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠ| | sys ᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠ| | world ᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠ| +--------------------+

        ③怎么选择使用某个数据库呢?

                 mysql> use sys;

                表示正在使用一个名叫sys的数据库

        ④怎么创建数据库?

                mysql> create database bjpowernode;

                mysql> show databases;

+--------------------+ | Database ᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠ| +--------------------+ | bjpowernode ᅠᅠᅠᅠᅠᅠᅠ| | information_schema | | mysql ᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠ| | performance_schema | | sakila ᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠ| | sys ᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠ| | world ᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠ| +--------------------+

      ⑤怎么查看数据库下有哪些表?

                 mysql> show tables;

1.4:数据库中最基本的元素是表:table

         什么是表table?为什么用表来存储数据呢?

姓名性别年龄列(字段)张三男20行(记录)李四女21行(记录)王五男22行(记录)

        数据库当中是以表格的形式表示数据的(因为表格比较直观)

        任何一张表都有行和列:

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

            列(column):被称为字段(每一个字段都有:字段名、数据类型、约束等属性)

1.5:SQL的分类

        DQL:

                数据查询语言(凡是带有select关键字的都是查询语句)

                select...

        DML:

                数据操作语言(凡是对表中的数据进行增删改的都是DML)

                insert  增

                delete 删

                update 改

                这个主要是操作表中的数据data

        DDL:

                数据定义语言

                凡是带有create、drop、alter的都是DDL。

                DDL主要操作的是表的结构,不是表中的数据。

                create:新建,等同于增

                drop:删除

                alter:修改

                这个增删改和DML不同,这个主要是对表结构进行操作

        TCL:

                事务控制语言

                包括:

                        事务提交:commit;

                        事务回滚:rollback;

        DCL:

                数据控制语言

                例如:授权grant、撤销授权revoke...

1.6:导入演示数据

        怎么查看表中的数据?

            select * from 表名;  //“*”代表所有

1.7:表结构描述

        不看表中的数据,只看表的结构,命令为什么?

                desc tabl_name;

2:常用命令 2.1:查看mysql数据库的版本号

          mysql> select version();

+-----------+ | version() | +-----------+ | 8.0.19   | +-----------+ 2.2:查看当前使用的是哪个数据库?

     mysql> select database();

+------------+ | database() | +------------+ | NULL     | +------------+ mysql> show     -> databases     -> ; +--------------------+ | Database           | +--------------------+ | bjpowernode        | | information_schema | | mysql              | | performance_schema | | sakila             | | sys                | | world              | +--------------------+ 注:不见分号不执行;分号表示结束!      mysql> show     ->     ->     ->     ->     ->     -> \c mysql> \c用来终止一条命令的输入 3:简单的查询 3.1:如何查询一个字段?

     select 字段名 from 表名;

             注意:select和from都是关键字;

                        字段名和表名都是标识符;

             强调:

                        对于sql语句来说,是通用的

                        所有的sql语句以“;”结尾

                        sql语句不区分大小写

3.2:如何查询俩个或多个字段?

        俩个字段:

                  使用逗号“,”隔开

                  select 字段名, 字段名 from 表名;

        多个字段:

                  第一种方式:可以把每个字段都写上

                  第二种方式:可以使用“*”号

                          这种方式的缺点:效率低

                                                      可读性差,在实际开发中不建议

3.3:如何给查询的列起别名?

        mysql> select  dname as deptname from dept;

                使用as关键字起别名

                        注:只是将显示的查询结果列名显示为deptname,原列表还是叫dname

                        记住:select语句是永远都不会进行修改操作的(只负责查询)

                as关键字可以省略

   mysql> select , dname adeptname  from dept;

                起别名时,别名里面有空格,将其用单引号或双引号括起来就OK了

               在所有的数据库中,字符串统一使用单引号括起来是标准,双引号在oracle数据库中用不了,但在mysql中可以使用

3.4:计算员工的年薪

        mysql> select ename,sal*12 from emp;   //结论:字段可以使用数学表达式  

        mysql> select ename,sal*12 as yearsal from emp;   //起别名(别名若为中文,用单引号括起来)

4:条件查询 4.1:条件查询:不是将表中所有数据都查出来,是查询出来符合条件  语法格式:        select            字段1,字段2...        from          表名        where          条件; 4.2:= 等于

*查询薪资等于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;

  +-------+--------+---------+

  | empno | ename  | sal     |

  +-------+--------+---------+

  |  7369 | SMITH  |  800.00 |

  |  7499 | ALLEN  | 1600.00 |

  |  7521 | WARD   | 1250.00 |

  +-------+--------+---------+

<= 小于等于

*查询薪资小于等于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 <=

*查询薪资在2450和3000之间的员工信息?包括2450和3000

  第一种方式:>= and <=

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

    +-------+-------+---------+

    | empno | ename | sal     |

    +-------+-------+---------+

    |  7566 | JONES | 2975.00 |

    |  7698 | BLAKE | 2850.00 |

    |  7782 | CLARK | 2450.00 |

    |  7788 | SCOTT | 3000.00 |

    |  7902 | FORD  | 3000.00 |

    +-------+-------+---------+

  第二种方式:between … and …

    select

      empno,ename,sal

    from

      emp

    where

      sal between 2450 and 3000;

    注意:

      使用between and的时候,必须遵循左小右大。

      between and是闭区间,包括两端的值。

is null 为空(is not null 不为空)

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

and 并且

or   或者

*and和or同时出现的话,有优先级问题吗?

and和or同时出现,and优先级较高。如果想让or先执行,需要加“小括号”,以后在开发中,如果不确定优先级,就加小括号就行了。

in 包含:相当于多个 or (not in 表示不在这几个值当中的数据)

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

not 可以取非,主要用在 is 或 in 中

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

*找出名字以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%';

*找出名字中有下划线的

   ‘%\_%’  // ”\”表示转义字符

5:排序数据 5.1:查询所有员工薪资,排序?

   select

      ename,sal

   from

      emp

   order by

      sal;   //默认升序

5.2:指定降序

     select

      ename,sal

   from

      emp

   order by

      sal desc;  

5.3:指定升序

      select

      ename,sal

   from

      emp

   order by

      sal asc;

5.4:可以两个字段排序吗?或者可以多个字段排序吗?

查询员工名字和薪资,要求按照薪资升序,若薪资一样,再按名字升序排列

      select

        ename,sal

      from

        emp

      order by

    Sal asc,ename asc;  //sal在前,起主导;只有sal相等时,才会考虑启用ename排序

5.5:根据字段的位置也可以排序

 select

      ename,sal

   from

      emp

   order by

   2;     //2表示第二列,第二列是sal,按照查询结果的第二列排序

5.6:找出工资在1250到3000之间的员工信息,要求按照薪资降序排列

        select

          ename,sal

        from

          Emp

        where

          sal between 1250 and 3000

        order by

          sal desc;  (排序总是在最后执行)

6:数据处理函数 6.1:数据处理函数又被称为单行处理函数

特点:一个输入对应一个输出

多行处理函数(特点:多个输入对应一个输出)

6.2:单行处理函数常见的有哪些?

lower 转换小写

mysql> select lower(ename) as ename from emp;

upper 转换大写

mysql> select upper(name) as name from t_student;

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

mysql> select substr(ename, 1, 1) as ename from emp;

  注意:起始下标从1开始,没有0

concat函数进行字符串的拼接

mysql> select concat(empno,ename) from emp;

length 取长度

mysql> select length(ename) enamelength from emp;

trim 去空格

mysql> select * from emp where ename = trim('   KING');

str_to_date 将字符串转换成日期

date_format 格式化日期

format 设置千分位

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 四舍五入

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

mysql> select round(1234.567, 1) as result from emp; //保留1个小数

mysql> select round(1234.567, 2) as result from emp; //保留2个小数

mysql> select round(1234.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的时候,把这个数据结构当做哪个值。

7:分组函数 7.1:分组函数(多行处理函数)

   特点:输入多行,最终输出一行

   分类:

      count 计数

      sum 求和

      avg 平均值

      max 最大值

      min 最小值

注意:

1分组函数在使用的时候必须先进行分组,然后才能用

      2如果没有对数据进行分组,整张表默认为一组

      3分组函数自动忽略null,不需要提前对null进行处理

      4分组函数中count(*)和count(具体字段)

count(具体字段):表示统计该字段下所有不为NULL的元素的总数。

count(*):统计表当中的总行数。(只要有一行数据,count则++)

       因为每一行记录不可能都为NULL,一行数据中有一列不为NULL,则这行数据就是有效的

      5分组函数不能够直接使用在where子句中(因为分组函数在使用的时候必须先分组之后才能使用;where在执行的时候还没有分组,所以where后面不能出现分组函数)

     6所有的分组函数可以组合起来一起用

*找出最高(低)工资?

mysql> select max(sal) from emp;

mysql> select min(sal) from emp;

*计算工资和?

mysql> select sum(sal) from emp;

*计算平均工资?

mysql> select avg(sal) from emp;

*计算员工数量?

mysql> select count(sal) from emp;

8:分组查询【重点】 8.1:什么是分组查询?

在实际的应用中,可能有这样的需求,需要先进行分组,然后对每一组的数据进行操作,这时就需要分组查询

8.2:如何进行分组查询?

select

   ...

from

   ...

group by

   ...

8.3:将之前的关键字全部组合在一起,来看一下他们的执行顺序?

Select

  ...

From

  ...

Where

  ...

Group by

  ...

Order by

  ...

以上的关键字顺序不能颠倒

执行顺序:

1from

2where

3group by

4select

5order by

*找出每个工作岗位的工资和?

实现思路:按照工作岗位分组,然后对工资求和

Select

  Job,sum(sal)

From

  Emp

Group by

  Job;

以上这个语句的执行顺序?

先从emp表中查询数据

根据job字段进行分组

然后对每一组数据进行sum(sal)

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

8.4:使用having可以对分完组之后的数据进一步过滤;having不能单独使用,having不能代替where,having必须和group by联合使用

*找出每个部门的最高薪资,要求显示最高薪资大于3000的?

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

按照部门编号,求每一组最大值

Select

  Deptno,max(sal)  

From

  Emp

Group by

  Deptno

 第二步:要求显示最高薪资大于3000

       Select

  Deptno,max(sal)  

From

  Emp

Group by

  Deptno

Having

  Max(sal)>3000;

以上的sql语句执行效率较低

可以先将大于3000的都找出来,然后再分组

   Select

     Deptno,max(sal)  

From

     Emp

   Where

     Sal>3000

Group by

     Deptno;

//where和having,优先选择where,where实在完成不了的,再选择having

8.5:总结

Select

  ...

From

  ...

Where

  ...

Group by

  ...

Having

  ...

Order by

  ...

以上关键字只能按这个顺序来,不能颠倒

   执行顺序:

  1from

  2where

  3group by

  4having

  5select

  6order by

从某张表中查询数据

先经过where条件筛选出有价值的数据

对这些有价值的数据进行分组

分组之后可以使用having继续筛选

select查询出来

最后排序输出

*找出每个岗位的平均薪资,要求显示平均薪资大于1500的,除MANAGER岗位之外,要求按照平均薪资降序排列

Select

  Job,avg(sal) as avgsal

From

  Emp

Where

  Job<>’MANAGER’

Group by

  job

Having

  Avg(sal)>1500

Order by

  Avgsal desc;

8.6:把查询结果去除重复记录

注意:原表中的数据不会被修改,只是查询结果去重

     去重需要使用一个关键字:distinct

mysql>select distinct job from emp;

*distinct只能出现在所有字段的前方

mysql>select distinct job, deptnp from emp;

9:连接查询【重点】 9.1:什么是连接查询?

从一张表中单独查询,称为单表查询

两张或多张表联合起来查询数据,这种跨表查询,被称为连接查询

9.2:连接查询的分类?

根据语法的年代分类:

SQL92:1992年的时候出现的语法

SQL99:1999年的时候出现的语法

根据表连接的方式分类:

内连接

   等值连接

   非等值连接

   自连接

外连接

   左外连接(左连接)

   右外连接(右连接)

全连接

9.3:当两张表进行连接查询时,没有任何条件的限制会发生什么现象?

  例子:查询每个员工所在部门名称

mysql>select * from emp;

mysql>select ename,deptno from emp;

*当两张表进行连接查询时,没有任何条件限制的时候,最终查询结果条数是两张表条数的乘积,这种现象被称为:笛卡尔积现象

9.4:怎么避免笛卡尔积现象?

连接时加条件,满足这个条件的记录被筛选出来

Select

 e.ename,d.dname

From

 emp e,dept d

Where

 e.deptno = d.deptno;  //SQL92语法

9.5:内连接之等值连接

例子:查询每个员工所在部门名称,显示员工名和部门名?

SQL92语法:

Select

 e.ename,d.dname

From

 emp e,dept d

Where

 e.deptno = d.deptno;

  SQL92的缺点:结构不清晰,表的连接条件和后期进一步筛选的条件,都放到了where后面

  SQL99的优点:表的连接条件是独立的,连接之后,如果还需要进一步筛选,再往后继续添加where...

SQL99语法:

Select

  e.ename,d.dname

From

  emp e

(inner可要可不要,带着可读性更好)Join

dept d

On

      e.deptno = d.deptno;  //条件是等量关系

9.6:内连接之非等值连接

例子:找出每个员工的薪资等级,要求显示员工名、薪资、薪资等级?

  MySQL>select * from emp;  e

  MySQL>select * from salgrade;  s

Select

ename,e.sal,s.grade

From

  Emp e

Join

  Salgrade s

On

  E.sal Between s.losal and s.hisal;  

//条件不是一个等量关系,称为非等值连接

9.7:内连接之自连接

例子:查询员工的上级领导,要求显示员工名和对应的领导名?

  Mysql>select empno ,ename,mgr from emp;

  技巧:一张表看成两张表

Emp a 员工名

Emp b 领导名

Select

ename as ‘员工名’,b.ename as ‘领导名’

From

  Emp a

Join

  Emp b

On

A.mgr = b.empno;  //员工的领导编号 = 领导的员工编号

以上就是内连接中的自连接,技巧:一张表看做两张表

9.8:外连接(右外连接又叫右连接)

Select

  e.ename,d.dname

From

  emp e right join dept d   //right表示将关键字右边的这张表看成主表,主要是为了将这张表中的数据全部查询出来,捎带着关联查询左边的表

在外连接当中,两张表连接,产生了主次关系

在内连接当中,两张表连接,没有主次关系

On

      e.deptno = d.deptno;

9.9:外连接(左外连接又叫左连接)

 Select

  e.ename,d.dname

From

  Dept d left Join emp e

On

      e.deptno = d.deptno;

任何一个右连接都有左连接的写法

任何一个左连接都有右连接的写法

 Select

  e.ename,d.dname

From

  emp e right out join dept d

On

      e.deptno = d.deptno;

//out是可以省略的,带着可读性强

*思考:外连接的查询结果条数一定是大于等于内连接的查询结果条数吗?

     答案是肯定的

9.10:三张表、四张表怎么连接?

语法:

Select

  ...

From

 a

Join

 b

On

  a和b的连接条件

Join

   c

On

  a和c的连接条件

Right join

d

On

  a和d的连接条件

一条SQL中内连接和外连接可以混合,都可以出现

例子:找出每个员工的部门名称以及工资等级,要求显示员工名、部门名、薪资、薪资等级?

  Mysql > select * from emp;  e

  Mysql > select * from dept;  d

  Mysql > select * from salgrade;  s

Select

ename,e.sal,d.dname,s.grade

From

  Emp e

Join

  Dept d

On

deptno = d.deptno

Join

  Salgrade s

On

sal betweeen s.losal and s.hisal; 10:子查询 10.1:什么是子查询?

select语句中嵌套select语句,被嵌套的select语句称为子查询

10.2:子查询都可以出现在哪里呢?

Select

  ...(select)

From

  ...(select)

Where

  ...(select)

10.3:where子句中出现的子查询?

例子:找出比最低工资高的员工姓名和工资?

Select

  Ename,sal

From

  Emp

Where

  Sal > min(sal)  //error  where子句中不能直接使用分组函数

实现思路:

  第一步:查询最低工资是多少

Select min(sal) from emp;

  第二步:找出大于800的

Select ename,sal from emp where sal >800;

  第三步:合并

Select ename,sal from where sal > (select min(sal) from emp);

10.4:from子句的子查询

注意:from后面的子查询,可以将子查询的查询结果当做一张临时表

例子:找出每个岗位的平均工资的薪资等级?

   第一步:找出每个岗位的平均工资(按照岗位分组求平均值)

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

   第二步:把以上的查询结果就当做一张真实存在的表t

Mysql> select * from salgrade; s表

   t表和s表进行表连接,条件:t表avg(sal) between s.losal and s.hisal;

Select

*,s.grade

From

  (Select job,avg(sal) from emp group by job) t

Join

  Salgrade s

On  

T.avgsal between s.losal and s.hisal;

10.5:select后面的出现的子查询(了解)

例子:找出每个员工的部门名称,要求显示员工名、部门名?

Select

Ename,e.deptno,(select d.dname from dept d where e.deptno = d.deptno) as dname

From

  Emp e;

11:union(合并查询结果集) 11.1:union效率高

例子:查询工作岗位是MANAGER和SALESMAN的员工?

1 Select ename,job from emp where job = ‘MANAGER or SALESAMN’;

2 Select ename,job from emp where job in (‘MANAGER,SALESAMN’);

3 Select ename,job from emp where job = ‘MANAGER’

 union

 Select ename,job from emp where job = ‘SALESMAN’;

Union的效率要高一些;对于表连接来说,每连接一次新表,则匹配的次数满足笛卡尔积,成倍的翻

但是union可以减少匹配的次数,在减少匹配次数的情况下,还可以完成两个结果集的拼接

  例子:

a连接b连接c

a 10条记录

b 10条记录

c 10条记录

匹配次数是1000次

a连接b一个结果:10*10=100次

a连接c一个结果:10*10=100次

使用union的话是:100+100=200次(union把乘法算成了加法运算)

*注意事项

union在进行结果集合并的时候,要求两个结果集的列数相同且列的数据类型也相同

12:limit的使用【重点】

12.1:limit作用:是将查询结果集的一部分取出来,通常使用在分页查询中(分页的作用是为了提高用户的体验,因为一次将全部结果都查出来,用户体验感差,可以一页一页翻页看)

12.2:limit怎么用呢?

limit的完整用法:

  Limit startIndex,length

 startIndex是起始下标,length是长度

 起始下标从0开始

按照薪资降序,取出排名在前五名的员工?

Select

 Ename,sal

From

 Emp

Order by

 Sal desc

Limit 5;  //取前五

12.3:注意:MySQL当中limit在order by之后执行 12.4:按照薪资降序,取出排名在三到五名的员工?

Select

 Ename,sal

From

 Emp

Order by

 Sal desc

Limit 2,3;  //2表示起始位置从下标2开始,就是第3条记录;3表示长度

12.5:分页

每页显示3条记录

第一页:limit 0,3  [0  1  2]

第二页:limit 3,3  [3  4  5]

第三页:limit 6,3  [6  7  8]

第四页:limit 9,3  [9  10  11]

每页显示pagesize条记录

第pageno页:

limit (pageno - 1) * pagesize , pagesize

12.6: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

13:表的创建(建表) 13.1:建表的语法格式(建表属于DDL语句,DDL包括create,drop,alter)

 Creat table 表名

(

  字段名1 数据类型,

  字段名2 数据类型,

字段名3 数据类型

);

表名:建议以t_或者tbl_开始,可读性强,见名知意

字段名:见名知意

两者都属于标识符

13.2:关于MySQL中的数据类型

Varchar(255)

 可变长度的字符串

 比较智能,节省空间

 会根据实际的数据长度动态分配空间

优点:节省空间

缺点:需要动态分配内存,速度慢

Char(255)

 定长字符串

 不管实际的数据长度是多少

 分配固定长度的空间去存储数据

 使用不恰当的时候,可能会导致空间的浪费

优点:不需要动态分配空间,速度快

缺点:使用不当是会造成空间的浪费

  varchar和char应该怎么去选择?

固定字符串长度:char

可变字符串长度:varchar

Int (11)

 数字中的整数型

Bigint

 数字中的长整数型

Float

 单精度浮点型数据

Double

 双精度浮点型数据

Date

 短日期类型

Datetime

 长日期类型

Clob(character large object)(>255)

 字符大对象

 最多可以存储4G的字符串

 比如:存储一个说明,存储一篇文章

Blob(binary large object)

 二进制大对象

 专门用来存储图片、声音、视频等流媒体数据

13.3:创建一个学生表?

学号、姓名、年龄、性别、邮箱地址

   create table t_student

    -> (

    -> no int,

    -> name varchar(32),

    -> sex char(1),

    -> age int(3),

    -> email varchar(255)

    -> );

13.4:删除表

  Drop table 表名;  //当这张表不存在的时候会报错

  Drop table if exists 表名;  //如果这张表存在的话,删除

13.5:插入数据(insert)DML

语法格式:

  Insert into 表名(字段名1,字段名2,字段名3...)  value(值1,值2,值3) ;

注意:字段名和值要一一对应(数量要对应,数据类型要对应)

  mysql> insert into  t_student(no,name,sex,age,email) values (1,'zhangsan','m','20','zhangsan@123.com');

mysql>  insert into  t_student(email,name,sex,age,no) values ('liai@123.com','lisi','m','19','2');

Query OK, 1 row affected (0.00 sec)

mysql> select * from t_student;

+------+----------+------+------+------------------+

| no   | name     | sex  | age  | email            |

+------+----------+------+------+------------------+

|    1 | zhangsan | m    |   20 | zhangsan@123.com |

|    2 | lisi     | m    |   19 | liai@123.com     |

+------+----------+------+------+------------------+

注意:insert语句但凡是执行成功了,那么必然会多一条记录

     没有给其它字段指定值的话,默认值是NULL

13.6:指定默认值

    Drop table if exists t_student;

       create table t_student

    -> (

    -> no int,

    -> name varchar(32),

    -> sex char(1) dedault ‘m’,  //default意思:缺省、默认

    -> age int(3),

    -> email varchar(255)

-> );

*insert into t_student value(2);  //错误的

//注意:前面的字段名省略的话,等于都写上了,所以值也要都写上!

insert into t_student value(2,’lisi’,’m’,’20’,’lisi@123.com’);

13.7:insert插入日期

数字格式化:format(数字,’格式’)

Date_format:将date类型转化成具有一定格式的varchar字符串类型

  语法格式:

Date_format(日期类型数据,’日期格式’)

  Date_format(birth, ’%m/%d/%y’) as birth from t_user;

Str_to_date:将字符串varchar类型转化成date类型

   语法格式:

Star_to_date(‘字符串日期’,’日期格式’)

Mysql的日期格式:

%y 年

%m 月

%d 日

%h 时

%i 分

%s 秒

Star_to_date(‘01-10-1990’,’%d-%m-%y’)

注意:数据库中有一条命名规范:所有的标识符全部都是小写,单词和单词之间使用下划线进行衔接

13.8:date和datetime两个类型的区别?

Date是短日期,包括年月日信息

Datetime是长日期,包括年月日时分秒信息

MySQL短日期默认格式:%y-%m-%d

MySQL长日期默认格式:%y-%m-%d %h:%i:%s

mysql>    insert into t_user(id,name,birth,create_time) value(1,'zhangsan','1990-10-01','2022-04-21 10:20:30');

13.9:在MySQL中怎么获取系统当前时间?

  Now()函数,并且获取的时间带有:时分秒信息

mysql>    insert into t_user(id,name,birth,create_time) value(2,'lisi','1991-10-01',now());

13.10:修改update(DML)

语法格式:

Update 表名 set 字段名1=值1,字段名2=值2,字段名3=值3...where 条件;

例子:update t_user set name=’jack’,birth=’2000-10-11’ where id = 2;

13.11:删除数据delete(DML)

语法格式:

Delete from 表名 where 条件;

例子:

Delete from t_user where id=2;

注意:没有条件,整张表的数据会被全部删除

13.12:insert语句可以一次插入多条记录

语法:

Insert into t_user(字段名1,字段名2) value(),(),(),();

例子:

mysql>    insert into t_user(id,name,birth,create_time) values

(1,'zhangsan','1990-10-01',now()),

(2,'lisi','1991-10-01',now()),

(3,'wangwu','1998-10-01',now());

13.13:快速创建表(表的复制)

Create table emp2 as select * from emp;(将一个查询结果当做一张表新建)

13.14:将查询结果插入到一张表当中?(insert)

Create table dept_bak as select * from dept;

Select * from dept;

Insert into dept_bak select * from dept;

Select * from dept_bak;

13.15:快速删除表中的数据

Delete from dept_bak;  //这种方式速度慢

Delete语句删除数据的原理?(这种操作属于DML操作)

  表中的数据被删除了,但是这个数据在硬盘上的真实存储空间不会被释放

  优点:支持回滚,后悔了可以再恢复数据(rollback)

  缺点:删除效率比较低

truncate语句删除数据的原理?(这种操作属于DDL操作)

  这种删除效率比较高,表被一次截断,物理删除

  优点:快速

  缺点:不支持回滚

  用法:truncate table dept_bak;  

13.16:约束(constraint)【重点】 什么是约束?(作用:保证表中的数据有效)

在创建表的时候,我们可以给表中的字段加上一些约束,来保证这个表中数据的完整性、有效性

常见的约束

非空约束:not null

唯一性约束:unique

主键约束:primary key(简称PK)

外键约束:foreign key(简称FK)

检查约束:check(MySQL不支持,oracle支持)

(3)非空约束:not null约束的字段不能NULL

Drop table if exits t_vip;

Create table t_vip(

   Id int,

   Name varchar(255) not null

);

Insert into t_vip(id,name) value(1,’zhangsan’);

Insert into t_vip(id,name) value(2,’lisi’);

小插曲:

xxxx.sql这种文件被称为sql脚本文件

sql脚本文件中编写了大量的sql语句

在执行sql语句的时候,该文件中所有的sql语句会全部执行

批量的执行sql语句,可以使用sql脚本文件

在mysql当中怎么执行sql脚本呢?

  Mysql>source D:\cource\03-MYSQL\document\vip.sql

(4)唯一性约束:unique约束的字段不能重复,但是可以为NULL

Drop table if exits t_vip;

Create table t_vip(

   Id int,

   Name varchar(255) unique  //约束添加在列的后面,这种约束叫列级约束

 );

Insert into t_vip(id,name) value(1,’zhangsan’);

Insert into t_vip(id,name) value(2,’lisi’);

*name和email两个字段联合起来具有唯一性

Drop table if exits t_vip;

Create table t_vip(

   Id int,

   Name varchar(255) ,

   Email varcahr(255),

   Unique(name,email)  //约束没有添加在列的后面,这种约束叫表级约束

 );

Insert into t_vip(id,name,email) value(1,’zhangsan’,’zhangsan@123.com’);

Insert into t_vip(id,name,email) value(2,’lisi’,’lisi@sina.com’);

*unique和not null可以联合

Drop table if exists t_vip;

Create table t_vip;

 Id int,

 Name varchar(255) not null unique

);

主键约束(primary key简称PK)【重点】

主键约束的相关术语?

   主键约束:就是一种约束

   主键字段:该字段上添加了主键约束,这样的字段叫主键字段

   主键值:主键字段中的每一个值都叫做主键值

什么是主键值?有什么用?

   主键值是每一行记录的唯一标识

   主键值是每一行记录的身份证号

注意:每一张都应该有主键,没有主键,表无效

主键的特征:

Not null + unique(主键值不能是NULL,同时也不能重复)

怎么给一张表添加主键约束呢?

Drop table if exists t_vip;

Create table t_vip(

//一个字段做主键:单一主键

Id int primary key,

Name varchar(255)

);

Insert into t_vip(id,name) value (1,’zhangsan’);

Insert into t_vip(id,name) value (2,’lisi’);

//error

Insert into t_vip(id,name) value (2,’wangwu’);

*表级约束主要是给多个字段联合起来添加约束

Drop table if exists t_vip;

//id和name联合起来做主键:复合主键

Create table t_vip(

Id int,

Name varchar(255),

Email varchar(255),

Primary key(id,name)

);

Insert into t_vip(id,name,email) value (1,’zhangsan’,’zhangsan@123.com’);

Insert into t_vip(id,name,email) value (1,’lisi’,’lisi@123.com’);

*一张表中约束可以添加两个吗?

Drop table if exists t_vip;

Create table t_vip(

Id int primary key,

Name varchar(255) primary key

);

//error

结论:一张表,主键约束只能添加一个(主键只能有一个)

*主键值建议使用:

Int

Bigint

Char

不建议使用:varchar来做主键。主键一般都是数字,一般都是定长的

*主键除了单一主键和复合主键之外,还可以这样分类?

自然主键:主键是一个自然数,和业务无关

业务主键:主键值和业务紧密关联,例如拿银行卡账号做主键值

在mysql中,有一种机制,可以帮我们自动维护一个主键值?

Drop table if exists t_vip;

Create table t_vip(

Id int primary key auto_increment(表示自增,从一开始,以一自增),

Name varchar(255)

);

insert into t_vip(name) value (‘zhangsan’);

insert into t_vip(name) value (‘zhangsan’);

insert into t_vip(name) value (‘zhangsan’);

insert into t_vip(name) value (‘zhangsan’);

insert into t_vip(name) value (‘zhangsan’);

insert into t_vip(name) value (‘zhangsan’);

Select * from t_vip;

外键约束(foreign key简称FK)   【重点】

外键约束的相关术语:

   外键约束:一种约束

   外键字段:该字段上添加了外键约束

   外键值:外键字段当中的每一个值(外键值可以为NULL)

Foreign key(cno) references t_class(classno)

14:存储引擎 14.1:什么是存储引擎?有什么用呢?

存储引擎是mysql中特有的一个术语,其他数据库没有(oracle中有,但不叫这个名字)

存储引擎是一个表存储/组织数据的方式

不同的存储引擎,表存储数据的方式不同

14.2:怎么给表添加/指定“存储引擎”呢?

Show create table t_student;

在建表的时候可以在最后小括号”)”的右边使用:

  ENGINE来指定存储引擎

  CHARSET来指定这张表的字符编码方式

结论:

  Mysql默认的存储引擎是:InnoDB

Mysql默认的字符编码方式是:utf8

建表时指定存储引擎,以及字符编码方式

Create table t_product(

Id int primary key,

Name varchar(255)

)engine=InnoDB default charset=gbk;

14.3:怎么查看mysql支持哪些存储引擎呢?

命令:Show engines  \G

Mysql支持九大存储引擎

14.4:查看mysql版本?

命令:Select version();

+-----------+

| version() |

+-----------+

| 8.0.19  |

+-----------+

14.5:关于mysql常用的存储引擎?

MyISAM存储引擎?

它管理的表具有以下特征:

  使用三个文件表示每个表:

    格式文件 — 存储表结构的定义(mytable.frm)

    数据文件 — 存储表行的内容(mytable.MYD)

    索引文件 — 存储表上索引(mytable.MYI):索引是一本书的目录,缩小扫描范围,提高查询效率的一种机制。

  可被转换为压缩、只读表来节省空间

提示一下:

  对于一张表来说,只要是主键或者加有unique约束的字段上会自动创建索引。

  MyISAM存储引擎特点:

    可被转换为压缩、只读表来节省空间

  MyISAM不支持事务机制,安全性低。

InnoDB存储引擎?

这是mysql默认的存储引擎,同时也是一个重量级的存储引擎。

InnoDB支持事务,支持数据库崩溃后自动恢复机制。

InnoDB存储引擎最主要的特点是:非常安全。

它管理的表具有下列主要特征:

  – 每个 InnoDB 表在数据库目录中以.frm 格式文件表示

  – InnoDB 表空间 tablespace 被用于存储表的内容(表空间是一个逻辑名称。表空间存储数据+索引。)

  – 提供一组用来记录事务性活动的日志文件

  – 用 COMMIT(提交)、SAVEPOINT 及ROLLBACK(回滚)支持事务处理

  – 提供全 ACID 兼容

  – 在 MySQL 服务器崩溃后提供自动恢复

  – 多版本(MVCC)和行级锁定

  – 支持外键及引用的完整性,包括级联删除和更新

InnoDB最大的特点就是支持事务:

  以保证数据的安全。效率不是很高,并且也不能压缩,不能转换为只读,不能很好的节省存储空间。

MEMORY存储引擎?

使用 MEMORY 存储引擎的表,其数据存储在内存中,且行的长度固定。

这两个特点使得 MEMORY 存储引擎非常快。

MEMORY 存储引擎管理的表具有下列特征:

  – 在数据库目录内,每个表均以.frm 格式的文件表示。

  – 表数据及索引被存储在内存中。(目的就是快,查询快!)

  – 表级锁机制。

  – 不能包含 TEXT 或 BLOB 字段。

MEMORY 存储引擎以前被称为HEAP 引擎。

MEMORY引擎优点:查询效率是最高的。不需要和硬盘交互。

MEMORY引擎缺点:不安全,关机之后数据消失。因为数据和索引都是在内存当中。

15:事务【重点】 15.1:什么是事务?

*什么是事务?

一个事务其实就是一个完整的业务逻辑,是一个最小的工作单元,不可再分。

    本质:一个事务就是多条DML语句同时成功或同时失败

*什么是一个完整的业务逻辑?

  假设转账,从A账户向B账户中转账10000.

  将A账户的钱减去10000(update语句)

  将B账户的钱加上10000(update语句)

  这就是一个完整的业务逻辑。

以上的操作是一个最小的工作单元,要么同时成功,要么同时失败,不可再分。

这两个update语句要求必须同时成功或者同时失败,这样才能保证钱是正确的。

*只有DML语句才会有事务这一说,其它语句和事务无关

insert

delete

update

只有以上的三个语句和事务有关系,其它都没有关系。

因为只有以上的三个语句是数据库表中数据进行增、删、改的。

只要你的操作一旦涉及到数据的增、删、改,那么就一定要考虑安全问题。

15.2:事务是如何做到多条DML语句同时成功同时失败的呢?

InnoDB存储引擎:提供一组用来记录事务性活动的日志文件

事务开启了:

insert

insert

insert

delete

update

update

update

事务结束了!

在事务的执行过程中,每一条DML的操作都会记录到“事务性活动的日志文件”中。

在事务的执行过程中,我们可以提交事务,也可以回滚事务。

(1)提交事务?

   清空事务性活动的日志文件,将数据全部彻底持久化到数据库表中。

   提交事务标志着,事务的结束。并且是一种全部成功的结束。

(2)回滚事务?

   将之前所有的DML操作全部撤销,并且清空事务性活动的日志文件

   回滚事务标志着,事务的结束。并且是一种全部失败的结束。

15.3:怎么提交事务?怎么回滚事务?

*提交事务:commit; 语句

*回滚事务:rollback; 语句(回滚永远都是只能回滚到上一次的提交点!)

*事务对应的英语单词是:transaction

*测试一下,在mysql当中默认的事务行为是怎样的?

*mysql默认情况下是支持自动提交事务的。

*什么是自动提交?

  每执行一条DML语句,则提交一次!

这种自动提交实际上是不符合我们的开发习惯,因为一个业务通常是需要多条DML语句共同执行才能完成的,为了保证数据的安全,必须要求同时成功之后再提交,所以不能执行一条,就提交一条。

*怎么将mysql的自动提交机制关闭掉呢?

 先执行这个命令:start  transaction

*演示事务:

回滚事务

  mysql> use bjpowernode;

  Database changed

  mysql> select * from dept_bak;

  Empty set (0.00 sec)

  mysql> start transaction;

  Query OK, 0 rows affected (0.00 sec)

  mysql> insert into dept_bak values(10,'abc', 'tj');

  Query OK, 1 row affected (0.00 sec)

  mysql> insert into dept_bak values(10,'abc', 'tj');

  Query OK, 1 row affected (0.00 sec)

  mysql> select * from dept_bak;

  +--------+-------+------+

  | DEPTNO | DNAME | LOC  |

  +--------+-------+------+

  |     10 | abc   | tj   |

  |     10 | abc   | tj   |

  +--------+-------+------+

  2 rows in set (0.00 sec)

  mysql> rollback;

  Query OK, 0 rows affected (0.00 sec)

  mysql> select * from dept_bak;

  Empty set (0.00 sec)

提交事务

  mysql> use bjpowernode;

  Database changed

  mysql> select * from dept_bak;

  +--------+-------+------+

  | DEPTNO | DNAME | LOC  |

  +--------+-------+------+

  |     10 | abc   | bj   |

  +--------+-------+------+

  1 row in set (0.00 sec)

  mysql> start transaction;

  Query OK, 0 rows affected (0.00 sec)

  mysql> insert into dept_bak values(20,'abc

  Query OK, 1 row affected (0.00 sec)

  mysql> insert into dept_bak values(20,'abc

  Query OK, 1 row affected (0.00 sec)

  mysql> insert into dept_bak values(20,'abc

  Query OK, 1 row affected (0.00 sec)

  mysql> commit;

  Query OK, 0 rows affected (0.01 sec)

  mysql> select * from dept_bak;

  +--------+-------+------+

  | DEPTNO | DNAME | LOC  |

  +--------+-------+------+

  |     10 | abc   | bj   |

  |     20 | abc   | tj   |

  |     20 | abc   | tj   |

  |     20 | abc   | tj   |

  +--------+-------+------+

  4 rows in set (

标签:

MySQL数据库由讯客互联创业栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“MySQL数据库

上一篇
DSP看门狗权威解读

下一篇
暂无