MySQL的简单笔记

1、登录MySQL数据库(DOS窗口)

1.1 dos窗口登录MySQL数据库的命令

#方式1,登录本机的mysql可以省略 -h 127.0.0.1 
mysql -h 127.0.0.1 -u root -p

之后输入密码即可登录
在这里插入图片描述
下面是登录成功的页面
在这里插入图片描述
1.2 MySQL的主要数据类型
整数类型: tinyint 、smallint、mediumint、int、integer、bigint。
浮点数据类型和定点数据类型:float、double、decimal(m,d)。
日期和时间类型:year、date、time、datetime、timestamp。
字符串类型:char、varchar(n)、tinytext、text、mediumtext、longtext。

2、操作数据库

2.1 查看已有的数据库/表

# 查看数据库
show databases;

# 查看表 ,需要选择数据库后才可以
show tables;

2.2 创建数据库的语句

# 格式:
create database 数据库名;

2.3 删除数据库的

drop database 数据库名;

2.4 使用一个数据库/进入数据库

use 数据库名;

# 示例:使用名为example的数据库
use example;

2.5 数据库中的存储引擎的介绍

2.5.1 查看数据库中支持的引擎的 命令

# 显示数据库支持的引擎
show engines;

在这里插入图片描述
2.5.2数据库存储引擎的介绍:

数据库引擎 事务 存储限制 外键
InnoDB 支持 64TB 行锁 支持
MyLSAM 不支持 256TB 表锁 不支持
MEMORY 不支持 不支持 不支持

锁颗粒:

  1. 表锁:是一种开销最小的锁策略。
  2. 行锁:是一种开销最大的锁策略

3、创建、修改和删除表

在创建表的前一般需要选择数据库

#选择需要操作的数据库
use 数据库名;

注意
[ ]” 方括号内的表示可选操作,非必须的

3.1 创建表格

3.1.1 创建表格的命令
创建表的时候最后的属性结束不用加逗号“,

# 创建表格
create table 表名 (
	属性名  数据类型 [完整性约束条件],
	属性名  数据类型 [完整性约束条件],
	...
	属性名  数据类型 [完整性约束条件]

3.1.2 完整性约束条件表

约束条件 说明
primary key 表示该属性为表的主键,是唯一标识
foreign key 表示该属性为表的外键,是与之相联系的某表的主键
not full 表示该属性不能为空
unique 表示该属性是唯一的
auto_increment 表示该属性的值是自动增长的
default 表示该属性的值如果没有的话,默认是default的值

3.1.3 设置主键的格式

# 单一的字段
属性名 数据类型 primary key 
# 多字段
primary key(属性名1,属性名2,...,属性名n)

示例:

#单一字段
create table student (
	id int primary key auto_increment ,  # 设置id 为主键 并且是自增长的
	stu_name varchar(10),
	age int
);

# 多字段
create table person(
	id  int,
	phone int,
	name varchar(10),
	primary key(id,phone)
);

3.1.4 设置外键的格式:

constraint 外键名称 foreign key (属性名1,属性名2,...,属性名n) 
	references 表名(属性名2.1,属性名2.2,...,属性名2.n)

示例:

create table id_card(
	card_id  int;
	card_name varchar(30),
	constraint id_fk foreign key (card_id) 
	references person(id)
);

3.1.5 其他约束性的设置的格式:

# 非空约束
属性名 数据类型 not null
# 唯一约束
属性名 数据类型 unique
# 默认值
属性名 数据类型 default 默认值

查看表结构的相关语句

# 格式1
describe 表名;

# 格式2 
desc 表名;

# 查看建表时详细的结构语句
show create table 表名;

3.2 修改表的语句

3.2.1 修改表中字段的名称和数据类型的语法:

alter table 表名 change 就属性名 新属性名 新数据类型;

这里可以只修改属性名,也可以同时修改数据类型
示例:

alter table student change name stu_name varchar(100);

3.2.2 为表格新增加字段的语法:

# [first | after] 属性2 这一段是指定属性的前面或者后面
# [] 内的代表的是可选操作非必须的  
alter table 表名 add 属性名1  数据类型 
[约束条件]  
[first | after 属性2]  ; 
# 可以指定新增的字段在具体元素的前后位置,默认是添加到最后面的

3.2.3 删除表中字段

drop table 表名 属性名;

3.2.4 修改字段的排列位置

alter table 表名 modify 属性名1 数据类型 first | last 属性名2;

示例

# 设置为第一
alter table student modify id int first;

# 设置为最后
alter table student modify id int last;

**3.2.5 更改表的存储引擎的语法: **

# 数据常用的引擎有: InnoDB 、MyLSAM 、MEMORY
alter table 表名 Engine=存储引擎名

3.2.6 删除表的外键约束

alter table 表名 drop foreign key 外键名

3.3 删除数据库中的表

删表的语法:

# 没有外键约束的表,可以直接删除
drop table 表名;

# 删除有外键约束的表,删除相关的外键依赖,再删除表
alter table 表名 drop foreign key 外键名
drop table 表名;

4、插入、更新、和删除数据

4.1 插入数据

下面分别插入单行数据多行数据的语法:

# 插入所有的属性值
insert into 表名 values
	(属性值1, 属性值2,...,属性值n);

# 插入指定列的数据
insert into 表名 (属性名1, 属性名2,...,属性名n) values 
	(属性值1, 属性值2,...,属性值n);

# 同时插入多行数据
insert into 表名 (属性名1, 属性名2,...,属性名n) values 
	(属性值1.1, 属性值1.2,...,属性值1.n),
	(属性值2.1, 属性值2.2,...,属性值2.n),
	...,
	(属性值n.1, 属性值n.2,...,属性值n.n);

# 也可以将查询的数据插入,只需查出的数据类型和列表1中的属性一致即可
insert into 表名 (属性列表1)
	select (属性类表2) from 表名2 where 条件表达式;

示例

# 插入单个 
insert into student (id,name) values
	(1,'张三');

insert into student (id,name) values
	(1,'张三'),
	(2,'李四'),
	(3,'王五');

4.2 更新表中数据

更新语法格式:

update 表名 set 
	属性名1=取值1,
	属性名2=取值2,
	...,
	属性名n=取值n
	where 条件表达式;

备注:where 条件表达式 不可少,否则更新的是整个表中的所有指定属性的值。

示例

update student set
	name = '李四'
	where id = 1;

4.3 删除数据:

# 删除表中数据,
delete from 表名  where 条件表达式;

备注:where 条件表达式 不可少,否则删除的是整个表中的所有指定属性的值。

5、查询数据/检索数据

5.1 基本的查询语句

5.1.1 单表查询:

select  属性列表
	from 表名 或者 视图名
	[where 条件表达式1]
	[group by 属性名1 [having 条件表达式2]]
	[order by 属性名2 [asc | desc]]
	[limit 初始位置 记录数];

说明

  • 存在where 语句 就按照 条件表达式1 进行查询,否者就查询所有
  • 存在group by语句 就按照属性1进行分组,如果还有 having语句,只有满足条件表达式2中才能输出
  • 如果有order语句, 就按照属性2的字段进行排序,方式有asc(升序)、desc(降序)
  • 如果有limit 语句,那么最后执行的输出按照limit语句的输出

5.1.2 带 in 关键字的查询

属性名 [not] in [元素1,元素2,...,元素n]

示例:

select * from student
	where id in (1,2,3,4,6);

5.1.3 带 between and 的范围查询

[not] between 取值1 and 取值2

示例:

# 选择年龄在18和20 之间的
select * from student 
	where age between 18 and 20 ;

5.1.4 带like的字符查询

[not] like '字符串'
  • “%”:可以代表任意字符,长度也可以为0
  • “_”:只代表一个字符

示例:

# 选出所有姓 李 的同学
select * from student
	where name like '李%'

5.1.5 查询空值的列:

is [not] null

示例:

select from work where info is null;

5.1.6 带 and 的多条件查询

条件表达式1 and 条件表达式2 [...and 条件表达式n]

5.1.7 带 or 的多条件语句

条件表达式1 or 条件表达式2 [...or 条件表达式n]

5.1.8 查询不重复的数据

在没有主键和唯一的完整性约束下,会存在重复的数据,可以使用关键字 distinct 来查询,排除重复的数据

select distinct 属性名 ...;

示例:

# 查询所有不同的姓名的学生
select distinct name from student;

5.1.9 使用order by 对查询结果进行排序

order by 属性名 [asc | desc]

asc 和des说明:

  • asc :升序
  • desc :降序

示例:

# 单一字段排序,
select * from student order by age asc;

# 多字段排序,先按照年龄降序排,如果年龄相同再按照id升序排
select * from student order by age desc id asc ;

5.1.10 使用group by 进行分组查询

# 分组可以按照 单个字段 和 多个字段
# 单个字段
group by 属性名 [having 条件表达式] [with rollup]

# 多个字段
group by 属性名1,属性名2,...,属性名n [having 条件表达式] [with rollup]

其中having条件表达式用于限定分组后显示
with rollup会在所有的分组最后面添加一条记录,即上面记录的所有总和。

group by关键字和group_concat()函数一起使用
示例:

select sex group_concat(name) from student group by sex

5.1.11 用limit限制查询语句的查询结果的数量

# 限制前 记录数 条,这里的相当于初始位置是0,省略不写了
limit 记录数;
# 从初始位置开始 后面的 记录数 条数据,不含初始位置的数据
limit 初始位置 记录数

5.1.12 使用集合函数查询

select 集合函数 from 表名

示例:

# 查询学生的总记录数
select count(*) from student;

集合函数:

  • count():用于计数的函数
  • sum():用于求和的函数
  • avg(): 求平均值的函数
  • max():用于求最大值的函数
  • min():用于求最小值的函数

5.2 连接查询

连接查询:是将两个或两个以上的表按某个条件连接起来,从中选取需要的数据

5.2.1内连接查询

内连接查询:是最常用的连接查询,当两个表格中有表示相同意义的字段,可以通过该字段来连接两个表进行查询。
条件:相同意义的字段
示例:

# 这里的d_id表示的部门编号,
# 语法一:
select  e.id e.name d.name 
	from employee e ,department d
	where e.d_id = d.d_id and 其他需要的条件表达式;

# 语法二:
select  e.id e.name d.name 
	from employee e  inner join department d
	on e.d_id = d.d_id
	where 条件表达式;

5.2.2 外连接查询

外连接查询:分为左外连接查询和右外连接查询

语法:

# left join 是左连接查询,right join 是右连接查询
select 属性名列表 
	from 表名1 left|right join 表名2
	on 表名1.属性名 = 表名2.属性名
	[where 条件表达式]

说明:

  • 左连接查询(以左表为主)的时候会将表名1所有记录都查出来,而表名2只查出所匹配的数据。
  • 右连接查询(以右表为主)的时候会将表名2所有记录都查出来,而表名1只查出所匹配的数据。

5.3 子查询

子查询:将一个查询语句嵌套在另一个查询语句之中,内层查询语句的结果可以为外层查询语句提供插叙条件。

查询语句中可以带in关键字比较运算符exists关键字any关键字all 关键字

示例:

# 带in关键字的子查询
select * from student
	where class_id in
		(select class_id from t_class);

# 带比较运算符的子查询
select id name score from  computer_stu
	where score >= 
		(select score from scholarship
			where level = 1 );

# 带exists关键字的子查询
select * from employee 
	where exists 
		(select d_name from department 
			where d_id = 3);

# 带any关键字的子查询
select * from computer_stu
	where score >= any
		(select score from scholarship);

# 带all关键字的子查询
select * from computer_stu
	where score >= all
		(select score from scholarship);

6、MySQL的事务控制语言

事务控制语言:(TCL:Transaction Controller Language)一组sql语句组成一个执行单元,这个执行单元要么全部成功,要么全部失败。

6.1 事务的特性:ACID

  • 原子性(Atomicity):指事务是一个不可分割的工作单位,要么全部执行,要么全部不执行。
  • 一致性(Consistency):事务必须使数据库从一个一致性的状态转化到另一个一致性的状态,即执行前后数据的总体保持不变。
  • 隔离性(Isolation):事务的隔离性是一个事务的执行不能被其他事务打扰,即各个事务是互不干扰的。
  • 持久性(Durability):事务一旦被提交,对数据库的数据的改变就是永久性的。

6.2 事务的创建

隐式事务:默认自动开启的,insert、update和insert都是默认的自动提交的。

显式事务:事务具有明显的开启和结束的标记,每次使用显式事务必须先禁用数据库的自动提交

下面是显式事务的语法:

# 关闭事务的自动提交
set autocommit=0;
# 开启事务的标志,
start transaction;

事务执行的SQL语句,包含select insert update delete
...

# 事务提交的标志,要么提交事务,要么回滚事务
commit; # 提交事务
rollback; # 回滚事务

6.3 示例:转账的例子

演示事务前的准备工作:

# 创建表格
CREATE TABLE t_account (id INT ,`name` VARCHAR(20),money INT);

# 插入数据
INSERT INTO t_account VALUES
(1,'张三',1000),
(2,'李四',1000);

事务前表中的数据:在这里插入图片描述
6.3.1 回滚事务的演示:

# 设置为不自动提交,开启事务
set autocommit = 0;
start transaction;

# 执行sql语句的集合
update t_account set money = 500 where id = 1;
update t_account set money = 1500 where id =2;

# 结束事务,回滚
rollback;

上面回滚事务语句执行后的数据结果
在这里插入图片描述
6.3.2 提交事务的演示:

# 设置为不自动提交,开启事务
set autocommit = 0;
start transaction;

# 执行sql语句的集合
update t_account set money = 500 where id = 1;
update t_account set money = 1500 where id = 2;

# 结束事务,回滚
commit;

上面提交事务语句执行后的数据结果:
在这里插入图片描述

6.4 数据库中事务的并发会出现的问题:

  • 脏读:对于两个事务(事务1和事务2),事务1读取了被事务2更新但还没有提交的数据之后,如果事务2 回滚了,事务1读取的内容就是临时且无效的。
  • 不可重复读:对于两个事务(事务1和事务2),事务1读取了一个字段,然后事务2 更新了 该字段的数据,事务2再次读取同一字段,数据前后就不同了。
  • 幻读:对于两个事务(事务1和事务2),T1从表中读取了一个字段,然后T2在该表中插入了一些新的数据,之后,T1再次读取同一个表,就会多出几行。

6.5 数据中数据库的隔离级别:

隔离级别 描述 出现并发问题
读未提交数据(READ UNCOMMITTED) 允许事务读取未被其他事务提交的变更数据 脏读、不可重复读、幻读
读已提交的数据(READ COMMITED) 只允许数据读取被其他事务提交的变更数据,避免脏读 不可重复读、幻读
可重复读(REPEATABLE READ) 确保事务可以多次从一个字段读取相同的值,在这个事务期间禁止其他事务对这个字段进行更新,可避免脏读和不可重复读 幻读
串行化(SERIALIZABLE) 确保事务可以从一个表读取相同的行,在这个事务期间禁止其他数据对该表执行插入、更新、删除操作;避免了脏读、不可重复读、幻读 性能低

MySQL执行4种事务的隔离级别,默认的事务隔离级别是 可重复读(REPEATABLE READ)。
Oracle支持2种隔离级别即读已提交的数据(READ COMMITED)串行化(SERIALIZABLE),默认的是READ COMMITED。

6.5.1 查看和设置数据库的隔离级别

查看当前数据的隔离级别

SELECT @@tx_isolation;

设置数据库的隔离级别

# 隔离级别:read uncommitted、 read commited、repeatable read、serializable
set session transaction isolation Level 隔离级别;

回滚点的设置

# 设置回滚点的语法
savepoint a;

示例:

set autocommit = 0;
start transaction;

# 执行sql语句的集合
update t_account set money = 2000 where id = 1;
#设置保存点
savepoint a_point;

update t_account set money = 500 where id = 1;
update t_account set money = 1500 where id = 2;

# 结束事务,回滚保存点 a_point
rollback to a_point;

7、 索引

7.1 索引的相关概念和作用

索引是创建在表上的,是对数据库表中一列或者多列的值进行排序的一种数据结构

作用提高查询的速度

数据库在表格中查询数据的时候都是将每条记录的所有记录进行比对,这样的查询在数据量较大的情况中查询速度时比较慢的

通过索引查询的时候可以不必读完记录中的所有记录,而只是查询索引列。

7.2 MySQL中支持的索引

索引有B型(Btree)树索引哈希(Hash)索引

  • InnoDB 和MyISAM支持BTREE索引
  • MEMORY支持B型(Btree)树索引和哈希(Hash)索引,默认是前置

7.3 索引优点和缺点

  • 优点:提过检索数据的速度
  • 缺点:创建和维护需要耗费时间和占用物理空间

索引会影响插入的记录的速度,如果是传入大量数据的情况下,速度影响尤为明显,这种时候应该删除相关的索引,待插入数据完成后再重建索引

7.4 索引的分类:

  1. 普通索引
  2. 唯一索引
  3. 全文索引
  4. 单列索引
  5. 多列索引
  6. 空间索引

常见的是唯一索引、单列索引、多列索引

7.5 索引的设计原则

为了使索引的使用效率更高,在创建索引的时候可以遵循以下原则

  1. 选择唯一索引
  2. 为经常需要排序、分组、联合操作的字段建立索引
  3. 为常用作查询语句的字段建立索引
  4. 限制索引的数目
  5. 尽量使用数量少的索引
  6. 尽量使用前缀来索引
  7. 删除不再使用或者很少使用的索引

7.6 创建索引的语句

7.6.1创建表的时候创建索引

# 创建表的时候创建索引
create table 表名(
	属性名 数据类型 [完整性约束条件],
	属性名 数据类型 [完整性约束条件],
	...,
	属性名 数据类型 [完整性约束条件]
	[unique | fulltext | spatial] index|key
		[别名] (属性名1 [(长度)]) [asc | desc] ]
);
  • [unique | fulltext | spatial] :三个值都是可选参数,分别表示唯一索引、全文索引、空间索引
  • index|key:用于指定创建索引取新名称的,二选一即可,作用一样的
  • (属性名1 [(长度)]):指定索引对应表格中的字段,长度是可选的,指索引的长度
  • [asc | desc]:可选参数,asc表示升序,desc表示降序

7.6.2 在已存在的表上创建索引

create [unique | fulltext | spatial] index 索引名 
	on 表名(属性名1 [(长度)] [asc | desc] );

使用alter table 语句来创建索引

alter table 表名 add [unique | fulltext | spatial] index 
	索引名 (属性名1 [(长度)] [asc | desc] )

7.6.3 删除索引

drop index 索引名 on 表名;

8、视图

视图:是从一个或多个表中导出来的表,是一种虚拟存在的表,视图的数据是依赖原来表格中的数据的,一旦原来表格数据改变,视图中的数据也会跟着改变

特点:所见即所需

作用:选取有用的信息,屏蔽多余的、没有用的数据

  1. 使操作简单化
  2. 增加数据的安全性
  3. 提高表的逻辑独立性

8.1 创建视图

创建视图的语法:

create [algorithm = {
   
   undefined | merge|temptable}]
	view 视图名 [(属性清单)]
	as select 语句
	[with [cascaded|local] check option];
  • [algorithm = {undefined | merge|temptable}]:algorithm 为可选参数,表示视图选择的算法,undefined 表示MySQL将自动选择索引使用的算法;merge表示将使用视图语句和视图定义合并起来;temptable表示将的结构存入临时表,然后使用临时表执行语句
  • [cascaded|local]:可选参数,cascaded表示更新视图时要满足所有相关视图和表的条件,该参数是默认值;local表示更新视图时,要满足视图本身的定义条件即可
  • [with check option]:可选参数,表示更新视图时要保证该视图的权限范围之内。

