常用命令
查看版本:
mysql --version
mysql -V
登录后: >selectversion();
查看现有数据库:
show databases;
使用某个数据库:
use 数据库;
查看所选数据库中的表:
show tables;
查看当前位置:
select database();
查看某个数据库中的表:
select tables from 数据库;
退出:
exit;
Ctrl+c
创建数据库:
create database 数据库;
删除数据库:
drop database 数据库;
数据库中导入sql:
source 路径/文件.sql;
显示表结构:
desc 表名;
模糊查询含char的mysql变量:
show variables like '%char%';
查看表的创建语句:
show create table 表名\G / 表名;
创建数据库用户:
create user 用户名 identified by '密码';
用户授权:
grant all on 数据库.* to 用户名;
简单查询
查询所有值
select * from table;
查询值as别名
select ename name from table;(select ename as name from table);
数据排序
order by (字段名/字段下标值)... asc(desc):根据指定排序 升(降)
处理函数
lower(字符串)
upper(字符串)
substr(被截取字符串,起始下标(1),截取长度)
length(字符串长度)
trim(字符串)
round(数值(四舍五入值),整数(0:个位,正整数:小数位,负整数:整数位))/round(数值(默认舍到个位))
rand()
case...when...else...end 匹配值
ifnull(value,0) 当value值为null时,设值为0
str_to_date('日期字符串','日期格式')
date_format(日期类型数据,'日期格式')
分组函数/聚合函数/多行处理函数:分组函数自动忽略空置,不需要手动添加where条件排除空值;不能直接使用在where关键字后面
sum(字段)
avg(字段)
max(字段)/min(字段)
count(字段/*)
distinct 字段,字段... 单字段去重/多字段联合去重
group by 字段,字段... 分组
group by...having... 对分组数据继续过滤
select语句总结
select 5.对当前临时表进行整列读取
....
from 1.将硬盘上的表文件加载到内存
....
where 2.将符合条件的数据行过滤出来,生成一张临时表
....
group by 3.根据列中的数据种类,将当前临时表划分成若干个新的临时表
....
having 4.过滤掉group by生成的不符合条件的临时表
....
order by 6.对select生成的临时表进行重新排序,生成新的临时表
....
limit 7.对最终的临时表进行截取
....
SQL分类:
DQL语句 数据查询语言 select
DML语句 数据操作语言 insert delete update
DDL语句 数据库定义语言 create drop alter
TCL语句 事物控制语言 commit rollback
mysql日期格式
%Y:代表四位的年份 %y:代表两位的年份
%m:代表月(01..12) %c:代表月(1..12)
%d:代表日
%H:代表24小时制 %h:代表12小时制
%i:代表分钟 %S/%s:代表秒
连接查询/跨表查询
笛卡尔积现象:若两张表进行连接查询时没有任何条件限制,最终的查询结果为两张表记录的乘积
分类:
年代:
SQL92
select e.ename,d.dname
from em as e,dm as d
where e.s = d.s;
SQL99
select e.ename,d.dname
from em as e
join dm as d
on e.s = d.s;
连接方式:
内连接(省略了inner关键字)
等值连接
select e.ename,d.dname
from em as e
(inner) join dm as d
on e.s = d.s;
非等值连接
select e.ename,d.dname
from em as e
join dm as d
on e.s between d.s and d.s1;
自连接(把一张表看成两张表)
select e.ename,d.ename as dname
from em as e
join em as d
on e.s = d.r;
外连接:a表b表能够完全匹配的记录查询出来外,将其中一张表的记录无条件的完全查询出来,另一张表没有匹配记录时,会自动模拟出null值与之匹配省略了outer关键字)
左连接:左边表的全部行与右边表的匹配行
select e.ename,d.dname
from em as e
left (outer) join dm as d
on e.s = d.s;
右连接:右边表的全部行与左边表的匹配行
select e.ename,d.dname
from em as e
right (outer) join dm as d
on e.s = d.s;
全连接
多个join..on..,按顺序分别进行匹配
子查询:select语句嵌套select语句
select...(select)
from...(select)
where...(select)
union合并集合
select ename from emp where job='a'
union
select ename form emp where job='b'
limit使用(mysql特有,获取表中前几行或某几行数据)
limit 下标位置(0开始),截取长度 如果不写下标位置默认为0
分页:
页码:pageNo
数据量:pageSize
查询:limit(pageNo-1)*pageSize,pageSize
表
DDL:
create table 表名(
字段名称 字段类型 字段长度 字段约束,
字段名称 字段类型 字段长度 字段约束
);
drop table 表名;
drop table if exites 表名;(mysql)
复制表:create table 表名 as 查询语句
alter table 表名 add 字段名 字段类型;
alter table 表名 modify 字段名 字段类型;
alter table 表名 drop 字段名;
alter table 表名 change 原字段名 新字段名 字段类型;
DML:
insert into 表名(字段名,字段名,...) values(字段值,字段值,...);
insert into 表名 查询语句; 快速插入
update 表名 set 字段名称 = 字段值,字段名称 = 字段值 where 限制条件; 不加where直接更新所有该字段值
delete from 表名 where 限制条件; 不加where直接删除表中所有数据
约束:
not null 非空约束
unique 唯一性约束
constraint 别名 unique(字段,字段...) 约束起别名,可用于查找删除
primary key 主键约束(mysql提供自增数字auto_increment,专门生成主键)
foreign key 外键约束,foreign key(字段) references 表名(字段),被引用的字段必须具有unique约束,外键值为空的数据为孤儿数据
级联更新与级联删除
在添加级联更新与级联删除时,需要在外键约束后面添加关键字
级联删除:在删除父表数据的时候,级联删除子表中数据
on delete cascade
级联更新:
on update cascade
存储引擎
本质:mysql特有
·通过采用不同的技术将数据存储在文件或内存中
·每一种技术都有不同的存储机制,不同的存储机制提供不同的功能与能力
·通过选择不同的技术,可以获得额外的速度或功能,改善我们的应用
使用ENGINE为create table指定存储引擎
create table table_name(
no int
)ENGINE = MyISAM;
当创建表时没有指定存储引擎,则使用当前默认的存储引擎;默认存储引擎在my.ini配置文件中使用default-storage-engine 指定;
修改表存储引擎:alter table 表名 ENGINE = 存储引擎名称;
查看表使用存储引擎:
show create table 表名\G;
show table status like '表名'\G;
常用存储引擎:
MyISAM存储引擎:mysql数据库最常用的,适用于大量数据读而少量数据更新的混合操作
管理表对应文件:
格式文件——存储表的结构(mytable.frm)
数据文件——存储表的数据(mytable.MYD)
索引文件——存储表的索引(mytable.MYI)
可转换为压缩,只读表来节省空间
InnoDB存储引擎:mysql默认存储引擎,适用于较多的数据更新
每个InnoDB表在数据库目录中以.frm格式文件表示
InnoDB表空间tablespace被用来存储表的内容
提供一组用来记录事务性活动的日志文件
用COMMIT、SAVEPOINT以及ROLLBACK支持事物处理
提供全部ACID兼容(数据库事物正确执行四个基本要素:原子性(Atomicity),一致性(Consistency),隔离性(Isolation),持久性(Durability))
在mysql服务器崩溃后提供自动恢复
多版本(MVCC)和行级锁定
支持外键及引用的完整性,包括级联更新和删除
MEMORY存储引擎:适用于存储非永久需要的数据
使用memory存储引擎的表,数据存储在内存中,且行的长度固定
在数据库目录内,每个表均以.frm格式文件表示
表数据及索引被存储在内存中
表级锁机制
字段属性不能包含text或blob字段
memory存储引擎之前被称为heap引擎
事物Transaction
四个特性:
原子性(Atomicity)
事务是最小单位,不可再分
一致性(Consistency)
事务要求的DML语句操作的时候,必须保证同时完成或同时失败
隔离性(Isolation)
一个事务不会影响其他事务的运行
持久性(Durability)
在事务完成之后,该事务对数据库所做的更改将持久的保存在数据库中,并不会回滚
开启事务:start transaction
任何一句DML语句执行,执行事务的开启
结束事务:end transaction
提交或者回滚
提交事务:commit transaction
回滚事务:rollback transaction
在事务进行过程中,未结束之前,DML语句不会修改底层数据库文件中的数据;只是将历史操作记录一下,在内存中完成记录;只有在事务结束,而且成功结束时才会修改底层硬盘文件中的数据;
mysql默认事务:自动提交show variable like '%commit%';
事务隔离级别:
read uncommitted 读未提交(级别最低) 有脏读产生
read committed 读已提交 读到的数据会因为其他的事务而改变
repeatable read 可重复读(默认) 读到的数据只会是开始读的数据,不受其他事务影响
serializable 串行化 使事务串行执行
查看隔离级别:
当前会话级隔离级别
select @@tx_isolation;
select @@session.tx_isolation;
全局隔离级别
select @@global.tx_isolation;
设值服务器默认隔离级别:
修改my.ini配置文件
在my.ini文件中的[mysqld]下面添加:
transaction-isolation = READ-COMMITTED
隔离级别:
READ-UNCOMMITTED
READ-COMMITTED
REPEATABLE-READ
SERIALIZABLE
通过命令方式设值事务隔离级别
set transaction isolation level isolation-level;
isolation-level:
READ-UNCOMMITTED
READ-COMMITTED
REPEATABLE-READ
SERIALIZABLE
设置隔离级别作用范围:默认session
set global transaction isolation level isolation-level;
索引
主键自动添加索引
索引与表相同,存储在硬盘文件中,索引是表的一部分
mysql数据库中表的检索方式:
全表扫描
通过索引检索
视图
视图也对应一个查询结果,只是从不同的角度查看数据
语法类似于table
create view 视图名 as 查询语句;
视图能隐藏表的实现细节
提高检索效率
DBA命令
数据库底层授权操作
数据库设计三范式
第一范式:要求有主见,数据库中不能出现重复记录,每一个字段是原子性不能再分;
第二范式:第二范式是建立在第一范式的基础上,要求 数据库中所有非主键字段完全依赖主键,不能产生部分依赖;(尽量不要使用联合外键)
第三范式:建立在第二范式基础上,要求非主键字段不能产生传递依赖于主键字段;