Power-SQL


DDL 操作数据库、表

数据库操作

创建数据库

我们可以在登录 MySQL 服务后,使用 creat 命令创建数据库,语法如下:

create database 数据库名称 [库选项];

其中,库选项是用来约束数据库的,为可选项(有默认值),共有两种,分别为:

  • 字符集设定:charset/ character set+ 具体字符集,用来表示数据存储的编码格式,常用的字符集包括 GBK 和 UTF8 等。

  • 校对集设定:collate+ 具体校对集,表示数据比较的规则,其依赖字符集。

示例:

-- 创建数据库 test
create database test charset utf8;

其中,数据库的名字不能用关键字(已经被占用的字符,例如 updateinsert 等)或者保留字(将来可能会用的,例如 accesscast 等)。 如果非要使用数据库的关键字或者保留字作为数据库名称,那么必须用反引号将其括起来,例如:

create database `update` charset utf8;

如果还想使用中文作为数据库的名称,那就得保证数据库能够识别中文(强烈建议不要用中文命名数据库的名称),例如:

-- 设置中文名称的方法,其中 gbk 为当前数据库的默认字符集
set names gbk;
create database 北京 charset gbk;

删除数据库

使用普通用户登录 MySQL 服务器,你可能需要特定的权限来创建或者删除 MySQL 数据库,所以我们这边使用 root 用户登录,root 用户拥有最高权限。

在删除数据库过程中,务必要十分谨慎,因为在执行删除命令后,所有数据将会消失。

查询数据库

其中,pattern 是匹配模式,有两种,分别为:

  • %:表示匹配多个字符;

  • _:表示匹配单个字符。

此外,在匹配含有下划线 _ 的数据库名称的时候,需要在下划线前面加上反斜线 _ 进行转义操作。

更新数据库

在这里,需要注意:数据库的名字不可以修改。

选择数据库

在你连接到 MySQL 数据库后,可能有多个可以操作的数据库,所以你需要选择你要操作的数据库。

执行以上命令后,你就已经成功选择了 test 数据库,在后续的操作中都会在 test 数据库中执行。

注意:所有的数据库名,表名,表字段都是区分大小写的。所以你在使用 SQL 命令时需要输入正确的名称。

数据库的备份和还原

备份:

还原:

  • 登录数据库:-u用户名称 -p密码;

  • 创建数据库:create database 数据库名称;

  • 使用数据库:use 数据库名称;

  • 执行文件:source 文件路径;

权限的管理

查询权限

授予权限

一次授予所有权限

撤销权限


表操作

创建表

创建 MySQL 数据表需要以下信息:

  • 表名

  • 表字段名

  • 定义每个表字段

以下为创建 MySQL 数据表的 SQL 通用语法:

其中,if not exists 表示如果表名不存在,就执行创建代码;如果表名存在,则不执行创建代码。

表选项则是用来控制表的表现形式的,共有三种,分别为:

  • 字符集设定:charset/ character set+ 具体字符集,用来表示数据存储的编码格式,常用的字符集包括 GBK 和 UTF8 等。

  • 校对集设定:collate+ 具体校对集,表示数据比较的规则,其依赖字符集。

  • 存储引擎:engine+ 具体存储引擎,默认为 InnoDB,常用的还有 MyISAM.

  • 如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为 NULL ,就会报错。

  • AUTO_INCREMENT 定义列为自增的属性,一般用于主键,数值会自动加1。

  • PRIMARY KEY关键字用于定义列为主键。 你可以使用多列来定义主键,列间以逗号分隔。

  • ENGINE 设置存储引擎,CHARSET 设置编码。

由于任何表都归属于某个数据库,因此在创建表的时候,都必须先指定具体的数据库。在这里,指定数据库的方式有两种,分别为: 第 1 种:显式的指定表所属的数据库,示例

第 2 种:隐式的指定表所属的数据库,示例

