第24章 零基础学MySQL

Posted Spring-_-Bear

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第24章 零基础学MySQL相关的知识,希望对你有一定的参考价值。

韩顺平_循序渐进学Java零基础_第24章 零基础学MySQL(P731 - P820)

第24章 零基础学mysql

731. 数据库的使用

732. MySQL5.7安装配置

  • 删除 MySQL 服务:sc delete mysql

733. 命令行连接到MySQL

  • 启动服务:net start mysql
  • 关闭服务:net stop mysql
  • 登录:mysql -h 主机名 -P 端口 -u 用户名 -p 密码

734. Navicat安装和使用

735. SQLyog安装和使用

736. MySQL三层结构

  • mysqld 程序在端口进行监听

  • MySQL 数据库表中一行称为一条记录,一列称为一个字段。在 Java 程序中,一行记录往往使用对象表示

  • SQL语句分类:

    1. DDL(数据定义语句)[DEFINE]
    2. DML(数据操作语句)[INSERT、UPDATE、DELETE]
    3. DQL(数据查询语句)(SELECT)
    4. DCL(数据控制语句)[GRANT REVOKE]

737. Java操作MySQL

// 加载驱动
Driver driver = new com.mysql.jdbc.Driver();
// 设置用户名、密码以及连接到的数据库
Properties properties = new Properties();
properties.setProperty("user", "userName");
properties.setProperty("password", "password");
String url = "jdbc:mysql://localhost:3306/fishing_cost";
// 获得 Java 程序与数据的链接对象
Connection connection = driver.connect(url,properties);
// 获得执行 SQL 语句的对象
Statement statement = connection.createStatement();

738. 创建数据库

CREATE DATABASE [IF NOT EXISTS] db_name [create_specification]···
-- 指定数据库采用的字符集,默认为 utf8
[DEFAULT] CHARACTER SET char_set_name
-- 指定数据库字符集的校对规则,默认为 utf8_general_ci(不区分大小写),常用的还有 utf8_bin(区分大小写)
[DEFAULT] COLLATE collation_name

739. 查询数据库

  • 为了规避关键字,可以使用反引号 `` 解决
-- 显示所有数据库
SHOW DATABASES;
-- 显示数据库的创建语句
SHOW CREATE DATABASE db_name
-- 删除数据库
DROP DATABASE [IF EXISTS] db_name

740. 备份恢复数据库

-- 备份数据库:在 DOS 命令行执行(文件名前可带路径)
mysqldump -u 用户名 -p -B 数据库1 数据库2 数据库n > 文件名.sql
-- 备份表:在 DOS 命令行执行(文件名前可带路径)
mysqldump -u 用户名 -p 数据库 表12 表n > 文件名.sql
-- 恢复数据库:登录 MySQL 后在 MySQL 命令行执行(文件名前可带路径)
Source 文件名.sql

741. 创建表

CREATE TABLE table_name (
  field1 datatype,
  field2 datatype,
  fieldn datatype
) CHARACTER SET 字符集 COLLATE 校对规则 ENGINE 引擎; 
  • 如果表没有指定字符集、校对规则、引擎,则以数据库的设置为准

742. 列类型有哪些

数据类型说明
BIT(M)位类型。M 指定位数,8位一个字节,默认值是 1,范围[1,64],按二进制显示
TINYINT [UNSIGNED]占 1 个字节,带符号[-128,127],无符号[0,255],默认带符号
SMALLINT [UNSIGNED]占 2 个字节,带符号[215,215-1],无符号[0,216-1],默认带符号
MEDIUMINT [UNSIGNED]占 3 个字节,带符号[223,223-1],无符号[0,224-1],默认带符号
INT [UNSIGNED]占 4 个字节,带符号[231,231-1],无符号[0,232-1],默认带符号
BIGINT [UNSIGNED]占 8 个字节,带符号[263,263-1],无符号[0,264-1],默认带符号
FLOAT [UNSIGNED]浮点数,占 4 个字节
DOUBLE [UNSIGNED]浮点数,占 8 个字节
DECIMAL(M,D) [UNSIGNED]定点数,M 指定长度,D 指定小数点位数
CHAR(size)定长字符串,size 最大 255 个字符
VARCHAR(size)变长字符串,size 最大 65535 个字节
BLOB二进制数据,存储位数[0,216-1]
LONGBLOB二进制数据,存储位数[0,232-1]
TEXT文本数据,[0,216-1]
LONGTEXT文本数据,[0,232-1]
DATE日期类型(YYYY-MM-DD),占3个字节
TIME时间类型(HH:MM:SS),占3个字节
YEAR年,占1个字节
DATETIME日期时间类型(YYYY-MM-DD HH:mm:ss),占8个字节
TIMESTAMP时间戳,可自动记录 INSERT、UPDATE操作时间,占4个字节

