一.MySQL概述
(一).什么是数据库?
数据库就是存储数据的仓库,简称DB(database);SQL是操作数据库的编程语言,是一套标准,通过编写SQL语句来操作数据库;
(二).关系型数据库是将数据保存在不同的数据表中,而且表与表之间还可以有关联;
二.SQL操作(DDL,DML,DQL,DCL)
(一)SQL通用语法
1.SQL语句可以单行或多行书写,以分号结尾;
2.MySQL数据库的SQL不区分大小写;
3.注释:
单行注释 -- 注释内容 或# 注释内容;
多行注释 /*注释内容*/
(二)DDL(Data Definition Language):数据定义语言,用来定义数据库对象(数据库,表,字段)
数据库操作:
1.查询所有的数据库: SHOW DATABASES;
2.查询当前数据库:SELECT DATABASE();
3.创建数据库:CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARSET 字符集] [COLLATE 排序规则];
4.删除数据库:DROP DATABASE [IF EXISTS] 数据库名:
5.使用指定的数据库:USE 数据库名;
表操作-查询
6.查询当前数据库所有表: SHOW TABLES;
7.查询表结构: DESC 表名;
8.查询指定表的建表语句: SHOW CREATE TABLE 表名;
9.创建表: CREATE TABLE 表名(
字段1 字段类型 [COMMENT 字段1注释],
字段2 字段类型 [COMMENT 字段2注释],
....
字段n 字段类型 [COMMENT 字段n注释]
)[COMMENT 表注释];
10.数据类型介绍
MySQL中的数据类型主要分为三类:数值类型,字符串类型,日期类型;
数值类型:
字符串类型:
日期类型:
修改表
11.添加字段:ALTER TABLE 表名 ADD 字段名 类型(长度) [COMMENT 注释] [约束];
12.修改字段数据类型:ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);
13.修改字段名和数据类型:ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度) [COMMENT 注释] [约束];
14.删除字段:ALTER TABLE 表名 DROP 字段名;
15.修改表名:ALTER TABLE 表名 RENAME TO 新表名;
16.删除表:DROP TABLE [IF EXISTS] 表名;
17.删除指定表,并重新创建该表: TRUNCATE TABLE 表名;
(三)DML(Data Manipulation Language):数据库操作语言,用来对数据库表中的数据进行增删改
新增:
1.给指定字段添加数据: INSERT INTO 表名(字段1,字段2...) VALUES(值1,值2);
2.给全部字段添加数据: INSERT INTO 表名 VALUES(值1,值2..);
3.批量添加数据: INSERT INTO 表名(字段2,字段2..) VALUES(值1,值2..),(值1,值2..),(值1,值2..);
4.修改
UPDATA 表名 SET 字段名1=值1,字段名2=值2,... WHERE 条件;
5.删除
DELETE FROM 表名 WHERE 条件;例如 DELETE FROM tb_user WHERE id=1;
(四DQL(Data Query Language):数据库查询语言,用来查询数据库中表的记录
SQL语句的执行顺序
1.FROM 2.WHERE 3.GROUP BY 4.HAVING 5.SELECT 6.ORDER BY 7.LIMIT
编写语法: SELECT
字段列表
FROM
表名列表
WHERE
条件列表
GROUP BY
分组字段列表
HAVING
分组后条件列表
ORDER BY
排序字段列表
LIMIT
分页参数;
1.基本查询
SELECT * FROM 表名;返回所有字段
SELECT 字段1,字段2 FROM 表名;返回指定字段
起别名 SELECT 字段1 [AS 别名].. FROM 表名; 返回指定字段并且给指定字段起别名;
去重 SELECT DISTINCT 字段名 FROM 表名;对指定字段去重;
2.条件查询
SELECT 字段列表 FROM 表名 WHERE 条件列表;
条件可包含一些运算符:
3.聚合查询: 讲一列数据作为一个整体进行纵向计算;
COUNT汇总,MAX最大值,MIN最小值,AVG平均值,SUM求和;
SELECT 聚合函数(字段列表) FROM 表名;
例: SELECT AVG(age) FROM tb_user; 统计此张表的平均年龄;
4.分组查询
SELECT 字段列表 FROM 表名 WHERE 条件 GROUP BY 分组字段名 [HAVING 分组后的过滤条件];
WHERE和HAVING之间的区别:
执行时机:WHERE是分组之前进行过滤的,不满足WHERE条件的不参与分组,而HAVING是分组后对结果进行过滤;
判断条件不同: WHERE不能对聚合函数进行判断,HAVING可以;
SELECT gender,count(*) FROM tb_user GROUP BY gender; 查出男女员工的数量;
5.排序查询 ORDER BY
SELECT 字段列表 FROM 表名 ORDER BY 排序字段1 排序方式,排序字段2 排序方式; 排序有ASC升序和降序DESC;
6.分页查询
SELECT 字段列表 FROM 表名 LIMIT 起始索引,查询展示数;
SELECT * FROM tb_user LIMIT 0,10; 查询10条数据; 从第0条开始,查10条件;
第一个为页码数,第二个为展示条数; 页码数=(页码-1)*页展示条数;
比如第二页,展示10条件: SELECT * FROM tb_user LIMIT 10,10; 页码(2-1)*10;
(五)DCL(Data Control Language):数据库控制语言,用来创建数据库用户,控制数据库的访问权限
1.查询用户
USE mysql;
SELECT * ROM user;
2.创建用户
CREATE USER '用户名'@'主机名' IDENTIFIED BY ‘密码’;
CREATE user 'zxt'@'%' IDENTIFIED by 'aqa147258'; %代表任何主机;
3.修改用户密码
ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码';
4.删除用户
DROP USER '用户名'@'主机名';
权限控制
5.查询权限
SHOW GRANTS FOR '用户名'@'主机名';
USAGE 代表只有连接的权限;
6.授予权限
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';
GRANT all on test.* TO 'zxt'@'%'; 授予对test库操作的所有权限;
GRANT all on *.* TO 'zxt'@'%'; 授予所有库所有表的操作权限;
7.撤销权限
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';
REVOKE all on text.* FROM 'zxt'@'%'; 撤销对test库的所有表的操作权限;
三.函数
函数是指一段可以直接被另一段程序调用的程序或代码;
1.字符串函数
对h字符串进行填充,总共长度5,往左边填充'-'; 右填充亦是一样;
简单案例:对员工号进行统一5位数,不足的左边补0;
update tb_user set number=lpad(number,5,'0');
2.数值函数
3.日期函数
查询当前时间往后30天的日期
第一个参数是日期时间,第二个是数字,第三个是单位,可以是day,month等待,interval是固定的;
4.流程函数
流程控制函数可以在SQL语句中实现条件筛选,从而提高语句的效率;
例句:查询手机,如果是华为和小明则是过年生产,否则就是国外;
四.约束
(一)概述:作用于表字段上的规则,限制存储在表中的数据;
目的:保证数据库中的数据的正确,有效性和完整性;
(二)约束分类
主键自增: AUTO_INCREMENT
创建表时建立约束: 约束可以多个 用空格隔开
CREATE TABLE user(
id int primary key auto_increment comment '主键',
name varchar(10) not null unique comment '名字'
) COMMENT '用户表';
也可创建完表后加约束:
主键约束: ALTER TABLE 表名 ADD [CONSTRANT 约束别名] PRIMARY KEY(字段);
外键约束:未建立外键关联,无法保证数据的一致性与完整性;
创表时添加外键:CREATE TABLE 表名(
字段名 字段类型...
[CONSTRAINT] [外键名称] FOREIGN KEY(外键字段名) REFERENCES 主表(主表列名);
);
添加外键:
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表(主表列名);
删除外键:ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
外键约束的删除与更新行为:
语法:ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY(外键字段) REFERENCES 主表名(主表字段名) ON UPDATE CASCADE ON DETELE CASCADE;
五.多表查询
多表查询:就是从多张表中查询数据;
(一).多表关系
分为三种: ①.一对一; 比如用户与用户详情的关系; 一对一关系中,只需在任一一方假如外键关联即可,并设置外键为唯一的;
②一对多(多对一); 比如部门和员工的两个表,一个员工只能对应一个部门,而一个部门可以有多个员工;通常在多的一方建立外键,也 就是员工一方;
③.多对多;比如 学生和课程的关系,一个学生可以选修多门课程,一门课程也可供多个学生选择; 多对多怎么设置外键呢,多对多需要 建立一张中间表,来阐述两表之间的关系,包含了学生的主键和课程的主键;
(二).多表关系概述.
1.笛卡尔积: 笛卡尔乘积是指在数学中,两个集合的所有组合情况,得出的结果条数是 两个集合数量的乘积; 比如A集合有a,b B集合有12;那么得出的结果会有四种,分别是 a1 a2 b1 b2;在数据库中表示两个表的数量乘积,所有数据的组合情况;
例如: SELECT * FROM 表1,表2; 得到的就是表1和表2的组合数据,俗称笛卡尔积;
消除笛卡尔积,只需找出两个表的关联信息,进行一一对应;
比如: SELECT * FROM 表1,表2 WHERE 表1字段=表2字段;
2.多表查询分类:
连接查询:
内连接:相当于查询A,B交集部分数据;
外连接:
左外连接: 查询左表所有数据,以及两张表交集部分数据;
右外连接:查询右表所有数据,以及两张表交集部分数据;
自连接:当前表与自身的连接查询,自连接必须使用表别名;
子查询
(三).内连接
1.隐式内连接: SELECT 字段列表 FROM 表1,表2 WHERE 条件;
2.显示外连接: SELECT 字段列表 FROM 表1 INNER JOIN 表2 ON 连接条件;
(四).外连接
1.左外连接: SELECT 字段列表 FROM 表1 LEFT JOIN 表2 ON条件;
2.右外连接:SELECT 字段列表 FROM 表1 RIGHT JOIN 表2 ON条件;
(五).自连接,可以指内连接,也可是外连接;
SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件;
(六).联合查询 union,union all
union是将结果集合并后去重,union all是直接合并结果集;
把多次查询的结果合并起来,形成一个新的查询结果集;
SELECT 字段列表 FROM 表A ..
UNION
SELECT 字段列表 FROM 表B..;
多张表返回的字段类别要一致,数量及字段类型都要一致;
(七)子查询
子查询简称嵌套查询; 也可用来做增删改操作;
SELECT * FROM 表名 WHERE column1=(SELECT column1 FROM 表名);
子查询位置分页:WHERE之后,FROM之后,SELECT之后;
根据子查询结果不同,分为以下几种:
1.标量子查询(子查询结果为单个值);
2.列子查询(子查询结果为一列);
常用的操作符: IN,NOT IN, ANY ,SOME, ALL;
3.行子查询(子查询结果为一行);
4.表子查询(子查询结果为多行多列);
六.事务
(一).事务简介
事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作
要么同时成功,要么同时失败;
MYSQL的事务默认是自动提交的,当执行增删改操作时,MYSQL会立即的隐式的提交事务;
(二).事务操作
现在我们有account表
让张三与李四进行转账操作;
正常操作是 成功的,但是如果出现了异常会怎样呢?将两个的Money恢复到2000,然后模拟异常;
发现张三减去了1000,而李四没有收到;
这源于我们MYSQL对于没一条SQL语句都是一个单独的事务;只有我们把两个SQL语句放到一个事务里面;
查看事务的提交方式: SELECT @@autocommit; 1代表是自动提交,0是手动提交;
修改事务提交方式: SET @@AUTOCOMMIT=0;
提交事务: COMMIT;
回滚事务: ROLLBACK;
现在我们把两个Money恢复至2000,接着操作;
这时候操作成功了吗?并没有,我们设置了事务的受手动提交
这个时候才成功了;如果出错了,那么我们要做的就不是提交,而是回滚,让数据回到操作之前一样;
我们也可以不修改事务的提交方式,只要做开启事务的操作就可以了;
开启事务: START TRANSACTION 或BEGIN;
(三).事务的四大特性ACID
原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败;
一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态;
隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行;
持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的;对于持久化,它是将数据存到我们的磁盘中去的;
(四).并发事务问题
不可重复读:A事务读取一条数据后,B事务并发的修改了这条数据,A事务又读取这条数据的时候,发现两次读取结果不一致;
幻读:A事务对某条id=1的数据,发现没有数据,所有准备插入一条id为1的数据,而此时事务B并发的插入了一条id为1的数据,所以A事务插入时插入不了,但是再去查发现还是查不到;
(五).事务隔离级别
数据隔离级别的低到高由上图 自上往下;
查看事务隔离级别命令:
5.7.2版本之前:SELECT @@tx_isolation;
5.7.2版本之后:SELECT @@TRANSACTION_ISOLATION;
设置事务隔离级别:
SET [SESSION 或者 GLOBAL] TRANSACTION ISOLATION LEVEL READ COMMITTED 或 READ UNCOMMITTED 或
REPEATABLE READ 或 SERIALIZABLE;
SESSION: 针对当前客户端窗口有效;
GLOBAL:针对所有客户端窗口有效;
现在模拟各个隔离级别遇到的情况;
首先是未提交读,这里模拟两个事务 同时对数据库做操作,并设置未提交读隔离级别:
展示脏读
然后是通过读已提交解决了脏读问题,但是出现了不可重复读
通过可重复读隔离级别处理不可重复读问题:
可重复读隔离级别,存在幻读的问题:
幻读问题只需改变隔离级别为最高即可解决;
但是序列串行化时,并发事务操作数据库,只允许由一个事务操作,其他事务都在阻塞等待,不论是增删改,或是查都会阻塞;
这个时候如果出现了两个事务同时插入一条数据会怎样?这里试了以下;
这里的阻塞等待在MYSQL中是加锁的概念;
标签:事务,数据库,MySQL,基础,查询,字段,表名,SELECT From: https://www.cnblogs.com/cjxiaozhuang/p/16857682.html