创建 MySql 的表时,表名和字段名外面的符号 ` 不是单引号,而是英文输入法状态下的反单引号,也就是键盘左上角 esc 按键下面的那一个 ~ 按键

反引号是为了区分 MySql 关键字与普通字符而引入的符号,一般的,表名与字段名都使用反引号。

删除表

MySQL 中删除数据表是非常容易操作的, 但是你再进行删除表操作时要非常小心,因为执行删除命令后所有数据都会消失。

delete from 表以后虽然未释放磁盘空间,但是下次插入数据的时候,仍然可以使用这部分空间。

总结

  • 当你不再需要该表时, 用 drop;

  • 当你仍要保留该表,但要删除所有记录时, 用 truncate;

  • 当你要删除部分记录时, 用 delete。

查询表

其中,pattern 是匹配模式,有两种,分别为:

  • %:表示匹配多个字符;

  • _:表示匹配单个字符。

此外,在匹配含有下划线 _ 的表名的时候,需要在下划线前面加上反斜线 \_ 进行转义操作。

在这里,咱们也可以用 \g\G 代替上述语句中的;分号,其中 \g 等价于分号,\G 则在等价于分号的同时,将查的表结构旋转 90 度,变成纵向结构。

更新表

复制表

如果我们需要完全的复制 MySQL 的数据表,包括表的结构,索引,默认值等。 如果仅仅使用 CREATE TABLE ... SELECT 命令,是无法实现的。

整体方法

步骤一: 获取数据表的完整结构。

步骤二

修改 SQL 语句的数据表名,并执行 SQL 语句。

步骤三

执行完第二步骤后,你将在数据库中创建新的克隆表 clone_tbl。 如果你想拷贝数据表的数据你可以使用 INSERT INTO... SELECT 语句来实现。

临时表

MySQL 临时表在我们需要保存一些临时数据时是非常有用的。临时表只在当前连接可见,当关闭连接时,Mysql 会自动删除表并释放所有空间。

MySQL 临时表只在当前连接可见,如果你使用 PHP 脚本来创建 MySQL 临时表,那每当 PHP 脚本执行完成后,该临时表也会自动销毁。如果你使用了其他 MySQL 客户端程序连接 MySQL 数据库服务器来创建临时表,那么只有在关闭客户端程序时才会销毁临时表,当然你也可以手动销毁。

实例

索引

MySQL 索引的建立对于 MySQL 的高效运行是很重要的,索引可以大大提高 MySQL 的检索速度。

打个比方,如果合理的设计且使用索引的 MySQL 是一辆兰博基尼的话,那么没有设计和使用索引的 MySQL 就是一个人力三轮车。

例如,如果想要查阅一本书中与某个特定主题相关的所有页面,你会先去查询索引(索引按照字母表顺序列出了所有主题),然后从索引中找到一页或者多页与该主题相关的页面。

索引分单列索引和组合索引。

  • 单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。

  • 组合索引,即一个索引包含多个列。

上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行 INSERT、UPDATE和DELETE。因为更新表时,MySQL 不仅要保存数据,还要保存一下索引文件。

索引能够提高 SELECT 查询和 WHERE 子句的速度,但是却降低了包含 UPDATE 语句或 INSERT 语句的数据输入过程的速度。索引的创建与删除不会对表中的数据产生影响。

建立索引会占用磁盘空间的索引文件。实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。

普通索引

  • 创建索引

    这是最基本的索引,它没有任何限制。它有以下几种创建方式:

    如果是 CHAR,VARCHAR 类型,length 可以小于字段实际长度;如果是 BLOB 和 TEXT 类型,必须指定 length。

  • 修改表结构(添加索引)

  • 创建表的时候直接指定

  • 删除索引的语法

唯一索引

它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:

  • 创建索引

  • 修改表结构

  • 创建表的时候直接指定

实例

本例会创建一个简单的索引,名为 "PersonIndex",在 Person 表的 LastName 列:

如果你希望以降序索引某个列中的值,你可以在列名称之后添加保留字 DESC:

假如你希望索引不止一个列,你可以在括号中列出这些列的名称,用逗号隔开:

此种索引叫聚簇索引

使用ALTER 命令添加和删除索引

有四种方式来添加数据表的索引:

  • ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。

  • ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。

  • ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出现多次。

  • ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):该语句指定了索引为 FULLTEXT ,用于全文索引。

以下实例为在表中添加索引。

你还可以在 ALTER 命令中使用 DROP 子句来删除索引。尝试以下实例删除索引:

显示索引信息

你可以使用 SHOW INDEX 命令来列出表中的相关的索引信息。可以通过添加 \G 来格式化输出信息。


DML 增删改表中的数据

插入数据

第 1 种:给全表字段插入数据,不需要指定字段列表,但要求数据的值出现的顺序必须与表中的字段出现的顺序一致,并且凡是非数值数据,都需要用引号(建议使用单引号)括起来。

如果数据是字符型,必须使用单引号或者双引号,如:"value"。

第 2 种:给部分字段插入数据,需要选定字段列表,字段列表中字段出现的顺序与表中字段的顺序无关,但值列表中字段值的顺序必须与字段列表中的顺序保持一致。

删除数据

修改数据

在这里,建议尽量加上 where 条件,否则的话,操作的就是全表数据。

此外,判断更新操作是否成功,并不是看 SQL 语句是否执行成功,而是看是否有记录受到影响,即 affected 的数量大于 1 时,才是真正的更新成功。

DQL 查询表中的记录

查询数据

查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分割,并使用 WHERE 语句来设定查询条件。

  • 使用星号(*)来代替其他字段,SELECT 语句会返回表的所有字段数据

  • 使用 WHERE 语句来包含任何条件。

  • 使用 LIMIT 属性来设定返回的记录数。

  • 通过 OFFSET 指定 SELECT 语句开始查询的数据偏移量。默认情况下偏移量为 0。

基础查询

排序查询

排序方式:

  • ASC:升序(默认就是升序);

  • DESC:降序

注意:如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件;

聚合查询

分组查询

where 和 having 的区别:

  • where 在分组之前进行限定,如果不满足条件,则不参与分组。having 在分组之后进行限定,如果不满足结果,则不会被查询出来;

  • where 后面不能跟聚合函数,having 可以跟聚合函数的判断;

分页查询

模糊查询

  • 你可以在 WHERE 子句中指定任何条件.

  • 你可以在 WHERE 子句中使用 LIKE 子句.

  • 你可以使用 LIKE 子句代替等号 =.

  • LIKE 通常与 % 一同使用, 类似于一个元字符的搜索.

  • 你可以使用 AND 或者 OR 指定一个或多个条件.

  • 你可以在 DELETE 或 UPDATE 命令中使用 WHERE...LIKE 子句来指定条件.

like 匹配/模糊匹配,会与 %_ 结合使用.

  • % : 表示任意 0 个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示.

  • _ : 表示任意单个字符.匹配单个任意字符,它常用来限制表达式的字符长度语句.

  • [] : 表示括号内所列字符中的一个(类似正则表达式).指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个.

  • [^] : 表示不在括号所列之内的单个字符.其取值和 [] 相同,但它要求所匹配对象为指定字符以外的任一个字符.

  • 查询内容包含通配符时,由于通配符的缘故,导致我们查询特殊字符 "%"、"_"、"[" 的语句无法正常实现,而把特殊字符用 "[ ]" 括起便可正常查询.

多表查询

笛卡尔积

有两个集合A、B,取这两个集合的所有组成情况。

要完成多表查询,需要消除无用的数据。

内连接

隐式连接

使用where条件消除无用数据;

显示内连接

外连接

左外连接

右外连接

子查询

概念:查询中嵌套查询,称嵌套查询为子查询。

子查询的不同情况

子查询的结果是单行单列的;

子查询的结果是多行单列的;

子查询的结果是多行多列的;


DCL 管理用户、授权

管理用户

添加用户

删除用户

修改用户密码

查询用户


约束

描述

对表中的数据进行限定,保证数据的正确性、有效性、完整性。

非空约束

关键字:not null

作用:某一列的值不能为null;

唯一约束

关键字:unique;

作用:某一列的值不能重复;

注意: 唯一约束可以有 null 值,但是只能有一条记录为 null。通俗来讲,也就是说 null 值也不能重复出现;

主键约束

关键字:primary key;

作用:非空且唯一;

注意事项:

  • 一张表只能有一个字段为主键;

  • 但是可以设置为多个字段为主键,也即联合主键;

  • 主键就是表中记录的唯一标识;

自动增长

关键字:auto_increment;

作用:如果某一列是数值型的,可以完成值的自动增长。

这个值的增长,是按照上一条的数据进行增长。如果上一条数据是5,那么下一条就是6。

一般情况下,自动增长和主键一起使用;

外键约束

关键字:foreign key;

作用: 可定义表间以及表内必需的关系


数据库的设计

多表之间的关系

一对一

场景 : 人和身份证

分析:一个人只有一个身份证,一个身份证只能对应一个人。

实现方式:在任意一方设置唯一约束的外键指向另一方的主键;

一对多(多对一)

场景 : 部门和员工

分析:一个部门有多个员工,一个员工只能对应一个部门;

实现方式:在多的一方建立外键,指向一的一方的主键。

多对多

场景 : 学生和课程:

分析:一个学生可以选择很多门课,一个课程也可以被很多学生选择;

实现方式:多对多需要借助第三张中间表。


事物

如果一个包含多个步骤的业务操作,被事物管理,那么这些操作要么同时成功,要么同时失败;

事物的四大特征

  • 原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败;

  • 持久性:当事务提交或回滚后,数据库会持久化的保存数据;

  • 隔离性:多个事物之间,相互隔离;

  • 一致性:事务操作前后,数据总量不变;

事务的隔离级别

多个事物之间隔离的、相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。

存在的问题:

  • 脏读:一个事务,读取到另一个事务中没有提交的数据;

  • 不可重复度(虚读):在一个事务中,两次读取到的数据不一样;

  • 幻读:一个事务操作(DML)数据表中的所有记录,另一个事务添加了一条数据,则第一个事物查询不到自己的修改。

隔离级别:

  • read uncommitted : 读未提交

    • 产生的问题:脏读、不可重复读、幻读;

  • read committed : 读已提交

    • 产生的问题:不可重复读、幻读;

  • repeatable : 可重复读(Oracle 默认)

    • 产生的问题:幻读;

  • serializable : 串行化

    • 产生的问题:可以解决所有的问题;

注意:隔离级别从小到大安全性越来越高,但是效率越来越低;

查询数据隔离级别的语句:

数据库隔离等级的设置语句: