MySQL数据库
2020-07-11 本文已影响0人
极速魔法
windows 命令行
net start mysql57 // 关闭
net stop mysql57 // 停止
mysql语句
-- 短划线后面空格+注释内容
/* mysql注释*/
# 注释
use db1 -- 切换数据库
SELECT DATABASE() -- 查看当前数据库
CREATE DATABASE DB1 CHARACTER SET utf8 -- 设置字符集
CREATE TABLE new LIKE old -- 复制表
DESC test -- 查看表结构
SHOW CREATE TABLE test -- 查看创建表语句
mysql数据类型
- int
- double
- varchar 可变长度
- char 字符串类型,固定长度
- date yyyy-MM-dd 日期
- datetime yyyy-MM-dd HH:mm:ss
修改表
RENAME TABLE old TO new; -- 修改表名
ALTER TABLE test CHARACTER SET uft8 -- 修改表字符集
ALTER TABLE test ADD name VARCHAR(20); -- 向表添加字段
ALTER TABLE test MODIFY name VARCHAR(50); -- 修改表字段name的类型
ALTER TABLE test CHANGE old new CHAR(30); -- 修改表字段old为 new new CHAR(30)
ALTER TABLE test DROP name; -- 删除表字段 name
插入数据
char,varchar,date 类型数据用单引号或双引号包裹
删除数据
TRUNCATE TABLE test -- 删除表中所有数据,整个表删除,再创建一个一样的新表
查询操作不会对数据表的数据进行修改
条件查询 先取出表中每条数据,满足的就返回,不满足的就过滤。
!= ,<> -- 不等于
BETWEEN a AND b -- [a,b]
IN(a,b,c) -- 包含元素a,b,c
LIKE '%a%' -- % 表示匹配任意多个字符
_ -- 匹配一个字符
... WHERE name IS NULL -- 查询字段空值
... WHERE name IS NOT NUL -- 查询字段不为空值
排序
-- 组合排序
... ORDER BY id DESC,salary DESC
聚合
count() 忽略空值
分组
分组返回的是第一条数据
SELECT * FROM emp GROUP BY sex
分组之后过滤 having
SELECT XX,AVG(salary) FROM xx WHERE xx HAVING AVG(salary) > 6000
- where 分组前过滤,不能跟聚合函数
- having 分组后过滤,可以跟聚合函数
limit
limit offset,lenght 格式 offset从 0 开始,数据库 id从1 开始
Primary key 唯一,非空约束
ALTER TABLE test ADD PRIMARY KEY(id) -- 添加主键
ALTER TABLE test DROP PRIMARY KEY -- 删除主键
CREATE TABLE xx (
...
)AUTO_INCREMENT=100 -- 自定义自增的起始位置
delete删除对自增没有影响,truncate 自增从1开始
唯一约束对null值不做唯一判断,也就是可以有多条记录为null值
事务
mysql 默认开启自动事务提交
事务特性
- 原子性,事务是整体不可分割
- 一致性,执行前后状态一致,例如金额总和
- 隔离性,事务之间不相互影响
- 持久性,对数据的修改是保存的
外键约束
外键可以是空值,但为空的数据跟与之相关联的表就没有关系了
-- 新加表 外键约束
...
constraint emp_dept_fk FOREIGN KEY(dept_id) references depart(id);
-- 删除外键约束
ALTER TABLE emp DROP FOREIGN KEY emp_dept_fk;
-- 添加外键
ALTER TABLE emp ADD 【constraint emp_dept_fk】 FOREIGN KEY(dept_id) references depart(id);
删除数据,先删除从表中数据,再删主表数据
级联删除
ON DELETE CASCADE
删除主表的同时,关联的从表数据也删除
多表关系
一对多 ,多的一方建立外键,一的一方建立主键
一对一,任意一方设置外键,外键设置为 unique
多表查询给表起别名简化 书写
隐式内连接
, 连接两张表 where 条件
显示内连接
INNER join 连接两张表
查询步骤
- 查询几张表
- 查询的连接条件
- 查询的字段
- 查询条件
外连接
左外接
以左表为基准
SELECT 字段名 FROM 左表 LEFT [OUTER] JOIN 右表 ON 条件
右外接
以右表为基准
SELECT 字段名 FROM 左表 RIGHT [OUTER ]JOIN 右表 ON 条件
子查询
1.where型,一个字段
2.from型,多个字段,子查询结果作为一张表要起别名
3.exist,单列多行,配合in 使用
select 字段 from 表 where 字段 in (子查询)
索引
-- 创建uniqu索引
create unique index ind on demo1(hobby);
-- 删除索引
alter table demo1 drop index ind;
视图
查询结果形成的一张虚拟的表,当做只读表
删除表,视图不起作用了
create view 视图名[字段] as select 查询语句;
存储过程
一堆sql语句的合并,加入一些逻辑控制
delimiter $$ -- 声明语句的结束符合
create procedure 存储名称() -- 声明存储过程
create procedure 存储名称(in 参数名称 参数类型) -- 声明存储过程带参数
begin
-- sql语句
end $$
-- 调用存储过程
call 存储名称;
-- 变量赋值
set @变量名 = 值
-- 返回值定义
out 变量名 类型
-- 返回数据
select @out_num;
call(1,2,3,@out_num);
触发器
执行sql语句,自动触发其他sql语句执行
delemeter $
-- 创建触发器
create triger t1
-- 触发的时间,监视的事件,表
after insert on orders
-- 行触发器
for each row
begin
update goods set num= num -1 xxx;
end $
用户权限
-- 授权
grant 权限 on 数据库.表 to ‘用户名’@‘主机名’;
-- 查看授权
show grants for ‘用户名’@‘主机名’;
数据库备份
mysqldump -uroot -p1234 db2 > 文件路径
命令行导出没有创建数据库语句,手动创建
进入mysql命令行
source 文件路径