Download MySQL Community Server (Archived Versions)
MySQL入门基础,mysql基础视频+数据库实战,老杜带你学_哔哩哔哩_bilibili
net start mysql
net stop mysql
mysql -uroot -p
exit
show databases;
create database bjpowernode;
use bjpowernode;
create database bjpowernode;
use bjpowernode
source D:\bjpowernode.sql
导出数据
在windows的dos命令窗口中进行
导出数据库
mysqldump bjpowernode>D:\bjpowernode.sql -uroot -p1111
导出数据库中某张表
mysqldump bjpowernode emp>D:\bjpowernode.sql -uroot -p1111
show tables;
desc dept;
create table t_vip(
id int,
name varchar(255) not null
);
NULL可以重复
create table t_vip(
id int unique,
name varchar(255),
email varchar(255),
unique(name,email) // 两个字段联合起来唯一,为多个字段添加约束,要用表级约束
);
create table t_vip(
id int,
name varchar(255) not null unique // MySQL中自动变为主键,一般用主键实现
);
一行记录的唯一标识,只有一个,任何一张表都有主键,否则无效
主键特征:not null + unique
主键一般是定长,不建议用varchar
主键自增
create table t_vip(
id int primary key auto_increment, // 从1开始
name varchar(255)
);
insert into t_vip(name) values('zhangsan');
insert into t_vip(name) values('zhangsan');
复合主键 #了解#
create table t_vip(
id int,
name varchar(255),
email varchar(255),
primary key(id,name)
);
外键至少具有unique约束,可以为NULL
create table t_class(
classno int primary key,
classname varchar(255)
);
create table t_student(
no int primary key auto_increment,
name varchar(255),
cno int,
foreign key(cno) references t_class(classno)
);
%Y | %m | %d | %h | %i | %s |
---|---|---|---|---|---|
年 | 月 | 日 | 时 | 分 | 秒 |
date 默认格式:%Y-%m-%d
datetime 默认格式:%Y-%m-%d %h:%i:%s
create table t_user(
id int,
name varchar(32),
birth date,
create_time datetime
);
insert into t_user (id, name, birth) values (1, 'zhangsan', str_to_date ('01-10-1990','%d-%m-%Y'));
insert into t_user(id,name,birth) values(2, 'lisi', '1990-10-01'); // 使用默认格式,str_to_date函数就不需要
select id,name,date_format(birth, '%m/%d/%Y') as birth from t_user;
select id,name,birth from t_user; // 自动将date转换成varchar
date 年月日
datetime 年月日时分秒
insert into t_user(id,name,birth,create_time) values(1,'zhangsan','1990-10-01','2020-03-18 15:49:50');
str_to_date 和 date_format 也可用于 datatime 类型
获取系统当前时间(datetime)
insert into t_user(id,name,birth,create_time) values(2,'lisi','1991-10-01',now());
%% SQL 不区分大小写,要以 ; 结尾 %%
数据查询语言
Select
数据定义语言 (增删改),操作表结构
create 表名:建议以 t_
或者 tbl_
开始
create table 表名(
字段名1 数据类型,
字段名2 数据类型,
字段名3 数据类型
);
create table t_student( // 括号里的只是建议长度
no int(11),
name varchar(32),
sex char(1) default 'm', // 指定默认值
age int(3),
email varchar(255)
);
快速创建表:将一个查询结果当做一张表新建(包含表结构和数据) #了解#
create table emp2 as select * from emp;
drop
drop table t_student; // 表不存在时报错
drop table if exists t_student;
truncate:删除表中所有数据,物理删除,快速,不支持回滚
truncate table dept_bak;
alter:很少修改表结构 #了解#
数据操作语言 (增删改),操作表数据
insert into 表名 (字段名 1, 字段名 2, 字段名 3…) values (值 1, 值 2, 值 3);
字段名和值要一一对应
insert into t_student(no,name,sex,age,email) values(1,'zhangsan','m',20,'zhangsan@123.com');
insert into t_student(email,name,sex,age,no) values('lisi@123.com','lisi','f',20,2);
字段名省略,值都要写上
insert into t_student values(2,'lisi','f',20,'lisi@123.com');
没有给其它字段指定值,默认值是 NULL
insert into t_student(no) values(3);
一次插入多条记录:insert into t_user(字段名1,字段名2) values(),(),(),();
insert into t_user(id,name,birth,create_time) values
(1,'zs','1980-10-11',now()),
(2,'lisi','1981-10-11',now()),
(3,'wangwu','1982-10-11',now());
delete from 表名 where 条件;
效率低,支持回滚(对比truncate)
delete from t_user where id = 2;
delete from t_user; // 没有 where 条件,整张表的数据会全部删除
update 表名 set 字段名 1 = 值 1, 字段名 2 = 值 2 … where 条件;
update t_user set name = 'jack', birth = '2000-10-11' where id = 2;
update t_user set name = 'abc'; // 没有 where 条件,更新所有
事务控制语言
事务提交 commit
事务回滚 rollback
数据控制语言
授权 grant
撤销权限 revoke
存储引擎是MySQL中特有的术语,表存储数据的方式
create table t_product(
id int primary key,
name varchar(255)
)engine=InnoDB default charset=gbk;
MySQL默认存储引擎:InnoDB,默认字符编码方式:utf8
select version();
show engines \G
commit;
默认每执行一条DML语句,提交一次
start transaction; // 相当于关闭自动提交机制
insert into dept_bak values(20,'abc', 'tj');
commit;
select * from dept_bak;
rollback;
select * from dept_bak;
rollback;
回滚到上一次的commit
start transaction;
insert into dept_bak values(10,'abc', 'tj');
select * from dept_bak;
rollback;
select * from dept_bak;
查看隔离级别
select @@tx_isolation;
修改隔离级别
set global transaction isolation level read committed;
create view
emp_dept_view
as // 必须是DQL语句
select
e.ename,e.sal,d.dname
from
emp e
join
dept d
on
e.deptno = d.deptno;
drop view dept2_view;
mysql> create index emp_ename_index on emp(ename);
mysql> drop index emp_ename_index on emp;
explain select * from emp where ename = 'KING'; // 若type=ALL,说明没有使用索引
表必须有主键,每一个字段原子性不可再分。
学生编号 | 学生姓名 | 联系方式 |
---|---|---|
1001 | 张三 | zs@gmail.com,1359999999 |
1002 | 李四 | ls@gmail.com,13699999999 |
1001 | 王五 | ww@163.net,13488888888 |
改为 |
学生编号(pk) | 学生姓名 | 邮箱地址 | 联系电话 |
---|---|---|---|
1001 | 张三 | zs@gmail.com | 1359999999 |
1002 | 李四 | ls@gmail.com | 13699999999 |
1003 | 王五 | ww@163.net | 13488888888 |
在第一范式的基础上,所有非主键字段完全依赖主键,不要产生部分依赖。
学生编号 | 学生姓名 | 教师编号 | 教师姓名 |
---|---|---|---|
1001 | 张三 | 001 | 王老师 |
1002 | 李四 | 002 | 赵老师 |
1003 | 王五 | 001 | 王老师 |
1001 | 张三 | 002 | 赵老师 |
张三依赖1001,王老师依赖001,产生了部分依赖 | |||
改为 |
学生编号(pk) | 学生名字 |
---|---|
1001 | 张三 |
1002 | 李四 |
1003 | 王五 |
教师编号(pk) | 教师姓名 |
---|---|
001 | 王老师 |
002 | 赵老师 |
id(pk) | 学生编号(fk) | 教师编号(fk) |
---|---|---|
1 | 1001 | 001 |
2 | 1002 | 002 |
3 | 1003 | 001 |
4 | 1001 | 002 |
在第二范式的基础上,所有非主键字段直接依赖主键,不要产生传递依赖。
学生编号 | 学生姓名 | 班级编号 | 班级名称 |
---|---|---|---|
1001 | 张三 | 01 | 一年一班 |
1002 | 李四 | 02 | 一年二班 |
1003 | 王五 | 03 | 一年三班 |
1004 | 张三 | 03 | 一年三班 |
一年一班依赖01,01依赖1001,产生了传递依赖
改为
班级编号(pk) | 班级名称 |
---|---|
01 | 一年一班 |
02 | 一年二班 |
03 | 一年班 |
学生编号(pk) | 学生名字 | 班级编号(fk) |
---|---|---|
1001 | 张三 | 01 |
1002 | 李四 | 02 |
1003 | 王五 | 03 |
1004 | 赵六 | 03 |
一对多:两张表,多的表加外键 第三范式
多对多:三张表,关系表两个外键 第二范式
一对一:外键唯一,一张表字段太多时,要拆分表
数据库三范式可以避免表中数据的冗余,但实际中,为了满足客户的需求,有时会拿冗余换执行速度