登陆
mysql -uroot -p
退出
exit
quit
远程登陆
mysql -h ip -uroot -p 密码
ip为其地址
mysql --host=ip --user=root --passward=密码
mysql目录结构
安装目录
- bin
- data
- include
- lib
- share
- my.ini 配置文件
数据目录
- ProgramDate 隐藏文件
- data
- mysql
SQL
结构化查询语言,
关系型数据库语言规范,不同数据库存在方言
通用命令
- SQL 语句可以单行或者多行书写,以分号结尾。
- 不区分大小写,关键字建议大写
- 可以使用空格缩进增加可读性
注释
- 单行注释
– 注释内容,
#注释内容
- 多行注释
/* 注释*/
SQL分类
- DDL
操作数据库表 - DQL
查寻表中数据 - DML
增删改表中的数据 - DCL
授权
DDL
操作数据库
CRUD
- C(Create):创建
- R(Retrieve):查询
- U(Update):修改
- D(Delete):删除
- 使用数据库
查询
show databases 查询所有数据库
show create database mysql 查询某个数据库
创建
create database 名字
create database if not exists 数据库名字 不存在才创建
create database 数据库名字character set gbk 创建指定字符集的数据库
修改
alt database 数据库名字 character set 字符集名字
删除
drop database 数据库名字
drop database if exists 数据库名字
如果存在才删除
使用数据库
selsct database() 查询当前正在使用的数据库
use 数据库 使用数据库
DQL操作表
show tables; 查询某个数据库所有表名称
desc 表名; 查询表结构
//创建表
create table 表名(
列名1 数据类型1,
列名2 数据类型2,
·····
列名n 数据类型n
);
* 最后一列不需要逗号
数据库类型
- int 整数类型
age int;
- double 小数类型
score double(5,2)
- data 日期
yyyy-MM-dd
- datatime 日期
yyyy-MM-dd HH-mm-ss
如果不给这个字段赋值,或者为null ,默认当前系统时间
- varchar 字符串
name varchar(20) 姓名最大字符长度20
表操作
drop table if exists 表名; 删除表
show tables ;查看所有表
desc 表名;查询表结构
create table 表名字 like 表名字;复制
- 修改表
alter table 表名 rename to 新的表名 ;修改表的字符集
alter table 表名 character set 字符集名称; 修改表的字符集
alter table 表名 add 列名 数据类型;添加一列
alter table 表名 change 列名 新列名 新数据类型;修改列名称,列类型
alter table 表名 modefy 列名 新数据类型;
alter table 表名 drop 列名;删除列
DML 增删改表数据
添加数据
insert into 表名(列名1,列名2·····列名n) values (值1,值2···值n);
如果不定义列名,默认给所有列添加值
查询数据
SELECT FROM 表名;
删除数据
delete from 表名 [ where 条件]
如果没有写条件,就是删除表所有记录
truncate table 表名;先删除表,然后再创建一个一模一样的表
修改数据
updata 表名 set 列名1=值1,列名2=值2,···[where 条件]
注意: 如果不加任何条件,会将表所有记录修改
DQL 查询表记录
语法:
select from 表名;
select
字段列表
from
表名列表
where
条件列表
groupby
分组字段
order by
排序
limit
分页限定
select * from 表名;查询所有
去除重复的结果集
select distinct 列名 from 表名;
计算 math和english 分数之和
select name,math,english,math+english from student;
如果有null参与的运算,计算结果都为null
select name,math,english,math+ifnull(english ,0) from student;
起别名
select name,math,english,math+ifnull(english ,0) as 总分 from student;
基础查询
----- 多个字段查询
select 字段1,字段2···from 表名;
注意:如果查询所有字段,则可以使用*代替
-----去除重复
distinct
----- 计算列
一般可以用四则运算计算一些列
注意:null参与的运算,计算结果都为null
------ ifnull(表达式1,表达式2):
表达式1:那个字段需要判断是否为null
表达式2:该字段为null的替换值
-------起别名
as:as也可以省略
计算 math和english 分数之和
select name,math,english,math+english from student;
如果有null参与的运算,计算结果都为null
select name,math,english,math+ifnull(english ,0) from student;
起别名
select name,math,english,math+ifnull(english ,0) as 总分 from student;
条件语句
where后面加条件
select * from student where age>20;
select * from student where age=20;
逻辑符号
&& AND
null不能用=修饰,用is is not修饰
between···and
in(集合)
------ like
//查询姓马的有哪些
select *from student where name like '马';
//查询姓名第二个字是化的人
select *from student where name like "_化%";
//查询姓名是三个字的人
select *from student where name like "___";
//查询姓名中包含马的人
select *from student where name like "%马%";
------ is null
//查询英语成绩不为null
select *from student where english is not null;
and &&am***ot !
DQL:查询语句
排序查询
语法:
order by 子句
order by 排序字段1 排列方式1,排序字段2 排列方式2,···
排序方式:
asc:升序 默认
desc:降序
注意:如果有多个排序条件,则当前面排序值一样时才会判断第二排序条件
聚合函数
将一列数据作为一个整体,进行纵向计算。
count:计算个数
采用非空列:使用主键
使用 *
max:计算最大值
min:计算最小值
sum:求和
avg:求平均数
注意:聚合函数自动排除null值
select count(name) from student;
select count(ifnull(english,0) from student;
select count(*) from student;
分组查询
语法:group by 分组字段
-----按照性别分组,分别查男女数学平均分
select sex,avg(math),count(id) from student group by sex;
----分数低于70不参与分组
select sex,avg(math),count(id) from student wheremath>70 group by sex;
注意:
分组之后查询的字段:分组字段,聚合函数
where在分组之前限定,如果不满足条件,则不参与分组
having在分组之后进行限定,如果不满足结果,则不会被查询出来
where后不可以跟聚合函数,having可以进行聚合函数的判断
分页查询
语法:limit开始的索引,每页查询的条数
公式:开始的索引=(当前页码-1)*每页显示的条数
----每页显示三条记录
select *from student limit 0,3; --第一页
select *from student limit 6,3; --第三页
分页操作是方言,不同数据库分页操作不一样。
约束
概念
对表中的数据进行限定,保证数据的正确性,有效性,完整性
分类
主键约束:primary key
- 非空且唯一
- 一张表只能有一个字段为主键
- 主键是表中记录的唯一标识
//创建表添加主键约束
create table luo(
id int primary key, --给id添加主键约束
name varchar(20)
);
//删除主键
alter table luo drop primary key;
//创建完后,添加主键
alter table luo modify id int primary key;
// 自动增长
如果某一列是数值类型,使用auto_increment 可以来完成值的自动增长
//创建表添加主键约束,并且完成主键的自增长
create table luo(
id int primary key auto_increment, --给id添加主键约束
name varchar(20)
);
非空约束:not null
//创建表添加约束
create table luo(
id int,
name varchar(20) not null --name非空
);
//创建完了,添加约束
alter table luo modify name varchar(20) not null;
//删除非空约束
alter table luo modify name varter(20);
唯一约束:unique
//创建表添加约束
create table luo(
id int,
phone_number varchar(20) unique --添加唯一约束
);
--注意:唯一约束限定的值可以有多个null
//删除唯一约束
alter table luo drop index phone_number;
//创建完了,添加约束
alter table luo modify phone_number varchar(20) unique;
外键约束:foreign key
让表与表产生关系,从而保证数据的正确性
//在创建表时,可以添加外键
create table 表名(
....
外键列,
constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称)
);
//删除外键
alter table 表名 drop foreign key 外键名称;
//创建之后,添加外键
alter table 表名 add constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称)
级联
// 添加级联操作
alter table 表名 add constaint 外键名称
foreing key(外键字段名称) references 主表名称(主表列名称)on update cascade on delete cascade;
//分类
级联更新
on update cascade
级联删除
on delete cascade
数据库的设计
多表之间的关系
- 一对一
如:人与身份证。一个人对应一个身份证,一个身份证对应一个人
实现方式:一对一关系实现,可以在任意一方添加唯一外键指向另一方的主键。
- 一对多
如:部门和员工
实现方式:在多的一方建立外键,指向一的一方的主键。
- 多对多
如:学生和课程
实现方式:多对多关系实现需要借助第三张中间表,中间表至少包含两个字段,这两个字段作为第三张表的外键,分别指向两张表的主键。
数据库的设计范式
范式是符合某一种级别的关系模式的集合。构造数据库必须遵循一定的规则。在关系数据库中,这种规则就是范式。关系数据库中的关系必须满足一定的要求,即满足不同的范式。
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、Boyce-Codd范式(BCNF)、第四范式(4NF)和第五范式(5NF)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多要求的称为第二范式(2NF),其余范式以次类推。
第一范式(1NF)
第一范式就是无重复的列。
第二范式(2NF)
在1NF的基础上,非码属性必须完全依赖于候选码(在1NF的基础上消除了非主属性对主码的部分函数依赖)
函数依赖
A–>B,如果通过A属性(属性组)的值,可以确定唯一B属性的值。则称B依赖于A
例如:学号–>姓名 (学号,课程名称)—>分数
完全函数依赖
A–>B,如果A是一个属性组,则B属性值的确定需要依赖于A属性组中所有的属性值。
例如:(学号,课程名称)—>分数
部分函数依赖
A–>B,如果A是一个属性组,则B属性值的确定需要依赖于A属性组中某一些值即可。
例如:(学号,课程名称)—>姓名
传递函数依赖
A–>B,B–>C。如果通过A属性(属性组)的值,可以确定唯一B属性的值,如果通过B属性(属性组)的值,可以确定唯一C属性的值,则称C传递函数依赖于A。
例如:学号-->系名,系名–>系主任。
码
如果在一张表中,一个属性或者属性组,被其他所有属性所完全依赖,则称这个属性(属性组)为该表的码
例如:该表中码为:(学号,课程名称)
- 主属性
码属性组中的所有属性
- 非主属性
除过码属性组的属性
第三范式(3NF)
在2NF的基础上,任何非主属性不依赖于其他非主属性(在2NF基础上消除传递依赖)
数据库的备份和还原
命令行
备份:mysqldump -u用户名 -p密码 > 保存的路径
还原:
1.登陆数据库
2.创建数据库
3.使用数据库
4.执行文件。 source 文件路径
多表查询
查询语法:
select
列名列表
from
表名列表
where···
准备SQL
笛卡尔积:
有两个集合A,B,取这两个集合的所有组成情况
要完成多表查询,需要消除无用的数据
多表查询
1.内连接查询
隐式内连接
用where条件消除无用信息
显式内连接
select 字段列表 from 表名1 (inner) join 表名2 on 条件
内连接查询注意:
(1)从那些表中查询
(2)条件是什么
(3)查询那些字段
2.外链接查询
1.左外连接
select 字段列表 from 表1 left (outer) join 表2 on 条件
查询的是左表所有数据和交集的部分
2.右外连接
select 字段列表 from 表1 right (outer) join 表2 on 条件
查询的是右表所有数据和交集的部分
表1: Person
+-------------+---------+
| 列名 | 类型 |
+-------------+---------+
| PersonId | int |
| FirstName | varchar |
| LastName | varchar |
+-------------+---------+
PersonId 是上表主键
表2: Address
+-------------+---------+
| 列名 | 类型 |
+-------------+---------+
| AddressId | int |
| PersonId | int |
| City | varchar |
| State | varchar |
+-------------+---------+
AddressId 是上表主键
编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:
FirstName, LastName, City, State
select
p.FirstName,p.LastName,a.City,a.State
from
Person p left join Address a on p.PersonId=a.PersonId
3.子查询
查询中嵌套查询,称嵌套查询为子查询
例如:查询工资最高的员工信息
select max(salary) from emp;
select *from emp where emp.salary=9000;
select *from emp where emp.salary=(select max(salary) from emp);
子查询不同情况
1.子查询的结果是单行单列的
子查询可以作为条件,使用运算符去判断,运算符> >= < <= =
2.子查询的结果是多行单列的
子查询可以作为条件,使用运算符in去判断
3.子查询的结果是多行多列的
子查询可以做一张虚拟表参与查询
between and 在---之间
事物
事务的基本介绍
- 概念
如果一个包含多个步骤的业务操作,呗事务管理,那么这些操作要么同时成功,要么同时失败
- 操作
1.开启事务
start transaction
2.回滚
rollback
3.提交
commit
4.mysql数据库中事务默认自动提交
事务提交的两种方式
手动提交:
- gracle数据库默认是手动提交事务
- 需要先开启事务,再提交
自动提交
- mysql就是默认自动提交
- 一条dml语句会自动提交一次事务
修改事务的默认提交方式
- 查看事务的默认提交方式
select @@autocommit; --1 代表自动提交 0 代表手动提交
- 修改默认提交方式
set @@autocommit=0;
p520
事务的四大特征
- 原子性
不可分割的最小单位
- 持久性
当事务提交或回滚后,数据库会持久化的保存数据
- 隔离性
多个事务,相互独立
- 一致性
事务操作前后,数据总量不变
事务的隔离级别
概念:多个事务之间相互隔离,相互独立的,但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。
存在问题
- 脏读
一个事务,读取到另一个事务中没有提交的数据
- 不可重复读
在同一个事物中,两次读取的数据不一样
- 幻读
一个事务操作(dml)数据表中所有记录,另一个添加了一个数据,则第一个事务查询不到自己的修改。
隔离级别
read uncommitted :读未提交
产生的问题:脏读,不可重复读,幻读
read committed:读已提交(Oracle默认)
产生的问题:不可重复读,幻读
repeatable read:可重复读(mysql默认)
产生的问题:幻读
serializable:串行化
可以解决所有的问题
注意:隔离级别从小到大安全性越来越高,但是效率越来越低
数据库设置隔离级别
查询隔离级别
select @@tx_isolation;
设置隔离级别
set global transaction isolation level 级别字符串;
DCL
管理用户,授权
- BDA 数据库管理员(公司专门有一个职位)
管理用户
1.添加用户
create user '用户名@主机名' identified by '密码';
2.删除用户
drop user '用户名@主机名';
3.修改用户密码
update user set password=password('新密码') where user='新密码';
set password for '用户名@主机名'=password('新密码');
mysql中忘记了root用户的密码
1.cmd-->net stop mysql 停止mysql服务
*需要管理员运行cmd
2.使用无验证方式启动mysql服务:
mysql --skip -grant -tables
3.打开新的cmd窗口,直接输入mysql命令,敲回车,就可以登陆成功
4.use mysql;
5.update user set password=password('你的新密码') where user ='root';
6.关闭两个窗口
7.打开任务管理器,手动结束mysql.exe的进程
8.启动mysql服务
9.使用新密码登陆
4.查询用户
--切换到mysql数据库
use mysql;
--查询user表
select * from user;
*通配符:% 表示可以在任意主机使用用户登陆数据库
权限管理
- 查询权限
--查询权限
show grants for '用户名@主机名';
- 授予权限
--授予权限
grant 权限列表 on 数据库名.表名 to '用户名@主机名';
- 撤销权限
--撤销权限
revoke 权限列表 on 数据库名.表名 from '用户名@主机名';