赞
踩
安装提示:安装过程中可能会出现:
Database initialization failed.
Ended configuration step: Initializing database (may take a long time)
解决方法见网址:https://blog.csdn.net/MMTS_yang/article/details/106712484?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167652992816800184127166%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=167652992816800184127166&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~pc_rank_34-1-106712484-null-null.142v73pc_new_rank,201v4add_ask,239v1insert_chatgpt&utm_term=Failed%20to%20start%20process%20for%20MySQL%20Server%208.0.32.%20Database%20initialization%20failed.&spm=1018.2226.3001.4187
关系型数据库:简而言之使用一个二维表来存储数据
启动方法
1.运行输入:services.msc
2.命令行输入:net start(停止改为stop) mysql80
客服端连接:
1.MySQL自带客户端命令行工具:cilent(如果遇到启动客户端闪退的情况,一般是缺失my,ini文件,具体解决方法参考文章:https://devpress.csdn.net/devcloud/63be5c5d80b9983378cda757.html?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2defaultYuanLiJiHuaactivity-3-127988332-blog-72571128.pc_relevant_recovery_v2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2defaultYuanLiJiHuaactivity-3-127988332-blog-72571128.pc_relevant_recovery_v2&utm_relevant_index=4)
2.系统自带命令行工具:mysql -u root -p(需path环境配置:
C:\Program Files\MySQL\MySQL Server 8.0\bin)
问题:这种方法可能会出现环境变量太大的问题,此问题未解决。
通用语法
SQL语句可以单行或多行书写,以分号结尾
SQL语句可以使用空格/缩进来增强语句可读性
MySQL数据库的SQL语句不区分大小写,关键字建议使用大写
注释
单行注释:–注释内容或#注释内容(MySQL特有)
多行注释:/* 注释内容 */
分类:
1.DDL:数据定义语言
2.DML:数据修改语言(增加删除等)
3.DQL:数据查询语言
4.DCL:数据控制语言(访问权限等)
1.DDL-数据库操作
查询:
查询所有数据库(返回该连接下所有数据库的名称):SHOW DATABASES;查询当前数据库(返回当前数据库名称):SELECT DATABASE();–本质是一个函数调用
创建:CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARSET 字符集] [COLLATE 排序规则];
删除:DROP DATABASE [IF EXISTS] 数据库名;
使用 :USE 数据库名;–使用(选中)该数据库
2.DDL-表操作
SHOW TABLES;–查询当前数据库所有的表
DESC 表名;–查询表结构
SHOW CREATE TABLE 表名;–查询指定表的建表语句(sql语句)
CREATE TABLE 表名(
字段1 字段1类型[COMMENT 字段1注释],
字段2 字段2类型[COMMENT 字段2注释],
......
字段n 字段n类型[COMMENT 字段3注释]
)[COMMENT 表注释];–创建表
ALTER TABLE 表名 ADD 字段名 类型(长度) [COMMENT 注释] [约束];–在表中添加一个新字段
ALTER TABLE 表名 MODIFY 字段名 新数据类型;–修改字段的数据类型
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型 [COMMENT 注释][约束];–修改字段名和字段类型
ALTER TABLE 表名 DROP 字段名;–删除字段
ALTER TABLE 表名 RENAME TO 新表名;–修改表名
DROP TABLE [IF EXISTS] 表名;–删除表
TRUNCATE TABLE 表名;–删除指定表,并重新创建该表(相当于清空表中数据)
常见数据类型:
链接: link
DML(数组操纵语言)
1、往表中插入数据
全表插入格式(值的数量必须要和顺序要和表的字段相同):insert into 表名 values(值1,值2);
指定字段插入格式(可以只写需要插入字段的值):insert into 表名(字段1名,字段2名) values(值1,值2);
举例:
insert into person values(”tom”,18);
insert into person(name) values(”jerry”);
批量插入
insert into person values(’aaa’,10),(’bbb’,20),(’ccc’,30);
insert into person(name) values(’aaa’),(’bbb);
2、删除数据
格式:delete from 表名 where 条件;
举例:
delete from person where name=”张飞”;
delete from person where age<30;
3、修改数据
格式:update 表名 set 字段名=值 where 条件;
举例:
update person set age=88 where name=’刘备’;
update person set name=’张飞’,age=18 where name=’关羽’;
update person set name=’黎明’ where age=5;
关键字 SELECT
字段列表
FROM
表名列表
WHRER
条件列表
GROUP BY
分组字段列表
HAVING
分组后条件列表
ORDER
排序字段列表
LIMIT
分页参数
1.DQL-基本查询
1.1查询多个字段
SELECT 字段1,字段2,字段3···From 表名;
1.2设置别名
SELECT 字段1[AS 别名1],字段2[AS 别名2]···From 表名;
1.3去除重复记录
SELECT DISTINCT 字段列表 FROM 表名;
2.DQL-条件查询
SELECT 字段列表 FROM 表名 WHERE 条件列表
运算符 | 说明 |
---|---|
= | 等于 |
<>或!= | 不等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
between …and …. | 位于两者之间,,等同于 >= and <= |
is null | 为 null(is not null 不为空) |
and | 并且 |
or | 或者 |
in | 包含,相当于多个 or(not in 不在这个范围中) |
not | not 可以取非,主要用在 is 或 in 中 |
like | like 称为模糊查询,支持%或下划线匹配,%匹配任意个字符,一个下划线只匹配一个字符注:Like 中的表达式必须放到单引号或双引号中 |
3.DQL-聚合函数
概念:将一列数据作为一个整体,进行纵向计算
常见聚合函数:
函数 | 功能 |
---|---|
count | 统计数量 |
max | 最大值 |
min | 最小值 |
avg | 平均值 |
sum | 求和 |
语法:
SELECT 聚合函数(字段列表)FROM 表名;
注:null不参与运算。
4.DQL-分组查询
语法:
SELECT 字段列表 FROM 表名[WHERE 条件] GROUP BY 分组字段名 [HAVING 分组后过滤条件];
where与having 区别:
(1)执行时机不同:where 是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
(2)判断条件不同:where 不能对聚合函数进行判断,而having可以。
例:查询年龄小于45岁的员工,并根据工作地址分组,获取员工数量大于等于3 的工作地址。
select workaddress count() ,address- count from emp where age<45 group by workaddress having address-count()>=3;
注意:
执行循序:where>聚合函数>having
分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段没有意义。
5.DQL-排序查询
语法:
SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1,字段2 排序方式2;
排序方式:
(1)ASC :升序(默认值)
(2)DESC:降序
注意: 如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。
6.DQL-分页查询
语法:
SELECT 字段列表 FROM 表名 LIMIT 起始索引,查询记录数;
注意
(1)起始索引从0开始,起始索引=(查询页码-1)*每页显示记录数。
(2)分页查询是数据库的方言,不同的数据库有不同的实现,mysql中是LIMIT。
(3)如果查询的是第一页数据,起始索引可以省略,直接简写为limit 10.
7.DQL-执行顺序
编写顺序;select–>from–>where–>group by–>having–>order by–>limit
执行顺序:FROM–>where–>group by–>having–>select–>order by–>limit
1.DCL-管理用户
1,1查询用户
select * from mysql.user;
1.2创建用户
create user ‘用户名’@‘主机名’ identified by ‘密码’;
例:create user ‘user’@‘%’ identified by ‘123456’;(可以在任意主机中访问)
1.3修改用户密码
alter user ‘用户名’@‘主机名’ identified with mysql_native_password by’新密码’;
1.4删除用户
drop user ‘用户名’@‘主机名’;
注意:
(1)在MySQL需要用户名@主机名的方式,来唯一标识一个用户
(2)主机名可以使用 % 任意匹配
(3)主要由DBA(数据库管理员)使用
2.DCL-权限控制
常用权限:
常用权限 | 说明 |
---|---|
all,all privileges | 所有权限 |
select | 查询数据 |
insert | 插入数据 |
update | 修改数据 |
delete | 删除数据 |
alter | 修改表 |
drop | 删除数据库/表/视图 |
creat | 创建数据库/表 |
语法使用
查询权限:show grants for ‘用户名’ @ ‘主机名’;
授予权限:grant 权限列表 on 数据库名.表名 to ‘用户名’ @ ‘主机名’;
撤销权限:revoke 权限列表 on 数据库名.表名 from ‘用户名’ @ ‘主机名’;
注意:
(1)多个权限之间,使用逗号分隔
(2)授权时,数据库名和表明可以使用 * 进行通配,代表所有
简述:mysql基础——函数,约束部分
函数 | 功能 |
---|---|
CONCAT() | 字符串拼接 |
LOWER(str) | 将字符串str全部转换为小写 |
UPPER(str) | 将字符串str全部转换为大写 |
LPAD(str,n,pad) | 用字符串pad对str的左边进行填充,达到n个字符长度 |
RPAD(str,n,pad) | 用字符串pad对str的右边进行填充,达到n个字符长度 |
TRIM(str) | 去掉字符串头部和尾部空格 |
SUBSTRING(str,start,len) | 返回字符串str从start位置起的len个字符串长度 |
案例:员工编号长度为5位数,不足的用0填充,例1号员工号为00001.
update emp set worknum=lpad(worknum,5,‘0’);
函数 | 功能 |
---|---|
CEIL(x) | 向上取整 |
FLOOR(x) | 向下取整 |
MOD(x,y) | 返回x/y的模 |
RAND() | 返回0-1内随机数 |
ROUND(x,y) | 求参数x的四舍五入的值,保留y位小数 |
案例:生成一个六位数的随机验证码
select lpad(round(rand()*1000000,0),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(curdate(),entrydate()))as ‘entrydates’ from temp order by entrydates desc;
函数 | 功能 |
---|---|
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默认值 |
案例:查询emp表中的员工姓名和工作地址(北京上海为一线城市,其他为二线城市)
select
name,
(case workaddress when ‘北京’ then ‘一线城市’ when ‘上海’ then ‘一线城市’ else ‘二线城市’ end )as ‘工作区域’
from emp;
概念:一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性。MySQL数据库通过约束(constraints)防止无效的数据进入到表中,以保护数据的实体完整性。
六大约束:
非空/not null :保证字段值不能为空
默认/default:保证该字段有默认值
唯一/unique :保证该字段的值具有唯一性,可以为空
检查/check :根据check条件筛选
主键/primary key :保证该字段的值具有唯一性,并且非空
外键/foreign key :用于限制两表的关系,保证该字段的值必须来自于主表的关联列的值
案例:
creat table user(
id int primary key auto_increment comment '主键',
name varchar(10) not null unique comment '姓名',
age int check (age>0&&age<=120) comment '年龄',
status char(1) default '1' comment '状态',
gender char(1) comment '性别'
)comment '用户表';
--插入数据
insert into user(name,age,status,gender) values ('Tom1',19,'1','男'),('Tom2',29,'0','男');
insert into user(name,age,,gender) values ('Tom5',19,,'男');
MySQL外键约束(FOREIGN KEY)
MySQL 外键约束(FOREIGN KEY)用来在两个表的数据之间建立链接,它可以是一列或者多列。一个表可以有一个或多个外键。
外键对应的是参照完整性,一个表的外键可以为空值,若不为空值,则每一个外键的值必须等于另一个表中主键的某个值。
外键是表的一个字段,不是本表的主键,但对应另一个表的主键。定义外键后,不允许删除另一个表中具有关联关系的行。
外键的主要作用是保持数据的一致性、完整性。例如,部门表 tb_dept 的主键是 id,在员工表 tb_emp5 中有一个键 deptId 与这个 id 关联。
主表(父表):对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表。
从表(子表):对于两个具有关联关系的表而言,相关联字段中外键所在的表就是从表。
添加外键
[CONSTRAINT <外键名>] FOREIGN KEY (外键字段名) REFERENCES 主表 (主键列名);
alter table 表名 add constraint 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表 (主键列名);
删除外键
alter table emp drop foreign key fk_emp_dept_id;
删除/更新行为
行为 | 说明 |
---|---|
NO ACTION | 在父表中删除/更新记录时,首先检查记录中是否有外键,有则不允许删除/更新 |
RESTRICT | 当在父表中删除/更新记录时,首先检查记录中是否有外键,有则不允许删除/更新 |
CASCADE | 当在父表中删除/更新记录时,首先检查该记录是否有对应的外键,如果有,则也删除/更新外键在子表中的记录 |
set NULL | 当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中外键值为null |
set default | 父表变更时,子表将外键列设置成一个默认的值(Innodb不支持) |
## cascade fk_表名_字段名(外键名称)
alter table 表名 add constraint 外键名称 foreign key(外键字段) references 主表名(主表字段) on update cascade on delete cascade ;
简述:基础部分多表查询 事务知识
表之间的关系:
一对多 案例:一个员工对应多个部门。
多对多 案例:一个学生选多门课程,一个课程可以被多名学生选。
一对一 案例: 一个人只对应一条学历信息。
概念:从多张表中查询数据。
笛卡尔积:
笛卡尔积为两个集合(两张表)中的每条数据进行两两组合的结果
在多表查询时会产生笛卡尔积,要通过添加条件消除笛卡尔积。
分类:
1.内连接:
相当于查询AB的交集部分
语法:
# 隐式内连接
select 字段列表 from 表1,表2 where 条件;
# 显示内连接
select 字段列表 from 表1 [inner] join 表2 on 连接条件;
2.外连接:
2.1 左外连接:
查询A的所有数据,同时拼接上B对应的数据
2.1 右外连接:
查询B的所有数据,同时拼接上A中对应的数据
语法:
# 左外连接
select 字段列表 from 表1 left [outer] join 表2 on 条件;
# 右外连接
select 字段列表 from 表1 right [outer] join 表2 on 条件;
左右外连接可以相互转化。
3.自连接:
表与自身连接查询
自连接必须给表取别名
语法:
select 字段列表 from 表a 别名a join 表a 别名b on 条件;
4.联合查询
union、union all
对于联合查询就是把多次查询的结果合并起来,形成一个新的查询结果集。
语法:
select 字段列表 from 表a
union [all]
select 字段列表 from 表b
注意:去除重复部分就不添加all。
5.子查询
概念:SQL语句中嵌套select语句为嵌套查询,又称子查询。子查询外的语句可以是insert、update、delete、select中的一个。
select * from 表1 where 字段=(select 字段 from 表2);
分类:
根据子查询结构不同分为:
标量子查询:子查询的结果为单个值
列子查询:子查询的结果为一列
行子查询:子查询的结果为一行
表子查询:子查询的结果为多行多列
根据子查询的位置分为:
where之后
from之后
select之后
5.1 标量子查询
子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式,这种子查询称为标量子查询
常用符号:=、<>、>、>=、<、<=
案例:
# 根据销售部门的id查询员工信息
# 先查询销售部门的id
select id from dept where name='销售部'; #id为4
# 再查询销售部门中员工的信息
select * from emp where dept_id=4;
# 合并为一个查询
select * from emp where dept_id=(select dept.id from dept where dept.name='销售部' );
5.2 列子查询
子查询的结果为一列(可以是多行)的,这种子查询为列子查询
常用操作符:
操作符 | 描述 |
---|---|
IN | 在指定的集合范围内多选一 |
NOT IN | 不在指定的集合范围内 |
ANY | 子查询返回列表中,有任意个满足即可 |
SOME | 与ANY等同 |
ALL | 子查询返回列表的所有值都必须满足 |
案例: |
# 列子查询
# 查询销售部和市场部的所有员工信息
# 查询销售部和市场部的id
select id from dept where name='销售部' or name='市场部'; #id为2 4
# 查询两个部门的所有员工
select * from emp where dept_id in (2,4);
# 合并
select * from emp where dept_id in (select id from dept where name='销售部' or name='市场部');
5.3 行子查询
子查询返回的结果是一行(可以是多列),这种子查询为行子查询
常用操作符:=、<>、in、not in
案例:
# 查询与张无忌的薪资及直属领导相同的员工信息
# 查询张无忌的薪资和直属领导
select salary, managerid from emp where name='张无忌';
# 查询与张无忌的薪资及直属领导相同的员工信息
select * from emp where (salary,managerid)=(select salary, managerid from emp where name='张无忌');
5.4 表子查询
子查询的结果是多行多列这种查询为表子查询
常用操作符:in
案例:
# 查询与鹿杖客和宋远桥的职位和薪资相同的员工信息
select * from emp where (job, salary) in ( select job, salary from emp where name in ('鹿杖客', '宋远桥'));
# 查询入职日期是’2006-01-01‘之后的员工信息和部门信息
# 先查询出入职在’2006-01-01‘之后员工的所有信息
# 与部门表左连接
select e.*, dept.* from (select * from emp where entrydate>'2006-01-01') e left outer join dept on e.dept_id=dept.id;
摘要;基础部分——事务相关知识
概念:事务是一组操作的集合,这组操作,要么全部执行成功,要么全部执行失败
事务操作
START TRANSACTION;--开启事务
COMMIT/ROLLBACK;-- 提交/回滚事务
事务四大特性
原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)
事务的四个特性(ACID)
原子性(Atomicity):指事务是一个不可分割的最小工作单位,事务中的操作只有都发生和都不发生两种情况
一致性(Consistency):事务必须使数据库从一个一致状态变换到另外一个一致状态,举一个栗子,李二给王五转账50元,其事务就是让李二账户上减去50元,王五账户上加上50元;一致性是指其他事务看到的情况是要么李二还没有给王五转账的状态,要么王五已经成功接收到李二的50元转账。而对于李二少了50元,王五还没加上50元这个中间状态是不可见的。
隔离性(Isolation):一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(Durability):一个事务一旦提交成功,它对数据库中数据的改变将是永久性的,接下来的其他操作或
并发事务问题
脏读、不可重复读、幻读
脏读:对于两个事务T1,T2,T1读取了已经被T2更新但还没有被提交的字段之后,若T2回滚,T1读取的内容就是临时且无效的
不可重复读 :对于两个事务T1,T2,T1读取了一个字段,然后T2更新了该字段之后,T1在读取同一个字段,值就不同了
幻读:对于两个事务T1,T2,T1在A表中读取了一个字段,然后T2又在A表中插入了一些新的数据时,T1再读取该表时,就会发现神不知鬼不觉的多出几行了…
事务隔离级别
1.read uncommitted(读未提交数据):允许事务读取未被其他事务提交的变更。(脏读、不可重复读和幻读的问题都会出现)。
2. read committed(读已提交数据):只允许事务读取已经被其他事务提交的变更。(可以避免脏读,但不可重复读和幻读的问题仍然可能出现)
3.repeatable read(可重复读):确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新(update)。(可以避免脏读和不可重复读,但幻读仍然存在)
4. serializable(串行化):确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入、更新和删除操作,所有并发问题都可避免,但性能十分低下(因为你不完成就都不可以弄,效率太低
READ UNCOMMITTED、READ COMMITTED REPEATABLE READ SERIALIZABLE
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。