743. 列类型之整型

744. 列类型之bit

  • 数据查询显示时,以二进制位的方式显示

745. 列类型值小数型

  • DECIMAL(M,D):若省略 M,则默认值为 10;若省略 D,默认为 0

746. 列类型之字符串1

  • CHAR(size):定长字符串,最大 255 个字符
  • VARCHAR(size):变长字符串,最大 65535 个字节,实际上不能存放这么多
  • Unicode编码中一个字符占 3 个字节,GBK编码中一个字符占 2 个字节
  • UTF8 编码最大存放 21844 个字符,需要用 1~3 个字节用于记录字段大小即(65535字节 - 3字节)/ 3字节每字符 )
  • GBK编码最大存放 32766 个字符,需要用 1~3 个字节用于记录字段大小即(65535字节 - 3字节)/ 2字节每字符 )

747. 列类型之字符串2

  • CHAR(4) 数字 4 表示字符数,不管是中文还是英文都存放 4 个;VARCHAR(4) 数字 4 表示字符数,不管是字符还是中文都以定义好的表的编码来存放数据。即不管是中文还是英文字母,最多存放 4 个字符。其中VARCHAR(size) :如果编码为 UTF8,则 size 最大为 21844;如果编码是 GBK,则 size 最大为 32766。CHAR(size) 最大范围是 255 。
  • CHAR(4) 所谓定长,指的是分配的空间是固定的,哪怕你只是插入了 “aa”,占用的空间也是 4 个字符的空间。
  • VARCHAR(4) 所谓变长,指的是占用的空间是动态大小,即根据实际占用的空间大小进行分配。VARCHAR 本身还需要占用 1~3 个字节来存放内容长度信息。
  • CHAR 的查询速度高于 VARCHAR
  • 在存放文本时,也可以使用 TEXT 数据类型,可以将 TEXT 列视为 VARCHAR 列,注意 TEXT 不能有默认值。大小范围为 [0,216-1] 字节。如果希望存放更多字符,可以使用 MEDIUMTEXT[0,224-1] 或 LONGTEXT[0,232-1]

748. 日期类型

-- 在插入数据或更新数据时自动更新时间戳
TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

749. 创建表练习

CREATE TABLE t01 (
  id INT PRIMARY KEY,
  name VARCHAR (32),
  sex CHAR(1),
  birthday DATE,
  entry_date DATE,
  job VARCHAR (32),
  salary DOUBLE,
  `resume` TEXT
) CHARSET utf8 COLLATE utf8_bin ENGINE INNODB ;

750. 修改表

-- 添加列
ALTER TABLE `table_name` ADD column1 datatype,columnn datatype 
-- 添加列到指定列之后
ALTER TABLE `table_name` ADD column1 datatype AFTER column_name
-- 修改列属性
ALTER TABLE `table_name` MODIFY column1 datatype,columnn datatype
-- 删除列
ALTER TABLE `table_name` DROP column1,columnn
-- 修改列名
ALTER TABLE `table_name` CHANGE old_column_name new_column_name datatype
-- 修改表的字符集
ALTER TABLE `table_name` CHARSET character_set_name
-- 查看表结构
DESC `table_name`
-- 重命名表名
RENAME TABLE old_table_name TO new_table_name

751. insert基本使用

  • CRUD:create、read、update、delete

752. insert注意事项

-- 可以使用下列形式添加多条记录
INSERT INTO t01 VALUES (),(),()
  • 如果是给表中所有字段添加数据,则可以省略字段名称
  • 当不给某个字段添加值时,如果有默认值则自动添加默认值,否则报错

