当前位置:网站首页>MySql数据库
MySql数据库
2022-08-03 05:09:00 【*super】
一、数据库基础
1.数据库简介
2.卸载MySql
此电脑(右键)-->服务和应用程序-->服务-->MySQL停用-->控制面板-->MySQL Server卸载-->进入MySQL安装目录删除my.ini文件-->C盘查找ProgramData-->删除MySQL目录-->卸载完毕!
3.安装MySql
安装文件(安装程序见百度网盘CSDNC4文件夹)
4.连接数据库
(1)此电脑(右键)-->服务和应用程序-->服务-->MySQL启用
(2)mysql -u用户名 -p密码
(3)mysql -hip 地址 -u 用户名 -p 密码
(4)退出:quit或exit
注意:localhost=127.0.0.1
5.基础概念
使用Navicat for Mysql工具连接:
(1)使用SSH隧道
主机:服务器IP
端口:22
用户名:实例用户名
密码:实例密码
(2)常规连接
连接名:随意
主机:localhost
端口:3306
用户名:数据库用户名
密码:数据库密码
二、数据库操作
1.定义
SQL:结构化查询语言。
DDL:数据定义语言,如:建库,建表。
DML:数据操纵语言,如:对表中的记录操作增删改。
DQL:数据查询语言,如:对表中的查询操作。
DCL:数据控制语言,如:对用户权限的设置。
2.语法
(1)DDL操作数据库
--DDL操作数据库
--创建数据库
CEATE DATABASE (IF NOT) db1;
--查看所有数据库
SHOW DATABASES;
--修改db1的字符集为utf8
ALTER DATABASE db1 CHARACTER SET utf8;
--删除数据库
DROP DATABASE db1;
--查看正在使用的数据库
SELECT DATABASE();
--切换数据库
USE db2;
(2)DDL操作表
--DDL操作表
--创建一个表
CREATE TABLE student(
id INT,
name VARCHAR(50),
birthday DATE
);
--查看数据库中所有表
SHOW TABLE;
--查看表结构
DESC student;
--查看创建表的SQL语句
SHOW CREATE TABLE student;
--创建一个和student表结构相同的表s1
CREATE TABLE s1 LIKE student;
--删除表
DROP TABLE (IF EXISTS ) s1;
(3)DML操作表中数据(增删改查)
--and = && or = || not = ! in用法 HAVING用法
--插入数据
--1、所有的字段名都写出来
INSERT INTO 表名 (字段名1,字段名2,字段名3...)VALUES(值1,值2,值3);
--2、不写字段名
INSERT INTO 表名 VALUES(值1,值2,值3...);
--3、插入部分数据
INSERT INTO 表名 (字段名1,字段名2,...) VALUES(值1,值2,...);
--蠕虫复制(两张表结构要相同)
INSERT INTO s1 SELECT * FROM studeht;
--修改数据
UPDATE 表名 SET 字段 = 值;
UPDATE 表名 SET 字段 = 值 WHERE id=1;--条件修改
UPDATE 表名 SET 字段 = 值,字段 = 值 WHERE id=2;--多字段修改
--删除数据
DELETE FROM 表名 WHERE id=1;--条件删除
DELETE FROM 表名;--删除所有记录
--将表删除再重新创建一张相同结构的表
TRUNCATE TABLE s1;
--查询数据
SELECT * FROM 表名;
SELECT 字段名,字段名 FROM 表名;
SELECT * FROM 表名 WHERE id=1; --条件查询
SELECT 字段名 AS 别名,字段名 AS 别名 FROM 表名 AS 别名; --起别名
SELECT DISTINCT 字段名 FROM 表名; --去重
SELECT 字段名+5 FROM 表名; --计算
--条件查询
--1、查询math分数大于80分的学生
SELECT * FROM student WHERE math>80;
--2、查询english分数小于或等于80分的学生
SELECT * FROM student WHERE english<= 80 ;
--3、查询age等于20岁的学生
SELECT* FROM student WHERE age = 20;
--4、-查询age 不等于20岁的学生,注:不等于有两种写法
SELECT * FROM student WHERE age<>20;
SELECT * FROM student WHERE age!=20;
--5、查询age大于35且性别为男的学生(两个条件同时满足
SELECT * FROM student WHERE age>35 AND sex ='男';
--6、查询id是1或3或5的学生两种写法or和in
SELECT * FROM student WHERE id= 1 OR id = 3 OR id = 5;
SELECT * FROM student WHERE id (not) IN(1,3,5);
--7、查询english成绩大于等于75,且小于等于90的学生
SELECT * FROM student WHERE english BETWEEN 75 AND 90;
--8、模糊查询
SELECT * FROM student WHERE NAME LIKE '张%';
SELECT * FROM student WHERE NAME LIKE '%张%';
SELECT * FROM student WHERE NAME LIKE '%张';
SELECT * FROM student WHERE NAME LIKE '张_';
SELECT * FROM student WHERE NAME LIKE '_张_';
--排序
--查询所有数据,使用年龄降序排序 单列排序
SELECT * FROM student ORDER BY age ASC;--升序
SELECT * FROM student ORDER BY age DESC;--降序
--组合排列
--查询所有数据,在年龄降序排序的基础上,如果年龄相同再以数学成绩升序排序
SELECT * FROM student ORDER BY age DESC,math ASC;
--聚合函数 max min avg count sum
--查询学生总数
SELECT COUNT(*) AS 别名 FROM student;
--查询id字段,如果为null,则使用0代替
SELECT IFNULL(id, 0) FROM stdent;
--分组查询
--按性别进行分组
SELECT * FROM student GROUP BY sex;
--查询年龄大于25岁的人,按性别分组,统计每组的人数
SELECT sex AS 性别, COUNT(*) 人数 FROM student WHERE age>25 GROUP BY sex;
--查询年龄大于25岁的人,按性别分组,统计每组的人数,并只显示性别人数大于2的数 HAVING
SELECT sex AS 性别, COUNT(*) 人数 FROM student
WHERE age>25 GROUP BY sex HAVING COUNT(*)>2;
--limit语句 限制查询条数
--查询学生表中数据,从第3条开始显示,显示6条
SELECT * FROM student LIMIT 2,6;
3.备份与还原
方式一:
CMD下备份:mysqldump -u用户名 -p密码 db1>d:/db1.sql
CMD下还原:
mysql -u用户名 -p密码;
use db1;
d:/db1.sql;
方式二:
使用Navicat for Mysql工具进行操作。
4.表内事项
(1)主键约束
主键 primary key 唯一、非空、一般为id
CREATE TABLE st5(
id INT PRIMARY KEY,
NAME vARCHAR(50)
);
ALTER TABLE st5 ADD PRIMARY KEY(id);--后补主键
CREATE TABLE st5(
id INT PRIMARY KEY AUTO_INCREMENT,--id自增
NAME vARCHAR(50)
);
唯一 unique
非空 not null
CREATE TABLE st7(
id INT,
NAME VARCHAR(50) UNIQUE --可以为null
);
CREATE TABLE st8(
id INT,
NAME VARCHAR(50) NOT NULL --不可以为null
adress VARCHAR(100) DEFAULT '北京' --默认地址为北京
);
外键 foreign key
CREATE TABLE emp (
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR (30) ,
age INT,
dep_name VARCHAR(30) ,
dep_location VARCHAR(30)
);
CREATE TABLE department(
id INT PRIMARY KEY AUTO_INCREMENT,
dep_name VARCHAR(20) ,
dep_locatidhVARCHAR(20)
);
CREATETABLE employee(
id INT PRIMARYKEYATTO_INCREMENT,
NAMEVARCHAR(20) ,
age INT,
dep_id INT --外键对应主表的主键
);
--id 主键 dep_id 外键
--外键约束
CREATETABLE employee(
id INT PRIMARYKEYATTO_INCREMENT,
NAMEVARCHAR(20) ,
age INT,
dep_id INT
CONSTRAINT emp_depid_fk FOREIGN KEY(dep_id) REFERENCES department(id)
);
-—删除外键约束
ALTER TABLE employee DROP FORETGN KEY emp_depid_fk;
--添加外键约束
ALTER TABLE employee ADD CONSTRAINT emp_depid_fk
FOREIGN KEY(dep_id) REFERENCES department(id);
检查约束 check 注:mysql不支持
(2)级联更新和级联删除
即:主外键同步更新
CREATE TABLE employee(
id INT PRIMARY KEY AUTOINCREMENT,
NAME VARCHAR(50),
age INT,
dep_id INT,
CONSTRAINT emp_depid_fl FOREIGN KEY(dep_id) REFERBNCES department(id) ON UPDATE
CASCADE ON DELETE CASCADE
);
(2)表之间关系
一对一、一对多、多对多
多对多(m:n)例如:老师和学生,学生和课程,用户和角色
多对多关系建表原则:需要创建第三张表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键。
(3)三大范式
1NF:数据库表的每一列都是不可分割的原子数据项,不能是集合、数组等非原子数据项。即表中的某个列有多个值时,必须拆分为不同的列。简而言之,第一范式每一列不可再拆分,称为原子性。
2NF:在满足第一范式的前提下,表中的每一个字段都完全依赖于主键。所谓完全依赖是指不能存在仅依赖主键一部分的列。简而言之,一个表不能出现一列以上主键列。当存在一个复合主键包含多个主键列的时候,才会发生不符合第二范式的情况。比如有一个主键有两个列,不能存在这样的属性,它只依赖于其中一个列,这就是不符合第二范式。
3NF:在满足第二范式的前提下,表中的每一列都直接依赖于主键,而不是通过其它的列来间接依赖于主键。简而言之,第三范式就是所有列不依赖于其它非主键列,也就是在满足2NF 的基础上,任何非主列不得传递依赖于主键。所谓传递依赖,指的是如果存在"A→B→C"的决定关系,则C传递依赖于A。因此,满足第三范式的数据库表应该不存在如下依赖关系:主键列→非主键列x→非主键列y。
(4)多变查询和内外连接、子查询
--迪卡尔积
SELECT * FROM emp, dept
--内连接查询(隐式内连接)
SELECT * FROM emp, dept WHERE emp.dept_id = dept.id;
--内连接查询(显式内连接)
SELECT * FROM emp INNER JOIN dept ON emp.dept_id = dept.id;
--左外连接(注意表顺序)dept(左表)全显示
SELECT * FROM dept LEFT JOIN emp ON emp.dept_id = dept.id;
--右外连接(注意表顺序)emp(右表)全显示
SELECT * FROM dept RIGHT JOIN emp ON emp.dept_id = dept.id;
--关于子查询:
--查询开发部中有哪些员工
--1.查询开发部的部门id
SELECT id FROM dept WHERE NAME='开发部';
--2.查询出部门id为1的员工
SELECT * FROM emp WHERE dept_id = 1;
-—子查询
SELECT* FROM emp WHERE dept_id = ( SELECT id FROM dept WHERE NAME = '开发部')
5.表外事项
(1)事务
在实际的开发过程中,一个业务操作如:转账,往往是要多次访问数据库才能完成的。转账是一个用户扣钱,另一个用户加钱。如果其中有一条SQL语句出现异常,这条SQL就可能执行失败。事务执行是一个整体,所有的SQL语句都必须执行成功。如果其中有1条SQL语句出现异常,则所有的SQL语句都要回滚,整个业务执行失败。
手动提交:start transaction(开启事务)---执行语句---commit(提交)/rollback(回滚)
自动提交:
查看是否开启自动提交:select @@autocommit 若为1则开启。
取消自动提交:set @@autocommit=0;
(2)事务的原理
(3)回滚点
start transaction; 开启事务
sql语句; 执行语句
savepoint roll; 建立回滚点
sql语句; 执行语句
rollback to roll; 回滚
(4)事务隔离级别
事务的四大特性:
原子性:每个事务都是一个整体,不可再拆分,事务中所有的SQL语句要么都执行成功,要么都失败。
一致性:事务在执行前数据库的状态与执行后数据库的状态保持一致如∶转账前2个人的总金额是2000,转账后2个人总金额也是2000(一致性的规则是自己定义的)。
隔离性:事务与事务之间不应该相互影响,执行时保持隔离的状态。
持久性:一旦事务执行成功,对数据库的修改是持久的,就算关机,也是保存下来的。
事务在操作时的理想状态:所有的事务之间保持隔离,互不影响。因为并发操作,多个用户同时访问同一个数据。可能引发并发访问的问题:
脏读:一个事务读取到了另一个事务中尚末提交的数据。
不可重复读:事物一读取到了age的值20,事物二将该值修改成了28﹐事物一再次读取age的值28,事物一两次读取的aqe值不一致。
幻读:事物一读取到A表中有一条记录,事物二往A表中插入一条记录,事物一再次读取的时候记录变成了两条,就像发生幻觉一样。
事务隔离级别:
级别 | 名字 | 隔离级别 | 脏读 | 不可重复读 | 幻读 | 数据库默认隔离级别 |
1 | 读未提交 | read uncommitted | 是 | 是 | 是 | |
2 | 读已提交 | read committed | 否 | 是 | 是 | Oracle和SQL Server |
3 | 可重复读 | repeatable read | 否 | 否 | 是 | MySQL |
4 | 串行化 | serializable | 否 | 否 | 否 |
(5)问题解决
脏读问题解决:
更改隔离级别为读已提交:set global transaction isolation level read comamitted;
不可重复读解决:
更改隔离级别为读已提交:set global transaction isolation level repeatable read;
串行化:
更改隔离级别为最高:set global transaction isolation level serializable;
6.DCL---用户操作
创建用户:格式-->create user '用户名' @'数据库范围' identified by '密码';
create user ' user1' @'localhost' identified by '123'; 本机数据库
create user ' user2' @'%' identified by '123'; 任意数据库
授权:格式-->grant 权限 on 数据库名.表名 to '用户名'@'数据库范围';
grant create, delete, insert, select, update on db1.* to 'user1'@'localhost';
撤销授权:格式-->revoke all on 数据库名.表名 to '用户名'@'数据库范围';
revoke all on db1.* to 'user1'@'localhost';
修改管理员密码:格式-->mysqladmin -u用户名 -p password 原密码
mysqladmin -uroot -p password 1234567
修改用户密码:格式-->set password for '用户名'@'数据库范围'=password('修改后的密码') ;
set password for 'user1'@'localhost'=password('666666') ;
边栏推荐
- presto安装部署教程
- 业务表解析-余额系统
- Kotlin-Flow常用封装类:StateFlow的使用
- idea使用@Autowired注解爆红原因及解决方法
- Interface test Mock combat (2) | Combined with jq to complete batch manual Mock
- Online password generator tool recommendation
- 【HMS core】【Ads Kit】Huawei Advertising——Overseas applications are tested in China. Official advertisements cannot be displayed
- 【Harmony OS】【ARK UI】ets use startAbility or startAbilityForResult to invoke Ability
- IO进程线程->线程->day5
- C# async and multithreading
猜你喜欢
CobalStrike(CS)基础超级详细版
【Harmony OS】【ARK UI】ETS 上下文基本操作
Build your own web page on raspberry pie (1)
接口和协议
探索性测试的概念及方法
阿里云对象存储oss私有桶生成链接
超好用的画图工具推荐
CAD有生僻字如何打出来、如何提交软件相关问题或建议?
Harmony OS ets ArkUI 】 【 】 the development basic page layout and data connection
荧光标记多肽FITC/AMC/FAM/Rhodamine/TAMRA/Cy3/Cy5/Cy7-Peptide
随机推荐
业务表解析-余额系统
High availability, two locations and three centers
UV 裂解的生物素-PEG2-叠氮|CAS:1192802-98-4生物素接头
UV decomposition of biotin - PEG2 - azide | CAS: 1192802-98-4 biotin connectors
数字孪生园区场景中的坐标知识
Install PostgreSQL on Windows
C#异步和多线程
测试人员的价值体现在哪里
shell脚本循环语句
私域流量时代来临,电商企业如何布局?
【HMS core】【Ads Kit】Huawei Advertising——Overseas applications are tested in China. Official advertisements cannot be displayed
接口测试如何准备测试数据
Tributyl-mercaptophosphane "tBuBrettPhos Pd(allyl)" OTf), 1798782-17-8
在树莓派上搭建属于自己的网页(1)
1059 C语言竞赛 (20 分)(C语言)
js的垃圾回收机制
Windows 安装PostgreSQL
【 Harmony OS 】 【 ano UI 】 lightweight data storage
Bubble sort in c language structure
Talking about GIS Data (6) - Projected Coordinate System