当前位置:网站首页>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') ;
边栏推荐
- shell script loop statement
- 【Harmony OS】【ARK UI】轻量级数据存储
- 【精讲】利用原生js实现todolist
- Shell之条件语句
- 数字孪生园区场景中的坐标知识
- 用户密码验证
- 13.< tag-动态规划和回文字串>lt.647. 回文子串 + lt.516.最长回文子序列
- 接口测试 Mock 实战(二) | 结合 jq 完成批量化的手工 Mock
- tag单调栈-单调栈预备知识-lt.739. 每日温度
- Interface test practice | Detailed explanation of the difference between GET / POST requests
猜你喜欢
【Harmony OS】【ARK UI】ETS 上下文基本操作
高可用 两地三中心
安装IIS服务(Internet信息服务(Internet Information Services,简写IIS,互联网信息服务)
Interface Test Framework Practice | Process Encapsulation and Test Case Design Based on Encrypted Interface
1. 两数之和
【Harmony OS】【FAQ】鸿蒙问题合集1
【生物素叠氮化物|cas:908007-17-0】价格_厂家
Interface test practice | Detailed explanation of the difference between GET / POST requests
typescript41-class类的私有修饰符
OSI的分层特点、传输过程与三次握手、四次挥手、tcp与udp包头的描述
随机推荐
探索性测试的概念及方法
接口和抽象
Tributyl-mercaptophosphane "tBuBrettPhos Pd(allyl)" OTf), 1798782-17-8
13.
lt.647. Palindromic substring + lt.516. Longest palindrome subsequence 【Harmony OS】【FAQ】Hongmeng Questions Collection 1
Create a tree structure
Harmony OS ets ArkUI 】 【 】 the development basic page layout and data connection
Two ways to simulate multi-user login in Jmeter
Interface test framework combat (1) | Requests and interface request construction
Flink状态
【Harmony OS】【ARK UI】ets use startAbility or startAbilityForResult to invoke Ability
1079 延迟的回文数 (20 分)
js实现一个 bind 函数
Build your own web page on raspberry pie (1)
【HMS core】【Ads Kit】华为广告——海外应用在国内测试正式广告无法展示
typescript45-接口之间的兼容性
Odps temporary query can write SQL, turned out to a named?
接口测试框架实战(二)| 接口请求断言
User password encryption tool
链动2+1模式简单,奖励结构丰厚,自主裂变?