27 03 2022

Mysql数据库基础知识

一、Mysql5.7.19解压版安装

            Mysql基本介绍:

            Mysql是一个关系型数据库管理系统,由瑞典MYSQL AB公司开发,属于Oracle旗下产品。

            Mysql是一个单进程多线程的数据库,在innodb中大概3种线程为:1、主线程Master Thread;2、IO Thread线程,用于异步处理写请求;3、purge Thread线程,用于删除undo日志。


    网址:https://dev.mysql.com/

    下载地址https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.19-winx64.zip

            特别说明:

            image.png

            image.png

            安装步骤:

            1.下载得到zip文件

            2.解压的路径不要带有中文和空格

            3.解压到这里

            image.png

            4.添加环境变量,其目的是:可以在dos下的任意目录操作mysql相关指令

            WIN + E -> 右键此电脑 -> 属性 -> 高级系统设置 -> 高级选项卡 -> 环境变量, 在path环境变量中增加mysql安装目录,到那个bin目录下面,如:D:\mysql-5.7.19-winx64\bin\

            image.png

            5.在D:\mysql-5.7.19-winx64\目录下创建my.ini文件,需要我们自己创建

            [client]

            port=3306

            default-character-set=utf8

            

            [mysqld]

            #设置为自己的mysql安装目录

            basedir=D:\mysql-5.7.19-winx64\

            #设置为mysql的数据目录

            datadir=D:\mysql-5.7.19-winx64\data\

            port=3306

            character_set_server=utf8

            #跳过安全检查,注释以后需要输入正确的用户名和密码才能登录

            #skip-grant-tables

            6.使用管理员身份打开cmd,并切换到D:\mysql-5.7.19-winx64\bin目录下执行 mysqld -install (mysqld后面有个空格)

            image.png

            7.初始化数据库  mysqld --initialize-insecure --user=mysql    ,如果执行成功,生成data目录

            image.png

            8.启动mysql服务net start mysql;停止mysql服务net stop mysql;

            image.png

            image.png

            9.进入mysql终端mysql -u root -p [安装完成以后,root账户,密码为空]

            10.修改root用户密码

            use mysql;

            update user set authentication_string=password('你要设置的密码') where user='root' and Host='localhost';

            或者下面修改密码语句也可以:

            set password for root@localhost=password('你的密码');

            flush  privileges;   //刷新权限

            

二、数据库

            1、连接到mysql服务的命令:mysql -h localhost -P 3306 -u root -p123123123   

            注意:-P端口这个P是大写;-p密码这里没有空格

            image.png

            2、mysql三层结构

            image.png

            image.png

            3、sql语句分类

            image.png

            4、创建数据库数据表操作

            4.1、创建数据库

            create database 数据库名;

            4.2、创建数据库,同时设置字符集

            create database 数据库名 character set utf8;

            image.png

            4.3、显示数据库语句

            show databases;

            image.png

            4.4、显示数据库创建语句,下图中的反引号 `` 是用来规避关键字的

            show create databases db_name;

            image.png

            4.5、数据库删除语句

            drop database if exists ab_name; (谨慎使用,生产环境一定不要轻易操作,仔细确认再的确要删除才执行)

            image.png

            4.6、备份数据库,在dos命令行操作

            mysqldump -u 用户名 -p 密码 -B 数据库1  数据库2  数据库n > 文件位置:\文件名.sql

            image.png 

            4.7、恢复数据库,需要登录进mysql再执行操作

            source 文件夹:\beifen.sql

            image.png

            4.8、备份数据库的表,

            mysqldump -u 用户名 -p 密码 数据库 表1  表2  表n > 文件位置:\文件名.sql

            image.png


三、表

            1、创建mysql数据表,语法如图所示:

            image.png

            image.png


四、Mysql常用数据类型(列类型/字段类型)

            1、mysql列类型-即mysql数据类型(数据类型选择遵守保小不保大)

            image.png

            1.1、数值类型

            image.png

            image.png

            1.2、文本类型(字符串类型)

            image.png

            1.3、二进制数据类型

            image.png

            1.4、时间日期类型

            image.png

            image.png