753. update语句

UPDATE `table_name` SET col_name = exp1,col_name = exp2 WHERE ···

754. delete语句

DELETE FROM `table_name` WHERE ···
  • 使用 DELETE 语句不能删除某一列的值,可用 UPDATE 语句将该列设为 NULL
  • 使用 DELETE 语句仅删除记录,不能删除表本身。如要删除表,使用 DROP TABLE table_name 语句

755. select语句1

756. select语句2

757. select语句3

  • WHERE 子句中常用的运算符:
表达式作用
BETWEEN···AND···显示在某一区间的值,闭区间
IN(set)显示在 IN 列表中的值
LIKE模糊查询
NOT LIKE模糊查询
IS NULL是否为空
AND
OR
NOT

758. select语句4

  • ORDER BY 对指定的列进行排序,排序的列既可以是表中的列名,也可以是 SELECT 语句后指定的别名
  • ASC:升序 DESC:降序

759. 统计函数

  • COUNT(*) 返回满足条件的的记录的行数;COUNT(列) 统计满足条件的某列有多少个,会排除 NULL

760. 分组统计

  • 使用 HAVING 子句可以对分组后的结果进行筛选
SELECT col1,col2,coln FROM `table_name` GROUP BY col_name HAVING exp

761. 字符串函数

函数名作用
CHARSET(str)返回字符串字符集
CONCAT(str1,str2···)连接字符串
INSTR(str,substr)返回 substr 在 str 中的出现位置,没有出现返回 0
UCASE(str)转换成大写
LCASE(str)转换成小写
LEFT(str,len)从 str 中的左边起取 len 长度个字符
LENGTH(str)str 的长度,以字节为单位
REPLACE(str,search_str,replace_str)在 str 中用 replace_str 替换 search_str
STRCMP(str1,str2)逐字符比较字符串大小
SUBSTRING(str,pos,len)在 str 中从pos开始取 len 个字符,pos 从1开始
LTRIM去除前端空格
RTRIM去除后端空格
TRIM去除前后端空格
  • SUBSTRING(str,pos,len):如果省略 len,则从 pos 位置开始截取完所有字符。例如:SUBSTRING(‘SpringBear’,1,6) 从位置 1 开始截取 6 个字符,返回结果为:Spring
  • DUAL 表是系统的亚元表,在无表可用的情况下可以用 DUAL 来进行测试

762. 字符串函数练习

763. 数学函数

函数名功能
ABS(num)绝对值函数
BIN(decimal_number)十进制转二进制
CEILING(num)向上取整,得到比 num 大的最小整数
CONV(num,from_base,to_base)进制转换,从指定的 from 进制转换到 to 进制
FLOOR(num)向下取整,得到比 num 小的最大整数
FORMAT(num,decimal_places)四舍五入保留指定的小数位数
HEX(num)转十六进制
LEAST(num1,num2···)求最小值
MOD(numerator,denominator)求余
RAND([seed])随机数[0,1]

764. 日期函数1

函数名功能
CURRENT_DATE()当前日期
CURRENT_TIME()当前时间
CURRENT_TIMESTAMP()当前时间戳
DATE(datetime)返回 datetime 的日期部分
DATE_ADD(date,INTERVAL d_value d_type)在 date上加上一个日期或时间
DATE_SUB(date,INTERVAL d_value d_type)在 date 上减去一个时间
DATEDIFF(date1,date2)日期差,结果是天
TIMEDIFF(time1,time2)时间差,结果是时分秒
NOW()当前时间,年月日时分秒
YEAR(datetime)
MONTH(datetime)
UNIX_TIMESTAMP()返回 1970-1-1 到当前时间的秒数
FROM_UNIXTIME()将一个秒数转换成指定格式,例如年月日

765. 日期函数2

  • DATE_ADD() 、DATE_SUB() 函数中的 date 可以是 date、datetime、timestamp,d_type 可以是年月日时分秒

766. 日期函数3

-- 日期格式化:2021-11-06 21:39:34
SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(),'%Y-%m-%d %H:%i:%s') FROM DUAL

767. 加密函数