示例:

# 在单标上创建视图
create view 
		department_view (name,`function`, location)
		as select d_name,`function`,address
			from department;

# 在多表上创建视图
create algorithm = merge view 
	worker_view (name,department,sex,age,address)
	as select name ,department.d_name,sex,address
		from worker w,department d  where w.d_id = d.d_id
		with local check option;

8.2 查看视图

使用describe语句查看视图信息

# describe语句查看视图信息
describe 视图名;

# 简写
desc 视图名;

# show table status查看视图基本信息
show table status like '视图名';

# show create view 语句查询看视图详细信息,可以查看视图的详细定义
show create view 视图名;

# 在views 表中查看所有视图详细信息
select * from information_schema.views;

8.3 修改视图

# 方式1 使用 create or replace,如果存在就是修改,不存在就创建
create or replace [algorithm = {
   
   undefined | merge|temptable}]
	view 视图名 [(属性清单)]
	as select 语句
	[with [cascaded|local] check option];

# 方式2:使用 alert 语句来修改
alter [algorithm = {
   
   undefined | merge|temptable}]
	view 视图名 [(属性清单)]
	as select 语句
	[with [cascaded|local] check option];

8.4 更新视图

更新视图是指通过insertupdatedelete来操作视图中相关的数据,因为视图是一个虚表,实际更新的是基本表的更新。

更新视图的语句和更新表格的语句相同

8.4.2 在这几种情况下是不能更新视图的

  1. 视图中含有sum()、count()、max()、min()等函数的时候
  2. 视图中含有union、union all distinct、group by 和having 关键字
  3. 含有常量的视图
  4. 视图中的select中含有子查询的
  5. 由不可更新的视图导出的视图
  6. 创建视图的时候algorithm =temptable的视图
  7. 视图上对的表上存在没有默认值的列,而且没有包含在视图里。

8.5 删除视图

删除视图的语法:

drop view [if exists] 视图名列表 [restrict | cascade]

猜你喜欢

转载自blog.csdn.net/Hicodden/article/details/106265451
今日推荐