一、库管理
查看库
创建库
- 语法:CREATE DATABASE 库名称 [字符集DEFAULT charset=utf8] #[]代表可以不写
- 库的命名规则
- 可以使用数字、字母、下划线
- 不能使用纯数字
- 库名区分大小写
- 库名必须唯一
- 不能使用特殊字符和MySQL关键字
create databast name-ku;create databast name-ku character set utf8 collate utf8_bin;
进入库/切换库
查看库
- 查看当前库:
select database;
- 查看某个库建库的语句
show create database ;
- 查看库中有哪些表
二、表管理
数据类型
数值类型
- 整数型:TINYINT, INT, BITINT
- 浮点数: DECIMAL(16, 2)
使用注意:整数要注意存储范围 浮点数要注意精度
字符类型
1)定长字符(CHAR)- 最大存储255个字符
- 定义长度后,如果数据不足,自动补充空格
- 超过长度无法存入
- 如果不设置长度,默认长度为1
2)变长字符(varchar)
- 最大存储65535个字节- 实际存储空间根据实际数据进行分配- 长度超过定义长度时无法存入
3)大文本类型(TEXT)
- 能存储超过65535字符的数据
- 最大可以存储4G的数据
- 枚举
- ENUM:从给定的几个值中选取1个
- SET: 从给定的值中选取1个或多个
- 日期时间类型
- 语法 ```sql CREATE TABLE 表名称( 字段1 类型(长度) 约束,字段2 类型(长度) 约束, ……)[字符集];
注意:建表之前,要进入库
例子:
```sql
USE test-ku
CREATE TABLE test-biao(
id INT(11),
name VARCHAR(25),
deptId INT(11),
salary FLOAT
);
查看表结构
查看表结构: desc test-biao1;
查看建表语句: show create table test-biao2;
删除表
表记录管理
查询记录
添加表头字段
1)语法- 添加到表的最后一个字段
ALTER table 表名 ADD 字段名 类型(长度) - 添加到表的第一个字段
ALTER table 表名 ADD 字段名 类型(长度) first - 指定添加到某个字段后面
ALTER table 表名 ADD 字段名 类型(长度)
after 字段名称
- 添加到表的最后一个字段
- 修改表头字段
1)修改字段类型
ALTER TABLE 表名 modify 字段 类型(长度)
2)修改字段名称
ALTER TABLE 表名
change 旧字段名 新字段名 类型(长度) 删除表头字段
1)语法:ALTER TABLE 表名 DROP 字段名表内容调整
插入记录
1)所有字段都插入值
INSERT INTO 表名VALUES
(‘xxxxx’,’xxxxxx’,xxx…..);
查询:select * FROM 表名;
说明:values后面没有指定字段,表示插入所有值列表个数、顺序、类型要和表结构严格对应字符串类型必须要单引号引起来now()函数表示取数据库当前时间
向表中插入指定字段值
语法:insert INTO 表(字段列表)
VALUES(值列表)修改表内容
语法
UPDATE 表名SET 字段1 = 值1,字段2 = 值2,
…
WHERE 条件表达式;- 删除表内容
- 带比较操作符的查询:>,<,>=,<=,<>(或!=)
- 逻辑运算符:AND,OR
- and: 多个条件同时满足
- or: 满足其中一个
- 范围比较
1)between…AND…: 在…和…之间(包含两边)
2)in/NOT in: 在/不在某个指定的范围
- 模糊查询
1)格式:where 字段 LIKE “通配字符”
2)通配符匹配
下划线(_): 匹配单个字符
百分号(%): 匹配任意个字符
3)注意事项:
模糊查询不精确匹配,速度较慢
尽量避免%前置
- 空值、非空判断
1)语法
判断空值:字段 IS NULL
判断非空:字段 IS NOT NULL
- ORDER BY: 排序
格式:order BY 字段 [ASC/DESC] ASC-升序 DESC-降序 - limit子句
1)作用:限制显示的笔数
2)格式
limit n 只显示前面n笔
limit m,n 从第m开始,总共显示n笔 - distinct子句
1)作用:去除重复数据
2)语法格式:SELECT DISTINCT(要去重的字段)FROM 表名 - 聚合函数
1)什么是聚合:不是直接查询表中的数据,
而是对数据进行总结,返回结果
2)聚合函数有:
max 求最大值<br /> MIN 求最小值<br /> AVG 求平均值<br /> SUM 求和<br /> COUNT 统计笔数<br /> -- 统计订单笔数<br /> SELECT COUNT(*) FROM orders;<br />说明:对某个字段调用聚合函数时,如果字段的值为空,不会参与聚合操作
分组:group BY
1)作用:对查询结果进行分组,通常和聚合函数搭配使用
语法格式:group BY 字段-Having:对分组结果进行过滤
2)作用:对分组结果进行过滤,需要和group BY语句配合使用
语法格式: GROUP BY 分组字段 HAVING 过滤条件
说明:group by分组聚合的结果,只能用
having,不能用where,where只能用户表中有的字段作为条件时候高级查询
子查询
1)定义:一个查询语句中嵌套另一个查询
2)说明:- 括号中的部分称为子查询
- 子查询可以返回一个值,也可以多个值根据外层查询的要求来决定
- 先执行子查询,将子查询的结果,作为外层查询的条件,再执行外层查询
- 子查询只执行一遍
3)使用子查询的情况:一个语句无法查出来,或者不方便查询出结果,使用子查询
- 联合查询
1)什么是联合查询:也叫连接查询,将多个表中的数据进行连接,得到一个查询结果集
2)什么情况下使用联合查询:当从一个表无法查询到所有想要的数据时,使用联合查询。
前提:联合的表之间一定要有逻辑上的关联性
SELECT a.表头字段1, a.表头字段2,
b.表头字段1, b.表头字段2
FROM 表1 a, 表2 b
WHERE a.表头关联字段= b.表头关联字段;
3)笛卡尔积(联合查询的理论依据)- 什么是笛卡尔积:两个集合的乘积,产生一个新的集合。表示两个集合所有的可能的组合情况
- 笛卡尔积和关系:笛卡尔积中,去掉没有意义或不存在的组合,就是关系(规范的二维表)
- 连接查询
- 内连接
(INNER Join):没有关联到的数据不显示 - 外连接
(OUTER Join):没有关联到的数据也要显示到结果集 - 左连接
以左边为基准,右表的数据进行关联
左表数据全部显示,右表中的字段
如果没有关联到,则显示NULL
LEFT JOIN 实现
SELECT a.表头字段1, a.表头字段2,
b.表头字段1, b.表头字段2
FROM表1名a LEFT JOIN表2名b
ON a.表头关联字段= b.表头关联字段; - 右连接:
以右边为基准,左表的数据进行关联
右表数据全部显示,左表中的字段
如果没有关联到,则显示NULL
right JOIN 实现
SELECT a.表头字段1, a.表头字段2,
b.表头字段1, b.表头字段2
FROM表1名aRIGHT JOIN表2名b
ON a.表头关联字段= b.表头关联字段;
- 内连接
约束(Constraint)
- 什么是约束:
数据必须遵循的规则 - 目的:
保证数据一致性、完整性
从数据库层面对数据进行安检; - 分类
1)非空约束
- 定义:Not null,要求字段的值不能为空
- 语法:字段名称 类型(长度) NOT null
2)唯一约束
- 定义:unique,字段的值不能重复
- 语法:字段名称 类型(长度) unique
3)主键(PRIMARY KEY, 简写PK)
非空、唯一
- 定义:主键在表中唯一标识、区分一个实体非空、唯一
- 语法:字段名称 类型(长度) PRIMARY KEY
4)默认值(DEFAULT constraint)
- 定义:指定某个字段的默认值,如果新插入一笔数据没有对该字段赋值,系统会自动填入一个默认值
- 语法:字段名称 类型(长度) DEFAULT 值
5)自动增长(auto_increment)
- 定义:当字段被设置为自增长时,插入时不需要赋值,系统在原最大值的基础上自动加要求:要求这个字段必须是PK,或设置了unique约束)
- 语法:字段名称 类型(长度) auto_increment
6)外键约束(Foreign Key, 简称FK)
- 什么是外键:一种约束,建立外键的前提是:某个字段在当前表中不是PK,但在另外表(也称为”外表”)是主键
- 作用:保证被参照的实体一定存在(参照的完整性)
- 字段被设置外键约束后,影响有:
当插入一个在外表中不存在的实体是,报错
当删除外表中已经被参照的实体,报错 - 创建外键语法:
字段名称 类型(长度) ,
— 所有字段定义完成后
CONSTRAINT 外键名称 FOREIGN KEY(当前表字段)REFERENCES 外表(字段名)
7)通过修改字段方式添加约束
通过修改表定义语句添加约束
alter table表名add primary key(表头字段); — 添加主键
alter table 表名modify id int autoincrement; — 添加自增长
alter table表名modify status int default 0; — 添加默认值0
alter table 表名modify tel_no varchar(32) unique; — 添加唯一约束
alter table 表名add CONSTRAINT fk表头字段— 添加外键约束
FOREIGN KEY(表头字段)
REFERENCES 引用副键所在表名(主键表头字段);
索引
- 什么是索引:
提高查询效率的一种技术 - 原理:
根据某一列(字段)进行分段、排序,通过避免全表扫描提高查询效率 - 索引分类
1)普通索引、唯一索引
普通索引:MySQL基本类型,字段值可以重复
唯一索引:字段的值不能重复(可以为空)
2)单列索引、组合索引
单列索引:一个索引只包含一个字段
组合索引:一个索引包含多个字段
3)聚集索引、非聚集索引
聚集索引(Cluster Index): 索引的键值顺序和数据顺序是一致的
非聚集索引:索引的键值顺序和数据顺序不一致的 - 创建索引
- 语法:建表语句( 字段1,字段2……index(需添加索引字段)| UNIQUE(需添加索引字段)| PRIMARY KEY)
- 删除索引
- 语法:drop INDEX 索引名称 ON 表名称;
- 修改表的方式添加索引
- 语法: CREATE 索引类型 索引名称 ON 表(字段)
- 索引的优缺点
- 优点
提高查询效率
唯一索引能够保证数据的唯一性
可能提高分组、排序的效率 - 缺点
降低增、删、改的效率(调整索引结构的开销)
对表中的数据进行增删改操作,需要调整索引结构
需要增加额外的存储空间
- 优点
- 索引使用注意事项
- 总体原则
在合适的字段上,建立合适的索引
索引不能太多,过多的索引会降低增删改效率 - 适合使用索引的情况
在经常进行查询、排序、分组的字段上建立索引
数据分布比较均匀、连续的字段,适合建立索引
查询操作较多的表,适合建立索引 - 不适合建立索引的情况
数据量太少的表不适合建立索引
增删改操作较多的表,不适合建立较多的索引
某个字段取值范围很少,不适合建索引
某个字段很少用作查询、排序、分组,不适合建索引
二进制字段不适合建立索引
- 总体原则
- 索引失效的SQL语句
索引失效:表中有索引,但是查询时候没有使用- 没有使用索引字段作为条件,会导致放弃使用索引
- 条件判断中使用了<>符号,会导致放弃使用索引
- 条件判断语句中使用了null值判断,会导致放弃使用索引
- 模糊查询%前置,会导致放弃使用索引
- 对字段做运算,会导致放弃使用索引
四、数据导入导出
1. 导出
1)show variables LIKE ‘secure_file%’;
结果:/var/lib/mysql-files/
导出只能导出到该目录
导入只能从该目录导入
2)语法
select查询语句
INTO outfile ‘文件路径’
fields terminated BY ‘字段分隔符’ ,
lines terminated BY ‘行分隔符’; \n2. 导入
语法
LOAD data infile ‘备份文件路径’
INTO TABLE 表名称
fields terminated BY ‘,’
lines terminated BY ‘\n’;
— 如果要导入的表不为空,先删除表中数据,再执行导入
— 导入完成后,查询、确认
表的复制、重命名
- 表的复制
— 将 旧表数据、表结构全部复制到新表
CREATE TABLE 新表名
SELECT FROM 旧表;
— 将旧表结构复制到新表
CREATE TABLE 新表
SELECT FROM 旧表名WHERE false; —查询结果为空
备注:该方式不会将键的属性复制到新表中
- 表的重命名
— 将旧表重命名为新表
ALTER TABLE 旧表名rename TO 新表名;
五、权限管理
1. 什么是权限:
2. 权限分类
- 1)用户类:
创建/删除/修改用的权限
给其他用户授权的权限 - 2) 库/表操作类:
建库/删库/修改库的权限
建表/删表/修改表的权限 -
3. 权限相关的表
1)user:
最重要的一个系统表,存储了用户、密码
以及用户所拥有的权限- 2)db:
记录了库的授权信息 - 3)table_priv:
记录表的授权信息 -
4. 权限操作
1)授予权限
- 语法:
GRANT 权限列表 ON 库名.表名
TO ‘用户名’@’客户端地址’
[identified BY ‘密码’]
[WITH GRANT option];
刷新权限生效
flush privileges; - 说明
权限列表:表示授予哪些权限
ALL privileges: 所有权限
select: 只授予查询权限
select,insert: 授予查询、插入权限
库名.表名:
. -所有库下的所有表
bank.*-bank库下所有表
bank.acct-bank库下的acct表授权
客户端
%: 表示所有的客户端(任意机器)
localhost: 表示只能从本机登录
192.168.1.5: 表示只能从指定的IP机器登录
identified BY ‘密码’:设置用户密码
WITH GRANT option:用户是否有授权的权限
- 语法:
- 2)吊销权限
- 语法:
REVOKE 权限列表 ON 库名.表名
FROM ‘用户名’@’客户端地址;
- 语法:
- 3)查看权限
- 概念:对某个范围的控制(操作)权
- 目的:解决两个或多个工作单元并发操作数据引发的问题
- 分类
- 锁类型
读锁(共享锁):select操作加锁,可以进行数据读取,但是不能写入
写锁(排它锁):insert/update/delete时加锁,加锁后的数据不能读、写
- 锁粒度(锁定范围)
行级锁(细粒度):锁定一行,并发效率高,资源消耗多
表级锁(粗粒度):锁定一个表,并发效率低,资源消耗少