-- 查看当前用户
SELECT USER() FROM DUAL
-- 查询当前使用的数据库
SELECT DATABASE() FROM DUAL
-- 为字符串创建一个MD5算法加密的密码,32位字符
SELECT MD5(str) FROM DUAL
-- 为字符串创建一个MySQL加密算法创建的密码
SELECT PASSWORD(str) FROM DUAL
-- 查询某个数据库的用户
SELECT * FROM 'db_name'.user

768. 流程控制函数

-- 如果exp1为true,则返回exp2,否则返回exp3
IF(exp1,exp2,exp3)
-- 如果exp1为空,则返回exp2,否则返回exp1
IFNULL(exp1,exp2)
-- 如果exp1为true,则返回exp2;如果exp3为true,则返回exp4;否则返回exp5
SELECT CASE WHEN exp1 THEN exp2 WHEN exp3 THEN exp4 ELSE exp5 END;
  • 判断是否为空不使用 = NULL,使用 IS NULL

769. 查询增强

  • % 表示 0 到多个字符;_ 表示单个任意字符

770. 分页查询

  • SELECT ··· LIMIT start, rows 从 start + 1 行开始,取出 rows 行,start 从 0 开始计算

771. 分组增强

772. 多子句查询

SELECT col1,col2,coln 
FROM table_name 
GROUP BY col 
HAVING `condition` 
ORDER BY col 
LIMIT `start`, `rows`

773. 多表笛卡尔集

  • 多表查询的条件不能少于表的个数 -1,否则会出现笛卡尔集

774. 多表查询

775. 自连接

SELECT * FROM `table_name` alias1, `table_name` alias2

776. 多行子查询

  • 子查询是指嵌入在其它 SQL 语句中的 SELECT 语句,也叫嵌套查询。
  • 单行子查询:只返回一行数据的子查询语句
  • 多行子查询:返回多行数据的子查询,使用关键字 IN 进行连接

777. 子查询临时表

778. all和any

  • all:满足所有条件
  • any:满足一个条件

779. 多列子查询

  • 多列子查询:返回多列数据的子查询
SELECT ··· WHERE (字段1,字段2···) = (SELECT 字段1,字段2 FROM ···)

780. 子查询练习

  • table_name.* 表是把该表的所有列信息都显示出来

781. 表复制和去重

  • 自我复制也称蠕虫复制,为了对某条 SQL 语句进行效率测试,当我们需要海量数据时,可以进行蠕虫复制。
-- 蠕虫复制
INSERT INTO `table_name` (field1,field2···) SELECT field1,field2 FROM `table_name`
-- 复制表结构
CREATE TABLE `table_name` LIKE `table`
  • 去除表中的重复记录:创建一张与原表结构相同的表,从原表中将记录去重后插入到临时表,清除原表中的所有记录,再将临时表中的记录插入到原表,删除临时表

782. 合并查询

  • 为了合并多个 SELECT 语句的结果,可以使用集合操作符号 UNION,UNION ALL
  • UNION ALL 操作符用于取得两个结果集的并集,不会去除重复行,UNION会自动去重

783. 外连接需求

  • 为了显示查询结果中某些不满足匹配条件的记录

784. 左外连右外连

  • 左外连接:左侧的表完全显示;
  • 右外连接:右侧的表完全显示
  • 用 ON 关键字进行条件过滤
-- 左外连接
SELECT ··· FROM table1 LEFT JOIN table2 ON condition1
-- 右外连接
SELECT ··· FROM table1 RIGHT JOIN table2 ON condition1

785. 主键

  • 约束:确保数据库的数据满足特定的规则
  • MySQL 中的约束条件共有 5 个:NOT NULL、UNIQUE、PRIMARY KEY、FOREIGN KEY、CHECK
  • 主键不能重复且不能为空,一张表中最多有一个主键,可以是复合主键(多个字段构成主键)

786. unique

  • 当指定过滤 UNIQUE 约束后,该列值是不能重复的。如果没有指定 NOT NULL,则 UNIQUE 字段可以有多个 NULL

787. 外键介绍

  • 外键:用于定义主表和从表之间的关系:外键约束要定义在从表上,主表则必须具有主键约束或是 UNIQUE 约束,当定义了外键约束后,要求外键列数据必须在主表的主键列存在或是为 NULL
