什么是MySQL?
官方回答:
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管dao理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
目前也是最受欢迎的数据库,因为mysql的稳定性和资金问题都很友好
常见的数据库管理系统:MySQL、Oracle、DB2、SqlServer等
数据库的基本概念
DB
数据库( database ):存储数据的“仓库”。它保存了一系列有组织的数据。
DBMS
数据库管理系统( Database Management System )。数据库是通过 DBMS 创 建和操作的容器
SQL
结构化查询语言( Structure Query Language ):专门用来与数据库通信的语言。
DML(Data Manipulation Language):数据操纵语句,用于添 加、删除、修改、查询数据库记录,并检查数据完整性
DDL(Data Definition Language):数据定义语句,用于库和 表的创建、修改、删除。
DCL(Data Control Language):数据控制语句,用于定义用 户的访问权限和安全级别。
当然还有OS、DBS…等等这些就不一一赘述了。
数据库的基本使用(CRUD)
增加数据(insert)
insert into stu values('名字',18)
删除数据(delete)
delete from stu where name='名字'
修改数据(update)
update stu set age=20 where name='名字'
查找数据(select)
SELECT * FROM `employees`;
条件查询及模糊查询(where、like)
SELECT *
FROM employees
WHERE last_name LIKE '%a%';
范围查询(in、between and)
SELECT last_name,department_id
FROM employees
WHERE department_id IN(30,50,90);
SELECT department_id,last_name
FROM employees
WHERE department_id BETWEEN 30 AND 90;
聚合函数(MAX())、分组(GROUP BY)、加分组后条件(HAVING)、排序(ORDER BY desc|asc)、别名(as)
SELECT MAX(salary) as 最高工资,job_id
FROM employees
WHERE commission_pct IS NULL
GROUP BY job_id
HAVING MAX(salary)>6000
ORDER BY MAX(salary) ASC;
连接查询
一张图了解表连接:
注意:MySQL不支持FULL OUTER JOIN ,也就是最后两个。
连接查询:又称多表查询,当查询语句涉及到的字段来自于多个表时,就会用到连接查询
笛卡尔乘积现象:表1 有m行,表2有n行,结果=m*n行
发生原因:没有有效的连接条件
如何避免:添加有效的连接条件
分类:
按年代分类:
1、sql92标准:仅仅支持内连接
内连接:
等值连接
非等值连接
自连接
2、sql99标准【推荐】:支持内连接+外连接(左外和右外)+交叉连接
按功能分类:
内连接:
等值连接
非等值连接
自连接
外连接:
左外连接
右外连接
全外连接
交叉连接
sql92标准:
sql92两表连接:
SELECT NAME,boyName FROM boys,beauty
WHERE beauty.boyfriend_id= boys.id;
sql92三表连接:
SELECT last_name,department_name,city
FROM employees e,departments d,locations l
WHERE e.`department_id`=d.`department_id`
AND d.`location_id`=l.`location_id`
AND city LIKE 's%'
ORDER BY department_name DESC;
sql92非等值连接:
SELECT salary,grade_level
FROM employees e,job_grades g
WHERE salary BETWEEN g.`lowest_sal` AND g.`highest_sal`
AND g.`grade_level`='A';
sql92自连接:
SELECT e.employee_id,e.last_name,m.employee_id,m.last_name
FROM employees e,employees m
WHERE e.`manager_id`=m.`employee_id`;
SQL99标准:
sql99等值连接:
SELECT last_name,department_name
FROM departments d
JOIN employees e
ON e.department_id =d.department_id;
sql99非等值连接:
SELECT COUNT(*) 个数,grade
FROM employees e
JOIN sal_grade g
ON e.`salary` BETWEEN g.`min_salary` AND g.`max_salary`
WHERE e.`department_id` BETWEEN 10 AND 90
GROUP BY g.grade;
sql99自连接:
SELECT e.`last_name`,m.`last_name`
FROM employees e
JOIN employees m
ON e.`manager_id`=m.`employee_id`;
sql99外连接:
sql99左连接
SELECT b.*,bo*
FROM beauty b
LEFT JOIN boys bo ON b.`boyfriend_id`=bo.`id`
WHERE bo.`id` IS NULL;
sql99右连接
SELECT b.*,bo*
FROM beauty b
right JOIN boys bo ON b.`boyfriend_id`=bo.`id`
WHERE bo.`id` IS NULL;
SQL92和SQL99的区别:
SQL99,使用JOIN关键字代替了之前的逗号,并且将连接条件和筛选条件进行了分离,提高阅读性!!!
子查询
说明:当一个查询语句中又嵌套了另一个完整的select语句,则被嵌套的select语句称为子查询或内查询
外面的select语句称为主查询或外查询。
SELECT last_name,salary
FROM employees
WHERE salary>(
SELECT salary
FROM employees
WHERE last_name <> 'Abel'
);
<>是等于的意思
联合查询
1、多条待联合的查询语句的查询列数必须一致,查询类型、字段意义最好一致
2、union实现去重查询
union all 实现全部查询,包含重复项
SELECT uname,uage FROM usa
UNION
SELECT age,`name` FROM chinese;
union自动去重/union all 可以支持重复项
分页查询:
应用场景:当页面上的数据,一页显示不全,则需要分页显示
分页查询的sql命令请求数据库服务器——>服务器响应查询到的多条数据——>前台页面
特点:
①起始条目索引如果不写,默认是0
②limit后面支持两个参数
参数1:显示的起始条目索引
参数2:条目数
常用公式:(page-1)*size,size(显示的页数是page,每页显示的条目数为size)
SELECT last_name,salary,salary*12*(1+IFNULL(commission_pct,0)) 年薪
FROM employees
ORDER BY 年薪 DESC
LIMIT 0,10;
MySQL表和库的管理
常见约束
说明:用于限制表中字段的数据的,从而进一步保证数据表的数据是一致的、准确的、可靠的!
NOT NULL 非空:用于限制该字段为必填项
DEFAULT 默认:用于限制该字段没有显式插入值,则直接显式默认值
PRIMARY KEY 主键:用于限制该字段值不能重复,设置为主键列的字段默认不能为空
一个表只能有一个主键,当然可以是组合主键
UNIQUE 唯一:用于限制该字段值不能重复
字段是否可以为空 一个表可以有几个
主键 × 1个
唯一 √ n个
CHECK检查:用于限制该字段值必须满足指定条件
CHECK(age BETWEEN 1 AND 100)
FOREIGN KEY 外键:用于限制两个表的关系,要求外键列的值必须来自于主表的关联列
要求:
①主表的关联列和从表的关联列的类型必须一致,意思一样,名称无要求
②主表的关联列要求必须是主键
数据类型
1、整型
TINYINT SMALLINT INT BIGINT
2、浮点型
FLOAT(m,n)
DOUBLE(m,n)
DECIMAL(m,n)
m和n可选
3、字符型
CHAR(n):n可选
VARCHAR(n):n必选
TEXT
n表示最多字符个数
4、日期型
DATE TIME DATETIME TIMESTAMP
5、二进制型
BLOB 存储图片数据
创建数据库(CREATE DATABASE):
CREATE DATABASE IF NOT EXISTS stuDB;
删除数据库(DROP DATABASE ):
DROP DATABASE IF EXISTS stuDB;
IF EXISTS 能确保数据库的安全性不会报错
创建表(CREATE TABLE):
CREATE TABLE IF NOT EXISTS stuinfo(
stuid INT ,
stuname VARCHAR(20),
stugender CHAR(1),
email VARCHAR(20),
borndate DATETIME
);
修改表(ALTER TABLE):
ALTER TABLE 表名 ADD|MODIFY|CHANGE|DROP COLUMN 字段名 字段类型 【字段约束】;
删除表:
DROP TABLE IF EXISTS students;
复制表:
CREATE TABLE newTable2 LIKE major;
仅仅复制表的结构
添加字段(ADD COLUMN)及查看表结构(DESC 表):
ALTER TABLE students ADD COLUMN borndate TIMESTAMP NOT NULL;
修改字段名:
ALTER TABLE students CHANGE COLUMN borndate birthday DATETIME NULL;
删除字段:
ALTER TABLE students DROP COLUMN birthday;
创建视图:
create view 视图名 as select 字段名 from 表名;
修改视图:
alter view 视图名 as select 语句;
alter view 视图名 as select 视图;
删除视图:
drop view 视图名[,视图名…];
查看视图:
drop view 视图名[,视图名…];
重命名视图:
Rename table 视图名 to 新视图名;
事务
什么是事务?
事务由单独单元的一个或者多个sql语句组成,在这个单元中,每个mysql语句时相互依赖的。而整个单独单元作为一个不可分割的整体,如果单元中某条sql语句一旦执行失败或者产生错误,整个单元将会回滚,也就是所有受到影响的数据将会返回到事务开始以前的状态;如果单元中的所有sql语句均执行成功,则事务被顺利执行。
原子性(Atomicity)
一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。(oracle通过redo和undo日志保证)
一致性(Consistency)
事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。如果事务成功地完成,那么系统中所有变化将正确地应用,系统处于有效状态。如果在事务中出现错误,那么系统中的所有变化将自动地回滚,系统返回到原始状态。
隔离性(Isolation)
指的是在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看到中间状态的数据。
持久性(Durability)
指的是只要事务成功结束,它对数据库所做的更新就必须永久保存下来。即使发生系统崩溃,重新启动数据库系统后,数据库还能恢复到事务成功结束时的状态。
原作者:https://www.jianshu.com/p/d396fffaceb6
并发下事务会产生的问题
脏读:
所谓脏读,就是指事务A读到了事务B还没有提交的数据,比如银行取钱,事务A开启事务,此时切换到事务B,事务B开启事务–>取走100元,此时切换回事务A,事务A读取的肯定是数据库里面的原始数据,因为事务B取走了100块钱,并没有提交,数据库里面的账务余额肯定还是原始余额,这就是脏读。
不可重复读:
所谓不可重复读,就是指在一个事务里面读取了两次某个数据,读出来的数据不一致。还是以银行取钱为例,事务A开启事务–>查出银行卡余额为1000元,此时切换到事务B事务B开启事务–>事务B取走100元–>提交,数据库里面余额变为900元,此时切换回事务A,事务A再查一次查出账户余额为900元,这样对事务A而言,在同一个事务内两次读取账户余额数据不一致,这就是不可重复读。
幻读:
所谓幻读,就是指在一个事务里面的操作中发现了未被操作的数据。比如学生信息,事务A开启事务–>修改所有学生当天签到状况为false,此时切换到事务B,事务B开启事务–>事务B插入了一条学生数据,此时切换回事务A,事务A提交的时候发现了一条自己没有修改过的数据,这就是幻读,就好像发生了幻觉一样。幻读出现的前提是并发的事务中有事务发生了插入、删除操作。
事务隔离级别:
事务隔离级别,就是为了解决上面几种问题而诞生的。为什么要有事务隔离级别,因为事务隔离级别越高,在并发下会产生的问题就越少,但同时付出的性能消耗也将越大,因此很多时候必须在并发性和性能之间做一个权衡。所以设立了几种事务隔离级别,以便让不同的项目可以根据自己项目的并发情况选择合适的事务隔离级别,对于在事务隔离级别之外会产生的并发问题,在代码中做补偿。
事务隔离级别有4种,但是像Spring会提供给用户5种,来看一下:
1、DEFAULT
默认隔离级别,每种数据库支持的事务隔离级别不一样,如果Spring配置事务时将isolation设置为这个值的话,那么将使用底层数据库的默认事务隔离级别。顺便说一句,如果使用的MySQL,可以使用"select @@tx_isolation"来查看默认的事务隔离级别
2、READ_UNCOMMITTED
读未提交,即能够读取到没有被提交的数据,所以很明显这个级别的隔离机制无法解决脏读、不可重复读、幻读中的任何一种,因此很少使用
3、READ_COMMITED
读已提交,即能够读到那些已经提交的数据,自然能够防止脏读,但是无法限制不可重复读和幻读
4、REPEATABLE_READ
重复读取,即在数据读出来之后加锁,类似"select * from XXX for update",明确数据读取出来就是为了更新用的,所以要加一把锁,防止别人修改它。REPEATABLE_READ的意思也类似,读取了一条数据,这个事务不结束,别的事务就不可以改这条记录,这样就解决了脏读、不可重复读的问题,但是幻读的问题还是无法解决
5、SERLALIZABLE
串行化,最高的事务隔离级别,不管多少事务,挨个运行完一个事务的所有子事务之后才可以执行另外一个事务里面的所有子事务,这样就解决了脏读、不可重复读和幻读的问题了
MYSQL默认隔离级别是:READ_COMMITED
原作者:https://www.cnblogs.com/xrq730/p/5087378.html
事务分类:
隐式事务:没有明显的开启和结束标记
比如dml语句的insert、update、delete语句本身就是一条事务
insert into stuinfo values(1,'john','男','ert@dd.com',12);
显式事务:具有明显的开启和结束标记
一般由多条sql语句组成,必须具有明显的开启和结束标记
步骤:
取消隐式事务自动开启的功能
1、开启事务
2、编写事务需要的sql语句(1条或多条)
insert into stuinfo values(1,'john','男','ert@dd.com',12);
insert into stuinfo values(1,'john','男','ert@dd.com',12);
3、结束事务
取消事务自动开启:
SET autocommit = 0;
开启事务
START TRANSACTION;
或 begin;
提交:
commit;
回滚:
ROLLBACK;
演示MySQL事务:
SET autocommit = 0
alter table person type=INNODB
begin
update person set name='efgh' where id =10
select * from person
commit
常见函数(自行了解)
字符函数
concat
substr
length(str)
char_length
upper
lower
trim
left
right
lpad
rpad
instr
strcmp
数学函数
abs
ceil
floor
round
truncate
mod
日期函数
now
curtime
curdate
datediff
date_format
str_to_date
流程控制函数
if
case
后面还有变量存储过程函数什么的就不一一赘述了。