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.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;
数据库引擎 | 事务 | 存储限制 | 锁 | 外键 |
---|---|---|---|---|
InnoDB | 支持 | 64TB | 行锁 | 支持 |
MyLSAM | 不支持 | 256TB | 表锁 | 不支持 |
MEMORY | 不支持 | 有 | 不支持 | 不支持 |
锁颗粒:
在创建表的前一般需要选择数据库
#选择需要操作的数据库
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.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.1 基本的查询语句
5.1.1 单表查询:
select 属性列表
from 表名 或者 视图名
[where 条件表达式1]
[group by 属性名1 [having 条件表达式2]]
[order by 属性名2 [asc | desc]]
[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 '字符串'
示例:
# 选出所有姓 李 的同学
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说明:
示例:
# 单一字段排序,
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;
集合函数:
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 条件表达式]
说明:
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);
事务控制语言:(TCL:Transaction Controller Language)一组sql语句组成一个执行单元,这个执行单元要么全部成功,要么全部失败。
6.1 事务的特性:ACID
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);
# 设置为不自动提交,开启事务
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 数据库中事务的并发会出现的问题:
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.1 索引的相关概念和作用
索引是创建在表上的,是对数据库表中一列或者多列的值进行排序的一种数据结构
作用:提高查询的速度
数据库在表格中查询数据的时候都是将每条记录的所有记录进行比对,这样的查询在数据量较大的情况中查询速度时比较慢的
通过索引查询的时候可以不必读完记录中的所有记录,而只是查询索引列。
7.2 MySQL中支持的索引
索引有B型(Btree)树索引和哈希(Hash)索引
7.3 索引优点和缺点
索引会影响插入的记录的速度,如果是传入大量数据的情况下,速度影响尤为明显,这种时候应该删除相关的索引,待插入数据完成后再重建索引
7.4 索引的分类:
常见的是唯一索引、单列索引、多列索引
7.5 索引的设计原则
为了使索引的使用效率更高,在创建索引的时候可以遵循以下原则
7.6 创建索引的语句
7.6.1创建表的时候创建索引
# 创建表的时候创建索引
create table 表名(
属性名 数据类型 [完整性约束条件],
属性名 数据类型 [完整性约束条件],
...,
属性名 数据类型 [完整性约束条件]
[unique | fulltext | spatial] index|key
[别名] (属性名1 [(长度)]) [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 创建视图
创建视图的语法:
create [algorithm = {undefined | merge|temptable}]
view 视图名 [(属性清单)]
as select 语句
[with [cascaded|local] 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 更新视图
更新视图是指通过insert、update和delete来操作视图中相关的数据,因为视图是一个虚表,实际更新的是基本表的更新。
更新视图的语句和更新表格的语句相同
8.4.2 在这几种情况下是不能更新视图的
8.5 删除视图
删除视图的语法:
drop view [if exists] 视图名列表 [restrict | cascade]