-- 外键约束放在建表语句最后
FOREIGN KEY (本表字段名) REFERENCES 主表名(主键名或UNIQUE字段名)

788. 外键使用细节

  • 表的引擎为 INNODB,这样的表才支持外键
  • 外键字段的类型要和主键字段的类型一致
  • 外键字段的值,必须在主键字段中出现过或是为 NULL,前提是外键字段允许为 NULL
  • 一旦建立了主外键关系,数据的删除原则应遵循先删外键所在从表的记录,才能删除主表中对应的记录

789. check

  • MySQL5.7 目前还不支持 check,只做语法校验,但不会生效。在 MySQL 中实现 check 的功能,一般是在程序中控制或是通过触发器完成

790. 商店表设计

-- sex只能是男、女中的一个
sex ENUM('男','女') NOT NULL

791. 自增长

-- 置空
INSERT INTO `table_name` (字段1,字段2,···) VALUES (NULL,2,···)
-- 省略字段
INSERT INTO `table_name` (字段2,字段3,···) VALUES (2,值3,···)
-- 省略字段表达式且置空
INSERT INTO `table_name` VALUES (NULL,2,3,···)
  • 一般来说自增长是和主键配合使用的,也可以单独使用但需要配合一个 UNIQUE,一般情况只用于整数
-- 修改自增长的默认值
ALTER TABLE `table_name` AUTO_INCREMENT = digit
  • 如果添加数据过程中存在指定的自增长值,则下一条记录从指定值之后开始自增

792. 索引优化速度

-- 创建索引
CREATE INDEX `index_name` ON `table_name`(fidld_name)
  • 创建索引后,只在查询有索引的列时速度明显提高

793. 索引机制

  • 索引的代价:1. 磁盘空间占用; 2. 对 DML(update,delete,insert) 语句的效率影响,因为会重新构建索引所需数据结构
  • 没有创建索引查询时会进行全表扫描,创建索引之后会使用创建的数据结构进行查询,查询效率明显提高

794. 创建索引

  • 主键索引:主键自动为主索引
  • 唯一索引:UNIQUE
  • 普通索引:INDEX
  • 全文索引:FULLTEXT,适用于 MyISAM
  • 在开发中一般不使用 MySQL 自带的索引,考虑使用全文搜索框架 Solr 和 ElasticSearch
-- 查询表中是否存在索引
SHOW INDEXES FROM `table_name`
-- 添加索引
CREATE [UNIQUE] INDEX index_name ON `table_name` (col_name)
ALTER TABLE `table_name` ADD INDEX [index_name] (index_col_name)
-- 添加主键索引
ALTER TABLE `table_name` PRIMARY KEY (col_name)
  • 索引选择:如果某列保证不可能重复,则优先考虑唯一索引
  • 如果在建表语句中指定了 PRIMARY KEY 或 UNIQUE,则会自动创建索引;若没有指定,则可以在建表完成后通过添加索引语句创建索引

795. 删除索引

-- 删除索引
DROP INDEX index_name ON `table_name`
-- 删除主键索引
ALTER TABLE `table_name` DROP PRIMARY KEY

796. 创建索引规则

  • 较频繁的作为查询添加的字段应该创建索引
  • 唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件
  • 更新非常频繁的字段不适合创建索引

797. 事务有什么用

  • 事务:用于保证数据的一致性,它由一组相关的 DML 语句组成,该组的 DML 语句要么全部成功,要么全部失败
  • 事务和锁:当执行事务操作时( DML 语句),MySQL 会在表上加锁,防止其它用户改表的数据
-- 开始一个事务
start transaction
-- 设置保存点
savepoint point_name
-- 回退事务
rollback to point_name
-- 回退全部事务
rollback
-- 提交事务,一经提交,立即生效,不能回退
commit

798. 事务操作

  • 事务操作只能回退,不能回退后再前进

799. 事务注意事项

  • 如果不开启事务,默认情况下,DML 操作是自动提交的,不能回滚
  • MySQL 的事务机制需要 INNODB 的存储引擎,MyISAM 不可用
-- 开启事务
start transaction 
set autocommit = off