五、列类型

            5.1、mysql列类型之bit

            image.png

            image.png

            image.png

            image.png

            image.png

            5.2、mysql列类型之数值型

            5.2.1小数类型

            image.png

            image.png

                        

            image.png

            

            5.3、mysql列类型之字符串类型

            5.3.1char(这里是字符数,char(10),即使只存5个汉字,但是也占用10个字符空间 )、varchar(这里面是字符数,varchar(10)可以存储10个中文汉字,utf8编码占用内存空间31-33个字节)(utf8编码varchar最大21844个字符,gbk编码varchar最大32766个字符

            image.png

            image.png

            

            字符串使用细节1:占用多大字节空间根据表的编码决定(utf8中文3个字节,英文一个字节;gbk中文2个字节)

            image.png

            image.png

            字符串使用细节2:

            image.png

            字符串使用细节3:

            image.png

            为什么char比varchar快呢?

            char类型在存放数据的时候,中间是没有间隔的,数据本身是有空格的,但是数据段之间是没有间隔的,这是因为我们在创建列的时候已经告诉MySQL列的长度了,MySQL在查询数据的时候,只需要按部就班寻找就行了,不需要在中途计算这个数据段的长度。

但是varchar类型的存放就不同了,它是动态分配存储空间的,在每个数据段开头,都要有一段空间来(1~2个字节)存放数据段的长度信息,在数据段的结尾也还有一段空间(1个字节)标记此字段的节数。MySQL在读取一个数据段的时候,首先要读开头,比如读到了3,说明数据段的长度是3,之后就不多不少,只读3个字节,也只分配3个字节的存储空间。所以MySQL在遍历数据的时候,磁针要比char类型的列,多读很多次磁盘来获取字段的真实长度,这就是为什么varchar比char查询效率低的原因了。

            image.png

            字符串使用细节4:

            image.png

            image.png


            5.4、mysql列类型之日期类型

            image.png

            image.png


六、表操作

            6.1、修改表基本介绍

            image.png

            添加字段:

            image.png

            查看表结构:

            image.png

            修改表结构(字段类型):

            image.png

            image.png

            注意:int(10),这个10表示数据显示的长度为10;  int(2)并不表示数据大小的最大值为99,其大小和int表示的最大值一样,只是表示查询时显示的结果长度为2位; 而char(10)  varchar(10), 这里的10表示不管什么字符集,最多只能存10个字符!!!

            删除表结构(字段):

            image.png

            修改表名:

            image.png

            修改表字符集:

            image.png

            查看建表语句:

            image.png

            image.png

            修改字段名称:

            image.png


七、CURD  C[create] U[update] R[retrieve 检索、找、取] D[delete]

            7.1、添加语句

            image.png

            image.png

            image.png

            注意细节:

            image.png


            7.2、更新语句 

            image.png

            image.png

            image.png

            image.png

            注意细节:

            image.png


            7.3、删除语句 (注意:删除的时候一定要带条件,不然会导致整个表的数据全部被删除 !!!)

            image.png

            image.png

            注意了:

            image.png

            image.png


            7.4、select查询语句  (SQL中的重点、难点)

            image.png


            7.4.1 指定字段查询

            image.png


            7.4.2 指定字段去重查询

            image.png

            image.png


            7.4.3 使用表达式对查询的列进行运算

            image.png

            image.png

            image.png            

            

            7.4.4 在select语句中使用as语句

            image.png

            image.png

            7.4.5 在where字句中经常使用的运算符

            image.png

            >  <   like  and 

            image.png

            image.png

            查询姓氏姓金的

            image.png

            image.png

            (between  and )   是一个闭区间 

            image.png

            or

            image.png

            in

            image.png

            order by    order by语句应该位于select语句的结尾

            image.png

            image.png

            image.png

            image.png


            7.5、合计/统计函数

            7.5.1、count函数

            image.png

            image.png

            count(字段) 返回非空的字段满足条件的数量!!!

            image.png

            image.png

            image.png

            image.png

            7.5.2、sum函数

            image.png

            image.png

            image.png

            统计一个班级语文成绩的平均分

            image.png

            注意:sum函数仅对数值起作用,对其他类型值求sum没有意义;  还有多列求和的时候“,”不能少!!!

            7.5.3、avg函数

            image.png

            image.png

            7.5.4、max/min函数

            image.png

            image.png


            7.6、分组统计

            image.png

            按照部门分组来查询

            image.png

            显示每个部门的每种岗位的平均工资和最低工资

            image.png


            image.png

            显示平均工资低于2000的部门编号和它的平均工资

            image.png

            下面这个使用1次avg函数的查询方式效率高一点

            image.png

            

            7.7、字符串函数

            image.png

            7.7.1 返回字串字符集

            image.png

            7.7.2 连接字串,把多个列拼接成一列(把字串粘在一起)

            image.png

            7.7.3 INSTR(string,substring)  返回substring在string中出现的位置,从1开始,没有则返回0

            image.png

            7.7.4 转成大写小写  UCASE/LCASE

            image.png

            image.png

            7.7.5 LEFT(string,length) / RIGHT(string,length)   从string的左边 / 右边起,取length个字符

            image.png

            image.png

            7.7.6 LENGTH(string)   返回string的长度(字节长度)

            image.png

            image.png

            7.7.7 REPLACE(str,search_str,replace_str) 在str中用 replace_str 替换 search_str   

            image.png

            7.7.8 STRCMP(string1,string2) 逐字符比较两字串的大小, 函数用于比较两个字符串,如果两个字符串都相同,则返回0,如果根据定义的顺序第一个参数小于第二个参数,则返回-1,而当第二个参数小于第一个参数时,则返回1。

            image.png

            7.7.9 substring(str,position,[length]) 从str的position位置开始 [从1开始计算] ,取出length个字符;如果第三个参数不给,就默认取出到末尾

            image.png

            7.7.10 ltrim(string)    rtrim(string)    trim(string)   去掉string的左边、右边、两端空格

            image.png

            以首字母小写的方式显示所有员工emp表的姓名

            image.png

            image.png

            

            7.8、数学函数

            image.png

            7.8.1 abs()函数

            image.png

            7.8.2 bin()函数, 十进制转二进制

            image.png

            7.8.3 ceiling(num)函数,向上取整,得到比num大的最小整数

            image.png

            7.8.4 conv(num,from_base,to_base)函数, 进制转换函数

            image.png

            7.8.5 floor(num)函数,向下取整,得到比num小的最大整数

            image.png

            7.8.6 format(num,decimal_places)函数,对num 保留 decimal_places位小数(四舍五入)

            image.png

            7.8.7 hex(num)函数,转成十六进制

            image.png

            7.8.8 least(num1,num2, [...])函数,求最小值

            image.png

            7.8.9 mod(numerator,denominator)函数,求余

            image.png

            7.8.10 rand([seed] rand [seed])函数,返回随机数,其范围为0 <= v <= 1.0

            image.png

            注意:使用rand(),每次返回不同的随机数,范围0 <= v <= 1.0;使用rand(seed)返回随机数,范围0 <= v <= 1.0,如果seed不变,该随机数也不会变化


            7.9、时间日期相关函数

            image.png

            7.9.1 current_date()函数,返回当前日期; 查询的时候current_date 可以带小括号也可以不带

            image.png

            7.9.2 current_time()函数,返回当前时间

            image.png

            7.9.3 current_timestamp()函数,返回当前时间戳

            image.png

            image.png

            7.9.4 now()函数,返回当前日期时间

            image.png

            image.png

            应用实例1:显示所有新闻信息,发布日期只显示日期,不显示时间

            image.png

            7.9.5 date_add(date,interval  d_value   d_type)函数在date上加上时间或者日期

            应用实例2:查询在10分钟内、一天内、一个月内、一年内添加的数据      

            image.png

            image.png

            7.9.6 date_sub(date,interval  d_value   d_type)函数, 在date上减去时间或者日期

            image.png

            image.png

            7.9.7 datediff(date1,date2)函数,返回两个日期差(结果是天)

            image.png


            image.png

            7.9.8 year|month|date(datetime)     年月日

            image.png

            7.9.9 unix_timestamp()函数, 返回自1970-01-01 00:00:00  到当前时间的秒数

            image.png

            7.9.9 FROM_UNIXTIME()函数,   把一个unix_timestamp秒数[时间戳]  转成指定格式的日期

            image.png

            

            7.10、加密和系统函数

            image.png

            7.10.1  user()函数,查询当前是哪个用户

            image.png

            7.10.2  database()函数,查询当前使用的数据库名

            image.png

            7.10.3  md5()函数,为字符串算出一个md5  32位的字符串,常用于用户密码加密

            image.png

            7.10.4  password()函数,加密函数,mysql数据库的用户密码就是用password函数加密的

            image.png

            image.png

            image.png


            7.11、流程控制函数

            image.png

            image.png

            7.11.1 if(expr1,expr2,expr3)函数,如果 expr1为true则返回expr2,否则返回expr3

            image.png

            7.11.2 ifnull(expr1,expr2)函数,如果expr1不为空,则返回expr1,否则返回expr2

            image.png

             7.11.3 判断是否为null,要使用is null, 判断不为空,使用is not null

            image.png

            7.11.4  SELECT CASE  WHEN expr1  THEN  expr2  WHEN expr3   THEN  expr4  ELSE  expr5  END ;  【多重分支】 如果expr1为 true 则返回expr2,如果expr3为 true 则返回expr4, 否则返回expr5

            image.png


八、MYSQL查询加强

            8.1 mysql多表查询

            image.png

            8.2  在mysql中,日期类型可以直接比较

            image.png

            8.3  like模糊查询,   %:表示0到多个任意字符    _:表示单个任意字符

             显示首字母为N的员工的工资和姓名  

            image.png     

             显示第三个字符为小写n的员工工资和姓名

            image.png    

             显示没有上级的职员信息 就是判断mgr字段为null,  判断null   使用 is null

            image.png    

             根据工资升序倒序查询

            image.png

            image.png

             根据工资倒序排序,部门升序排序

            image.png



            image.png

            image.png

            8.4  limit分页查询

            image.png

            image.png


            8.5  使用分组函数和分组子句 group by

            应用实例一:显示每种岗位的雇员总数、平均工资

            image.png

            应用实例二:显示雇员总数,以及获得奖金的雇员数

            count(字段),如果字段的值为null,则count()不会统计

            image.png

            image.png

            应用实例三:显示雇员总数,以及没有获得奖金的雇员数

            image.png

            image.png

            应用实例四:显示管理者的总人数

            image.png

            应用实例五:显示最大薪资差

            image.png

            应用实例六:统计各个部门的平均工资,并且大于1000,按照平均工资从高到低排序,取出前两行记录

            image.png

            

            注意::语句顺序!!!

            image.png


            8.6  多表联合查询

            应用实例一:多表查询,显示雇员名字、雇员工资、及所在部门的名字

            image.png

            image.png

            当多表查询不加条件的时候:

            image.png

            image.png

            分析:从第一张表中取出一行和第二张表进行组合,返回结果,结果包含两张表的所有列,上面两表查询不加条件的时候,结果就有32行,这样的多表查询默认处理返回的结果,称为笛卡尔集

            image.png

            image.png

            应用实例二:多表查询,显示雇员名字、雇员工资、部门编号、及所在部门的名字

            注意:当我们需要指定某个表的列时,需要使用  表名.列名的方式

            image.png

            小技巧:多表查询的条件不能少于表的张数-1,如:3表查询,条件至少要两个,才不会出现笛卡尔集

            应用实例三:多表查询,显示雇员名字、雇员工资、部门编号为10的部门、及所在部门的名字

            image.png


            8.7  多表联合查询-自连接

            什么是自连接:自连接指在同一张表的链接查询(将同一张表看做两张表)

            自连接的特点:1、把同一张表当做两张表来说使用    2、需要给表取别名   表名  表别名   3、列名不明确,可以指定列的别名   列名  as  列的别名

            image.png

            image.png

            image.png


            过程分析:同一张表某条记录的mgr = 同一张表某条记录的empno

            image.png

            image.png

            第一步:

            image.png

            第二步:

            image.png

            第三步:

            image.png

            

            8.8  子查询

            什么是子查询:嵌入在sql语句中的select语句,也叫嵌套查询

            单行子查询:指只返回一行数据的子查询语句

            多行子查询:指只返回多行数据的子查询语句,使用关键字 IN

            应用实例一:显示与smith同一部门的员工

            第一步:查询部门编号

            image.png

            第二步:把上面的select语句当做子查询来使用

            image.png

            应用实例二:查询和部门10的工作相同的雇员的名字、岗位、工资、部门号,但是不包含10号部门自己的雇员

            第一步:查询10号部门的工作岗位有哪些

            image.png

            像以下情况需要过滤

            image.png

            第二步:把上面查询的结果当做子查询

            image.png


            8.9  子查询当做临时表

            image.png

            image.png

            image.png

            

            image.png

            image.png

            image.png

            

            image.png

            image.png

            image.png


            8.10  在多行子查询中使用all操作符和any操作符

            应用实例一:显示工资比部门30的所有员工的工资高的员工姓名、工资和部门号

            image.png

            image.png

            应用实例二:显示工资比部门30的其中一个员工的工资高的员工姓名、工资和部门号

            image.png

            8.11  多列子查询

            多列子查询是指查询返回多个列数据的子查询语句

            应用实例一:查询与smith的部门和岗位完全相同的所有雇员(不包含smith本人)

            第一步:得到smith的部门和岗位

            image.png

            第二步:把上面的查询当做子查询来使用,并且使用多列子查询的语法进行匹配

            image.png

            image.png

            应用实例二:

            image.png

            第一步:先得到每个部门的平均工资和部门号

            image.png

            第二步:把上面的结果当做子查询,和emp进行多表查询

            image.png

            应用实例三:查询每个部门工资最高的人

            image.png

            应用实例四:查询每个部门的信息(包括:部门号、编号、地址)和人员数量

            第一步:部门号、编号、地址在dept表

            

            第二步:各个部门人员数量 -> 构建一个临时表

            image.png

            第三步:组合查询

            image.png

            image.png

            

            8.12  自我复制数据(蠕虫复制)

            有时,为了对某个sql语句进行效率测试,我们需要海量数据时,可以使用此方法为表创建海量数据

            应用实例一:把emp表得记录复制到my_tab1中

            第一步:从其他表复制

            image.png

            第一步:自我复制

            image.png

            image.png

            image.png

            多次点击,数据成倍增长

            image.png


            应用实例二:删除掉一张表中重复记录

            第一步:先创建一张表  下面语句,把表emp的结构(列),复制到my_tab2中

            image.png

            第二步:添加数据

            image.png

            查询,已经有重复数据

            image.png

            第三步:去除重复数据

            image.png

            1、创建一张临时表

            image.png

            2、把数据去重以后添加到临时表

            image.png

            3、清除掉my_tab2的数据记录

            image.png

            4、把my_tmp表的记录复制到my_tab2

            image.png

            5、drop掉临时表my_tmp

            image.png


            8.13  合并查询

            有些在实际的应用中,为了合并多个select语句的结果,可以使用集合操作符union(联合)、union all(联合所有)

            应用实例一:union all  该操作用于取得两个结果集的并集,当使用该操作时,不会取消重复行

            image.png

            image.png

            image.png

            应用实例二:union 该操作与union all类似,但是会自动去掉结果集中重复行

            image.png


            8.14  mysql表外连接

            image.png

            左外连接:如果左侧的表完全显示(即使左侧的表和右侧的表没有匹配的记录),我们就说是左外连接;  语法:select field1,field2,... from 表1 left join 表2  on  条件[表1就是左表,表2就是右表]

            右外连接:如果右侧的表完全显示(即使右侧的表和左侧的表没有匹配的记录),我们就说是右外连;  语法:select field1,field2,... from 表1 right join 表2  on  条件[表1还是叫左表,表2还是叫右表]

            

            应用实例一:列出部门名称和这些部门员工名字和工作,同时要求显示那些没有员工的部门

            第一步:这里只有三个部门

            image.png

            但实际上是有四个部门的

            image.png

            SQL:

            


            应用实例二:使用左外链接,显示所有人的成绩,如果没有成绩,也要显示该同学的姓名和id,成绩显示为空

            第一步:传统的外键

            image.png

            image.png

            image.png

            第二步:改成左外连接

            image.png

            应用实例三:使用右外链接,查询所有成绩,如果没有名字匹配,显示为空

            image.png

            应用实例四:查询部门的名称和这些部门员工信息(名字和工作),同时列出那些没有员工的部门

            image.png

            image.png

            总结:在开发中,绝大多数情况下还是使用前面学过的多表查询