一、库管理

查看库

show databases;

创建库

  • 语法:CREATE DATABASE 库名称 [字符集DEFAULT charset=utf8] #[]代表可以不写
  • 库的命名规则
    1. 可以使用数字、字母、下划线
    2. 不能使用纯数字
    3. 库名区分大小写
    4. 库名必须唯一
    5. 不能使用特殊字符和MySQL关键字

create databast name-ku;
create databast name-ku character set utf8 collate utf8_bin;

进入库/切换库

use name-ku

查看库

  1. 查看当前库:

select database;

  1. 查看某个库建库的语句

show create database ;

  1. 查看库中有哪些表

show tables;

二、表管理

数据类型

  1. 数值类型

    • 整数型:TINYINT, INT, BITINT
    • 浮点数: DECIMAL(16, 2)

      使用注意:整数要注意存储范围 浮点数要注意精度

  2. 字符类型
    1)定长字符(CHAR)

    • 最大存储255个字符
    • 定义长度后,如果数据不足,自动补充空格
    • 超过长度无法存入
    • 如果不设置长度,默认长度为1

2)变长字符(varchar)

  1. - 最大存储65535个字节
  2. - 实际存储空间根据实际数据进行分配
  3. - 长度超过定义长度时无法存入

3)大文本类型(TEXT)

  - 能存储超过65535字符的数据
  - 最大可以存储4G的数据
  1. 枚举
    • ENUM:从给定的几个值中选取1个
    • SET: 从给定的值中选取1个或多个
  2. 日期时间类型
    • 日期:DATE,范围’1000-01-01’~’9999-12-31;
    • 时间:TIME
    • 日期时间:DATETIME, 范围’1000-01-01 00:00:00’ ~ ‘9999-12-31 23:59:59’
    • 时间戳类型:TIMESTAMP

      创建表

  • 语法 ```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;

删除表

drop table name-biao;

表记录管理

  • 查询记录

    • 语法格式
      SELECT * FROM 表名 [WHERE 条件];
      SELECT 字段1, 字段2…
      FROM 表名 [WHERE 条件];

      表结构调整

  • 添加表头字段
    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 条件表达式;

  • 删除表内容
    1. 语法
      DELETE FROM 表名 WHERE 条件表达式;
    2. 特别注意
      1)进行严格条件限定,如果不带条件删除所有
      2)真实项目中,删除、修改数据之前一定要备份

      三、结构化查询语言(SQL)

      查询

  1. 带比较操作符的查询:>,<,>=,<=,<>(或!=)
  2. 逻辑运算符:AND,OR
  • and: 多个条件同时满足
  • or: 满足其中一个
  1. 范围比较

1)between…AND…: 在…和…之间(包含两边)

2)in/NOT in: 在/不在某个指定的范围

  1. 模糊查询

1)格式:where 字段 LIKE “通配字符”

2)通配符匹配

下划线(_): 匹配单个字符

百分号(%): 匹配任意个字符

3)注意事项:

模糊查询不精确匹配,速度较慢

尽量避免%前置

  1. 空值、非空判断

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 ‘行分隔符’; \n

      2. 导入

      语法
      LOAD data infile ‘备份文件路径’
      INTO TABLE 表名称
      fields terminated BY ‘,’
      lines terminated BY ‘\n’;
      — 如果要导入的表不为空,先删除表中数据,再执行导入
      — 导入完成后,查询、确认
      表的复制、重命名
  1. 表的复制

— 将 旧表数据、表结构全部复制到新表
CREATE TABLE 新表名
SELECT FROM 旧表;
— 将旧表结构复制到新表
CREATE TABLE 新表
SELECT
FROM 旧表名WHERE false; —查询结果为空
备注:该方式不会将键的属性复制到新表中

  1. 表的重命名

— 将旧表重命名为新表
ALTER TABLE 旧表名rename TO 新表名;

五、权限管理

1. 什么是权限:

用户可以执行操作的权利限制

2. 权限分类

  • 1)用户类:
    创建/删除/修改用的权限
    给其他用户授权的权限
  • 2) 库/表操作类:
    建库/删库/修改库的权限
    建表/删表/修改表的权限
  • 3)数据操作类:
    增删改查

    3. 权限相关的表

  • 1)user:
    最重要的一个系统表,存储了用户、密码
    以及用户所拥有的权限

  • 2)db:
    记录了库的授权信息
  • 3)table_priv:
    记录表的授权信息
  • 4)column_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)查看权限
    • 查看自己权限:show grants;
    • 查看别人的权限:show grants FOR ‘Tom’@’%’;

      5. 锁(理解)

  1. 概念:对某个范围的控制(操作)权
  2. 目的:解决两个或多个工作单元并发操作数据引发的问题
  3. 分类
  • 锁类型

读锁(共享锁):select操作加锁,可以进行数据读取,但是不能写入
写锁(排它锁):insert/update/delete时加锁,加锁后的数据不能读、写

  • 锁粒度(锁定范围)

行级锁(细粒度):锁定一行,并发效率高,资源消耗多
表级锁(粗粒度):锁定一个表,并发效率低,资源消耗少