MySql数据库的启动与停止
注意:此处的 mysql 仅代表在windows服务中注册的名字
启动:net start mysql
停止:net stop mysql
使用命令行进入mysql客户端连接全流程:
win+R -> cmd -> mysql -u root -p -> 密码
mysql模型:
一个mysql模型可以建立多个数据库,一个数据库可以建立多个数据库表,一个数据库表可以存储多条数据
基于数据库表进行数据存储的数据库我们称之为关系型数据库
SQL
sql通用语法:
1.sql语句可以单行或多行书写,以分号结尾
2.sql语句可以使用空格或者缩进来增强语句的可读性,其中空格和缩进的多少没有要求
3.mysql数据库的sql语句不区分大小写,但是关键字建议使用大写,增强规范性
4.注释:
单行注释:-- 注释内容 或者 #注释内容
多行注释:/* 注释内容 */
sql分类:
DDL:数据定义语言,用来定义数据库对象的语言,包括数据库、数据表、字段等
DML:数据操作语言,用来对数据库表中数据的增、删、改的语言
DQL:数据查询语言,用来查询数据库中表的记录的语言
DCL:数据控制语言,用来创建数据库用户、控制数据库的访问权限
DDL
DDL---数据库操作:
查询:
查询所有数据库:SHOW DATABASES;
查询当前数据库:SELECT DATABASE();
创建:
CREATE DATABASE [IF NOT EXISTS] 数据库名称 [DEFAULT CHARSET 字符集] [COLLATE 排序规则];
IF NOT EXISTS:如果该数据库名存在则不创建对应数据库,不存在则创建
DEFAULT CHARSET 字符集:指定创建数据库是的字符集形式,不使用时数据库会使用默认的字符集
COLLATE 排序规则:指定创建数据库时的排序规则
删除:
DROP DATABASE [IF EXISTS] 数据库名;
使用:
USE 数据库名;
DDL---表操作
查询:
查询当前数据库的全部数据表:SHOW TABLES; (使用前必须使用USE语句进入对应的数据库)
查询表结构:DESC 表名;
查询指定表的建表语句:SHOW CREATE TABLE 表名;
创建:
(注意:除去最后一个字段,其他所有字段必须以英文状态下的逗号分割,一个创建语句结束后必须以英文状态下的分号结尾)
CREATE TABLE 表名(
字段1 字段1类型 [COMMENT 字段1注释],
字段2 字段2类型 [COMMENT 字段2注释],
......
字段n 字段n类型 [COMMENT 字段n注释]
)[COMMENT 标注释];
DDL---表操作---数据类型:
实例:
CREATE TABLE emp
( id
int DEFAULT NULL COMMENT '编号', workno
varchar(10) DEFAULT NULL COMMENT '工号', name
varchar(10) DEFAULT NULL COMMENT '姓名', gender
char(1) DEFAULT NULL COMMENT '性别', age
tinyint unsigned DEFAULT NULL COMMENT '年龄', idcard
char(18) DEFAULT NULL COMMENT '身份证号', entrydate
date DEFAULT NULL COMMENT '入职时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='员工表'
DDL---表操作---修改
添加字段:
ALTER TABLE 表名 ADD 字段名 字段类型(长度) [COMMENT 注释] [约束];
案例:
为emp表新增一个字段nickname,类型为varchar(20)
alter table emp add nickname varchar(20) comment '昵称';
修改字段:
修改已有字段的数据类型: ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);
修改已有字段的字段名和数据类型:
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度) [COMMENT 注释] [约束];
案例:
将emp表中的nickname字段修改为username,类型为varchar(30);
alter table emp change nickname username varchar(30);
删除字段:
ALTER TABLE 表名 DROP 字段名;
案例:
删除emp表中的username;
alter table emp drop username;
修改表名:
ALTER TABLE 表名 RENAME TO 新表名;
案例:
将emp表的表名膝修改为employee
alter table emp rename to employee;
DDL---表操作---删除:
删除表:
DROP TABLE [IF EXISTS] 表名;
删除指定表,并重新创建该表:
TRUNCATE TABLE 表名;
DDL总结
DML
介绍:DML主要是对数据表中数据的增、删、改操作的
关键字:
增加:INSERT
删除:DELETE
修改:UPDATE
DML---添加数据
1.给指定字段添加数据:INSERT INTO 表名(字段名1,字段名2,...) VALUES (值1,值2,...);
2.给全部字段添加数据:INSERT INTO 表名 VALUES (值1,值2,...);
3.批量添加数据:INSERT INTO 表名(字段名1,字段名2,...) VALUES (值1,值2,...),(值1,值2,...);
INSERT INTO 表名 VALUES (值1,值2,...),(值1,值2,...);
注意:1.插入数据时,指定的字段顺序与值得顺序需要一一对应;
2.插入的数据为字符串类型和日期类型时需要用引号包含;
3.插入的数据大小需要在字段的规定范围内;
DML---修改数据
UPDATE 表名 SET 字段名1 = 值1,字段名2 = 值2,... [WHERE 条件];
注意:修改语句的条件可以有也可以没有,没有的时候修改的是整张表的所有数据。
DML---删除数据
DELETE FROM 表名 [WHERE 条件];
注意:DELETE语句的条件可以有也可以没有,如果不添加条件则删除的是整张表的全部数据
DELETE语句不能删除某个字段的值
DML总结
DQL
介绍:DQL是数据库查询语句,主要是对数据库中数据的查询
关键字:SELECT
语法结构:SELECT 字段列表 FROM 表名列表
WHERE 条件列表
GROUP BY 分组字段列表
HAVING 分组后条件列表
ORDER BY 排序字段列表
LIMIT 分页参数
讲解流程:基础查询
条件查询(WHERE)
聚合函数(count、max、min、avg、sum)
分组查询(GROUP BY)
排序查询(ORDER BY)
分页查询(LIMIT)
DQL---基本查询
1.查询多个字段
SELECT 字段1,字段2,... FROM 表名;
SELECT * FROM 表名; (查询所有字段)
2.设置别名(别名的设置可有可无,需更具实际情况而定)
SELECT 字段1 AS 别名1, 字段2 AS 别名2,... FROM 表名;
3.去重设置
SELEECT DISTINCT 字段列表 FROM 表名;
练习:
DQL---条件查询
1.语法
SELECT 字段列表 FROM 表名 WHERE 条件;
2.条件列表
比较运算符 | 功能 |
---|---|
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
= | 等于 |
<> 或 != | 不等于 |
BETWEEN...AND... | 在某个范围之内(含最大最小值) |
IN(...) | 在in之后的列表中的值,多选一 |
LIKE 占位符 | 模糊匹配("_"匹配单个字符,"%"匹配多个字符) |
IS NULL | 是NULL |
逻辑运算符 | 功能 |
---|---|
AND 或 && | 并且(多个条件同时成立) |
OR 或 || | 或者(多个或任意一个条件成立) |
NOT 或 ! | 非 |
案例:
DQL---聚合函数
介绍:聚合函数就是将一列数据作为一个整体,进行纵向运算
常见的聚合函数:
函数 | 功能 |
---|---|
count | 统计数量 |
max | 最大值 |
min | 最小值 |
avg | 平均值 |
sum | 求和 |
语法:SELECT 聚合函数(字段列表) FROM 表名;
注意:使用聚合函数时,所有的null不参与运算
案列:
DQL---分组查询
语法:
SELECT 字段名 FROM 表名 [WHERE 条件] GROUP BY 分组字段名 [HAVING 分组后过滤条件];
where与having的区别:
1.执行时机不同:where是分组之前进行过滤,不满足where条件的不进行分组;having是分组后对结果进行 过滤;
2.判断条件不同:where不能使用聚合函数,having可以;
注意:
having的过滤条件为,在where条件筛选后的结果中再次进行条件过滤
执行顺序:where>聚合函数>having
分组后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义
案例:
DQL---排序查询
语法:
SELECT 字段名 FROM 表名 ORDER BY 字段1 排序方式1,字段2 排序方式2;
排序方式:
ASC:升序(默认排序)
DESC:降序
注意:如果是多字段排序,只有当前一个排序结果完全一致时才会执行下一个排序方式
案例:
DQL---分页查询
语法:
SELECT 字段名 FROM 表名 LIMIT 起始索引,查询记录条数;
注意:
1.起始索引是从0开始的,起始索引=(查询页码-1)*每页显示记录数
2.分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中使用的是LIMIT
3.如果查询的是第一页,起始索引可以忽略,直接写成 limit 10
案例:
DQL案例练习
1.查询年龄为20、21、22、23岁的女性员工信息
2.查询性别为男,并且年龄在20-40(含)以内的姓名为三个字的员工
3.统计员工表中年龄小于60,男性员工与女性员工的数量
4.查询所有年龄小于等于38岁员工的姓名和年龄,并对查询结果按年龄升序排序,如果年龄相同按入职时间进行降序排序
5.查询性别为男,年龄在20-40(含)以内的前5个员工信息,并对查询结果按年龄升序排序,如果年龄相同按入职时间进行降序排序
DQL---执行顺序
DQL总结
DCL
介绍:用来管理数据库用户控制数据库的访问权限
DCL---用户管理
1.查询用户
USE mysql;
SELECT * FROM user;
2.创建用户
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
3.修改用户密码
ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码';
4.删除用户
DROP USER '用户名'@'主机名'
案例:
注意:
1.主机名可以使用%通配符
2.这类sql开发人员操作的比较少,主要是由DBA使用
DCL---权限控制
1.查询权限
SHOW GRANTS FOR '用户名'@'主机名';
2.授予权限
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';
3.删除权限
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';
案例:
注意:
多个权限之间使用逗号隔开
授权时,数据库名和表名可以使用*通配符,代表所有
DCL总结
函数
函数定义:函数是指一段可以直接被调用的程序或代码
函数分类:
1.字符串函数
2.数值函数
3.日期函数
4.流程函数
字符串函数
MySQL中内置了很多函数,常见的函数如下:
函数 | 功能 |
---|---|
CONCAT(S1,S2,...,Sn) | 字符串拼接,将S1,S2,...Sn拼接成一个字符串 |
LOWER(str) | 将字符串str全部转换成小写 |
UPPER(str) | 将字符串str全部转换成大写 |
LPAD(str,n,pad) | 左填充,用字符串pad在str的左侧填充,达到n个字符串长度 |
RPAD(str,n,pad) | 右填充,用字符串pad在str右侧填充,达到n个字符串长度 |
TRIM(str) | 去掉字符串str的头部和尾部的空格 |
SUBSTRING(str,start,len) | 返回str从start位置起len个长度的字符串(索引值从1开始) |
语法:SELECT 函数(参数);
练习:
由于业务需求变更,企业员工编号统一为5位数,不足5位的在前面填0;
update emp set workno = lpad(workno,5,'0');
数值函数
常见的数值函数如下:
函数 | 功能 |
---|---|
CEIL(X) | 向上取整 |
FLOOR(X) | 向下取整 |
MOD(X,Y) | 返回X/Y的模(模:相当于取余数) |
RAND() | 返回0~1之间的随机数 |
ROUND(X,Y) | 求x四色五入的值,保留y位小数 |
练习:
通过数据库函数生成一个六位数的数据验证码;
select lpad(floor(rand()*1000000),6,'0');
日期函数
常见的日期函数日下:
函数 | 功能 |
---|---|
CURDATE() | 返回当前日期 |
CURTIME() | 返回当前时间 |
NOW() | 返回当前的日期和时间 |
YEAR(date) | 获取指定date的年份 |
MONTH(date) | 获取指定date的月份 |
DAY(date) | 获取指定date的日期 |
DATE_ADD(date,INTERVAL expr type) | 返回一个日期/时间值加上一个时间间隔expr后的时间值 |
DATEDIFF(date1,date2) | 返回起始时间date1和结束时间date2之间的天数 |
练习:
查询所有员工的入职天数,并倒叙排序
select name,datediff(now(),entrydate) as dattime from emp order by dattime desc;
流程函数
流程函数可以在sql中实现条件筛选,从而提高语句的效率
函数 | 功能 |
---|---|
IF(value,t,f) | 如果value为true,返回t,否则返回f |
IFNULL(value1,value2) | 如果value1不为空,返回value1,否则返回value2 |
CASE WHEN [val1] THEN [res1] ... ELSE [default] END | 如果val1为true,返回res1,...否则返回default默认值 |
CASE [expr] WHEN [val1] THEN [res1] ... ELSE [default] END | 如果expr值等于val1,返回res1,...否则返回default默认值 |
函数总结
约束
1.约束概述
2.约束演示
3.外键约束
约束概述
1.概念
约束是作用于表中字段上的规则,用于限制存储在表中的数据
2.目的
保证数据库中数据的正确性、有效性、完整性
3.分类
约束 | 描述 | 关键字 |
---|---|---|
非空约束 | 限制该字段的数据不能为null | NOT NULL |
唯一约束 | 保证该字段所有的数据都是唯一不重复的 | UNIQUE |
主键约束 | 主键是一行数据的唯一标识,要求非空且唯一 | PRIMARY KEY |
默认约束 | 保存数据时,如果未指定该字段的值,则采用默认值 | DEFAULT |
检查约束 | 保证字段值满足某一个条件 | CHECK |
外键约束 | 用来让两张表的数据之间建立连接,保证数据的一致性很完整性 | FOREIGN KEY |
注意:约束是作用于表中字段的,可以在创建/修改表的时候添加约束
约束演示
案例:根据表中需求完成表结构的创建
外键约束
概念:用来让两张表的数据之间建立连接,保证数据的一致性很完整性
语法:
外键约束---删除/更新行为
语法:
(前面为添加主键语法,红框为在删除/更新时的做法)
约束总结
多表查询
多表关系
多表查询概述
内连接
外连接
自连接
子查询
多表查询案例
多表关系
概述:
项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由 于业务之间的相互关联,所以各个表结构之间也存在各种关系,基本分三种:
一对多(多对一)
一对一
多对多
多表查询
概述:指从多张表中查询数据
迪克尔积:迪科尔乘积指在数学中,两个集合的所有组成情况(在多表查询中,需要消除迪科尔积)
多表查询分类:
连接查询
内连接:相当于查询两个集合的交集部分
外连接:
左外连:查询左表所有数据及交集部分数据
右外连:查询右表所有数据及交集部分数据
自连接:当前表与自己的连接查询,自连接必须使用表别名
子查询
连接查询---内连接
内连接返回的数据是两个集合的交际部分
内连接查询语法:
隐式内连接语法:
SELECT 字段名 FROM 表1,表2 WHERE 条件...;
显式内连接语法:
SELECT 字段名 FROM 表1 INNER JOIN 表2 ON 条件...;
练习:
连接查询---外连接
外连接查询语法:
左外连接:
SELECT 字段名 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件...;
(左外连接包含左表全部数据以及两表的交集部分的数据)
右外连接:
SELECT 字段名 FROM 表1 RIGHT[OUTER] JOIN 表2 ON 条件...;
(右外连接包含右表全部数据以及两表的交集部分的数据)
练习:
多表查询---自连接
自连接查询语法:
SELECT 字段名 FROM 表1 别名1 JOIN 表1 别名2 ON 条件...;
(自连接查询,可以是内连接,也可以是外连接查询)
练习:
联合查询---union,nuion all
对于union查询,就是把多次查询的结果合并起来,形成一个新的查询结果集
语法:
SELECT 字段名 FROM 表1 ...
UNION [ALL]
SELECT 字段名 FROM 表2 ...;
练习:
子查询
概念:SQL语句中嵌套SELECT语句,称为嵌套查询,又称子查询
语法:
SELECT * FROM 表名 WHERE 字段 = (SELECT 字段 FROM 表2)
(子查询的外部可以是增删改查中任何一个)
根据子查询结果的不同可分为:
标量子查询(子查询返回结果为单个值)
列子查询 (子查询返回结果为一列)
行子查询 (子查询返回结果为一行)
表子查询 (子查询返回结果为多行多列)
根据子查询位置的不同分为:where之后,from之后,select之后
子查询---标量子查询
标量子查询:子查询返回结果为单个值(数字、字符串、日期等),最简单的形式
常见的操作符:= 、<>、<、<= 、>、>=
案例:
子查询---列子查询
列子查询:子查询返回结果为一列(可以是多行)
常用操作符:IN、NOT IN、ANY、SOME、ALL
操作符 | 描述 |
---|---|
IN | 在指定的集合之内,多选一 |
NOT IN | 不在指定的范围集合之内 |
ANY | 子查询返回列表中,有任意一个满足即可 |
SOME | 与ANY相同,使用SOME的地方都可以使用ANY |
ALL | 子查询返回的列表的所有值都必须满足 |
案例:
子查询---行子查询
行子查询:子查询返回结果为一行(可以是多列)
常用操作符:=、<>、IN、NOT IN
案例:
自查询---表子查询
表子查询:子查询返回结果为多行多列
常用操作符:IN
案例:
多表查询练习
多表查询总结
事务
事务简介
事务操作
事务四大特性
并发事务问题
事务隔离级别
事务简介
事务:事务是一组操作的集合,他是一个不可分割的工作单位,事务会把所有操作作为一个整体一起向系统进行提交或撤销操作请求,这些操作要么同时成功,要么同时失败。
事务操作
查看事务:select @@autocommit; (结果为1:自动提交 0:手动提交)
设置事务:set @@autocommit = 0; (1:自动提交 0:手动提交)
提交事务:commit;
事务回滚:rollback;
开启事务:start transaction; (不需要设置事务状态)
事务的四大特性
原子性:事务是不可分割的最小单元,要么全部成功,要么全部失败
一致性:事务完成时,必须是所有的数据保持一致状态
隔离性:数据库系统提供隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
持久性:事务一旦提交或回滚,对数据库中数据的改变是永久的
并发事务问题
问题 | 描述 |
---|---|
脏读 | 一个事务读取到另一个事务还没提交的数据 |
不可重复读 | 一个事务先后读取同一条记录,但两次读取的数据不同, |
幻读 | 一个事务按照条件查询数据时,没有对应的数据行,但在插入数据时,发现数据已经存在,好像出现了‘幻影’ |
事务隔离级别