800. 4种隔离级别

  • 事务隔离级别:多个连接开启各自事务操作数据库中的数据时,DBMS 要负责隔离操作,以保证各个连接在获取数据时的准确性,如果不考虑隔离性,可能会引发如下问题:脏读、不可重复读、幻读
  • 脏读(dirty read):当一个事务读取到另一个事务尚未提交的操作时产生脏读
  • 不可重复读(nonrepeatable read):同一查询在同一事务中多次进行,由于提交事务所做的修改或删除,每次返回不同的结果集,此时发生不可重复读
  • 幻读(phantom read):同一查询在同一事务中多次进行,由于提交事务所做的插入操作,每次返回不同的结果集,此时发生幻读
问题描述
脏读(dirty read)一个事务读取到另一个事务尚未提交的操作
不可重复读(nonrepeatable read)一个事务读取到另一个事务已提交的删除或修改操作
幻读(phantom read)一个事务读取到另一个事务已提交的插入操作
  • 事务隔离级别:MySQL 隔离级别定义了事务与事务之间的隔离程度
MySQL隔离级别脏读不可重复读幻读加锁读
读未提交(read uncommintted)YYYN
读已提交(read committed)NYYN
可重复读(repeatable read)NNNN
可串行化(serializable)NNNY
- Y:可能出现 N:不出现
- 加锁:有且仅有一个事务正在处理数据

801. 隔离级别演示1

  • 正常情况:查询的数据是登录时刻的数据才算正常情况

802. 隔离级别演示2

  • 可串行化:有一张表正在被另一个事务操作没有提交时,当前事务会停下等待,直到另一个事务提交操作时当前事务才可继续操作

803. 设置隔离

-- 查看当前会话隔离级别
SELECT @@tx_isolation
-- 查看系统当前隔离级别(所有用户)
SELECT @@global.tx_isolation
-- 设置当前会话隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL isolation_name
-- 设置系统当前会话隔离级别(所有用户)
SET GLOBAL SESSION TRANSACTION ISOLATION LEVEL isolation_name
  • MySQL 默认的事务隔离级别是 REPEATABLE READ,没有特殊情况一般不修改
  • MySQL 事务的 ACID 特性
名称描述
原子性(atomicity)事务是一个不可分割的工作单位,要么都发生,要么都失败
一致性(consistency)事务保证数据库从一个一致性状态转换到另一个一致性状态
隔离性(isolation)多个并发事务之间根据隔离级别不同相互隔离
持久性(durability)事务一旦提交,对数据的改变就是永久性的

804. 存储引擎1

  • MySQL的表类型由存储引擎决定,常用的是 InnoDB、MyISAM、Memory
  • MySQL数据表主要支持六种类型,分别是:InnoDB、MyISAM、Memory、CSV、Archive、MRG_MyISAM
  • 六种类型又分为两类:事务安全型 (transaction-safe) 和非事务安全型 (non-transaction-safe)。除了 InnoDB 是事务安全型,其余的都是非事务安全型(不支持事务)
-- 查看所有的存储引擎
SHOW ENGINES
特点InnoDBMyISAMMemoryArchive
批量插入速度非常高
事务安全支持
全文索引支持
锁机制行锁表锁表锁行锁
存储限制64TB无限制有限制无限制
B树索引支持支持支持
哈希索引支持支持
集群索引支持
数据缓存支持支持
索引缓存支持支持支持
数据可压缩支持支持
空间使用非常低
内存使用中等
支持外键支持
  • MyISAM 不支持事务,不支持外键,但其访问速度快,对事务完整性没有要求
  • InnoDB 提供了具有提交、回滚和崩溃恢复能力的事务安全。但是比起 MyISAM 存储引擎,InnoDB 写入数据的处理效率相对较低并且会占用更多的磁盘空间以保留数据和索引
  • Memory 存储引擎使用内存来创建表。每个 Memory 表实际上值对应一个磁盘文件。表访问速度非常快,因为它的数据存放于内存中,并且默认使用 Hash 索引。一旦 MySQL 服务关闭,表中所有数据都会丢失,但表的结构仍然存在

805. 存储引擎2

  • 存储引擎的选择:如果不需要事务操作,只是处理基本的 CRUD 操作,MyISAM 是不二之选;如果需要支持事务,InnoDB 非选不可;Memory 经典用法:用户的在线状态
-- 修改存储引擎
ALTER TABLE `table_name` ENGINE = engine_name

806. 视图原理

  • 视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含列,其数据映射自对应的真实表(基表)
  • 基表与视图的修改会相互影响,视图中的数据并不物理保存,视图只是映射基表中的数据

807. 视图使用细节

-- 创建视图
CREATE VIEW view_name AS SELECT field1··· FROM `table_name`
-- 修改视图
ALTER VIEW view_name AS SELECT field1··· FROM `table_name`
-- 查看视图
SHOW CREATE VIEW view_name
-- 删除视图
DROP VIEW view_name
  • 创建视图后,磁盘中只会存在一个视图结构文件,不存在数据存储文件,因为视图中的数据映射自基表
  • 视图中可以再创建视图

808. 视图应用案例

  • 视图应用最佳实践:
    1. 安全:创建视图让用户只能通过视图查询到表中部分字段的数据,隐藏保密字段
    2. 性能:关系数据库的数据常常会分表存储,使用外键维护这些表之间的关系。查询时难免用到连接(JOIN)。这样做不仅麻烦,效率也比较低。如果建立视图,将相关的表和字段组合在视图中,就可以避免使用 JOIN 查询数据
    3. 灵活:如果系统中有一些旧的表,这些表由于设计的问题,即将被废弃。然而,很多应用都依赖于这些表,不易修改。这时就可以建立一张视图,视图中的数据映射到这些表。这样,就可以少做很多改动,也达到了升级数据表的目的

809. MySQL用户管理

  • MySQL中的用户,都存储在系统数据库 mysql 中的 user 表中
  • user 表字段说明:Host:允许登录的位置
-- 创建用户
CREATE USER user_name @ip_addr IDENTIFIED BY pwd
-- 删除用户
DROP user_name @ip_addr
-- 修改自己的密码
SET PASSWORD = PASSWORD(pwd)
-- 修改别人的密码(需要权限)
SET PASSWORD FOR user_name @ip_addr = PASSWORD(new_pwd)

810. MySQL权限管理

权限内容
ALL设置除 GRANT OPTION 之外的所有简单权限
ALTERALTER TABLE
ALTER ROUTINE更改或取消已存储的子程序
CREATECREATE TABLE
CREATE ROUTINE允许已存储的子程序
CREATE TEMPORARY TABLESCREATE TEMPORARY TABLES
CREATE USERCREATE USER、DROP USER、RENAME USER、REVOKE ALL PRIVILEGES
CREATE VIEWCREATE VIEW
DELETEDELETE
DROPDROP TABLE
EXECUTE语序用户运行已存储的子程序
FILESELECT···INTO OUTFILE、LOAD DATA INFILE
INDEXCREATE INDEX、DROP INDEX
INSERTINSERT
LOCK TABLES对拥有 SELECT 权限的表使用 LOCK TABLES
PROCESSSHOW ALL PROCESSLIST
REFERENCES未被实施
RELOADFLUSH
REPLICATION CLIENT允许用户询问从属服务器或主服务器的地址
SELECTSELECT
SHOW DATABASESSHOW DATABASES
SHOW VIEWSHOW CREATE VIEW
SHUTDOWN允许使用 mysqladmin shutdown
SUPERCHANGE MASTER、KILL、PURGE MASTER LOGS、SET GLOBAL、mysqladmin debug;允许您连接(一次),即使已达到max_connections
UPDATEUPDATE
USAGE无权限
GRANT OPTION允许授予权限
-- 给用户授权
GRANT 权限列表 ON.对象 TO 用户名 @登录位置 [IDENTIFIED BY pwd]
-- 1. 权限列表,多个权限用逗号分隔
GRANT SELECT,DELETE··· ON ···
-- 2. 除GRANG OPTION外的所有权限
第24章 零基础学MySQL 章节练习题

学习笔记导航

学习笔记导航

学习笔记导航

零基础学Python--------第11章 使用Python操作数据库

韩顺平循序渐进学Java零基础 第12章 异常