数据库使用笔记-基于mysql

来自🥬🐶程序员 Truraly | 田园 的博客,最新文章首发于:田园幻想乡 | 原文链接 | github (欢迎关注)

文章目录

    • MySql 一般信息
      • 观前提示
      • 登录 MySQL
      • SQL 语句
    • 数据库操作指令
      • show databases | 现实数据库列表
      • use <database_name> | 选择数据库
      • show tables | 显示指定数据库的所有表,使用该命令前需要使用 use 命令来选择要操作的数据库。
      • create database | 创建数据库
      • drop database | 删除数据库
      • grant | 授权
    • 数据类型
      • 数字类型
      • 日期和时间类型
      • 字符串类型
    • 数据表操作
      • show colums | 显示数据表的属性,属性类型,主键信息 ,是否为 NULL,默认值等其他信息。
      • show index | 显示索引信息
      • create table
      • 字段关键字
        • PK | Primary Key
        • NN | Not Null
        • UQ | Unique
        • AI | Auto Increment
      • alter table | 修改表
        • add
        • modify
        • drop
      • drop table
    • select | 查询
    • insert into | 插入
    • update | 修改
    • dalete | 删除
    • 辅助语句
      • where(条件)
      • exists
      • and & or
      • order by
      • as
      • like
      • union 合并
      • group by 聚合函数
      • having 筛选
      • limit 取顶
      • inner join 连接
      • except 取差集
    • fun | 函数
      • fun : count(\*)
      • fun : 时间
    • 删库跑路
      • truncate
      • delete
    • trigger | 触发器
    • delimiter
    • index | 索引
      • create 创建索引
        • index
        • unique index 唯一约束
        • clustered index 聚簇索引
      • SHOW INDEX | 查看索引
      • drop index | 删除索引
    • procedure | 储存过程
    • 用户管理
      • create user | 创建用户
      • 用户修改
      • 用户删除
      • mysql 密码安全级别策略
    • other
      • 实践案例
    • 数据库导入与导出

目录

[[toc]]


Mysql 中文文档:

Mysql 英文文档:

MySql 一般信息

观前提示

文章中的代码块,若需要展示 sql 语句输出结果,会选择用 bash 高亮,否则使用 sql 高亮。

登录 MySQL

mysql -h 主机名 -u 用户名 -p
## -h : 指定客户端所要登录的 MySQL 主机名, 登录本机(localhost 或 127.0.0.1)该参数可以省略;
## -u : 登录的用户名;
## -p : 告诉服务器将会使用一个密码来登录, 如果所要登录的用户名密码为空, 可以忽略此选项。## 如果我们要登录本机的 MySQL 数据库,只需要输入以下命令即可:
mysql -u root -pmysql>
## 使用exit或quit退出

SQL 语句

数据库编程语言,只能在关系型数据库中使用

特点:

  • 大小写不敏感
  • 注释格式-- 注释内容(别忘了空格)
  • MySQL 中有两种不同类型的引号:反引号(`)用于列名,单引号(')用于字

数据库操作指令

show databases | 现实数据库列表

列出 MySQL 数据库管理系统的数据库列表。

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| RUNOOB             |
| cdcol              |
| mysql              |
| onethink           |
| performance_schema |
| phpmyadmin         |
| test               |
| wecenter           |
| wordpress          |
+--------------------+
10 rows in set (0.02 sec)

use <database_name> | 选择数据库

选择要操作的 Mysql 数据库,使用该命令后所有 Mysql 命令都只针对该数据库。

use <database_name>;

show tables | 显示指定数据库的所有表,使用该命令前需要使用 use 命令来选择要操作的数据库。

mysql> use RUNOOB;
Database changed
mysql> SHOW TABLES;
+------------------+
| Tables_in_runoob |
+------------------+
| employee_tbl |
| runoob_tbl |
| tcount_tbl |
+------------------+
3 rows in set (0.00 sec)
-- 该命令将输出Mysql数据库管理系统的性能及统计信息。
SHOW TABLE STATUS FROM <table_name>;   # 显示数据库 table_name 中所有表的信息
SHOW TABLE STATUS from <table_name> LIKE 'runoob%';     # 表名以runoob开头的表的信息
SHOW TABLE STATUS from <table_name> LIKE 'runoob%'\G;   # 加上 \G,查询结果按列打印

create database | 创建数据库

-- create数据库
mysql
mysql> CREATE DATABASE <数据库名>;
## 不用进入数据库就能创建-快捷指令
$ mysqladmin -u root -p create RUNOOB
Enter password:******

drop database | 删除数据库

mysql> drop database <数据库名>;
## 快捷方法
[root@host]# mysqladmin -u root -p drop RUNOOB
Enter password:******

grant | 授权

mysql 权限分布:

  • 表级权限:Select、 Insert、 Update、 Delete、Create 、Drop、Grant、 References、 lndex、 Alter
  • 列级权限:Select、 Insert、 Update、References
  • 过程权限:Execute、Alter Routine、Grant
-- 授权
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
-- 部分权限
mysql> GRANT SELECT, INSERT ON mydb.* TO 'someuser'@'somehost';

*.* 表示所有数据库的所有表,mydb.* 表示 mydb 数据库的所有表,mydb.mytable 表示 mydb 数据库的 mytable 表。

数据类型

大致分为数字/字符串/日期

数字类型

类型大小范围(有符号)范围(无符号)用途
TINYINT1 Bytes(-128,127)(0,255)小整数值
SMALLINT2 Bytes(-32 768,32 767)(0,65 535)大整数值
MEDIUMINT3 Bytes(-8 388 608,8 388 607)(0,16 777 215)大整数值
INT 或 INTEGER4 Bytes(-2 147 483 648,2 147 483 647)(0,4 294 967 295)大整数值
BIGINT8 Bytes(-9,223,372,036,854,775,808,9 223 372 036 854 775 807)(0,18 446 744 073 709 551 615)极大整数值
FLOAT4 Bytes(-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38)0,(1.175 494 351 E-38,3.402 823 466 E+38)单精度 浮点数值
DOUBLE8 Bytes(-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)双精度 浮点数值
DECIMAL对 DECIMAL(M,D) ,如果 M>D,为 M+2 否则为 D+2依赖于 M 和 D 的值依赖于 M 和 D 的值小数值
  • TINYINT 经常被用成布尔值

日期和时间类型

每个时间类型有一个有效值范围和一个"零"值,当指定不合法的 MySQL 不能表示的值时使用"零"值。

TIMESTAMP 类型有专有的自动更新特性,将在后面描述。

类型大小 ( bytes)范围格式用途
DATE31000-01-01/9999-12-31YYYY-MM-DD日期值
TIME3‘-838:59:59’/‘838:59:59’HH:MM:SS时间值或持续时间
YEAR11901/2155YYYY年份值
DATETIME8‘1000-01-01 00:00:00’ 到 ‘9999-12-31 23:59:59’YYYY-MM-DD hh:mm:ss混合日期和时间值
TIMESTAMP4‘1970-01-01 00:00:01’ UTC 到 ‘2038-01-19 03:14:07’ UTC 结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038 年 1 月 19 日 凌晨 03:14:07YYYY-MM-DD hh:mm:ss混合日期和时间值,时间戳

字符串类型

类型大小用途
CHAR0-255 bytes定长字符串
VARCHAR0-65535 bytes变长字符串
TINYBLOB0-255 bytes不超过 255 个字符的二进制字符串
TINYTEXT0-255 bytes短文本字符串
BLOB0-65 535 bytes二进制形式的长文本数据
TEXT0-65 535 bytes长文本数据
MEDIUMBLOB0-16 777 215 bytes二进制形式的中等长度文本数据
MEDIUMTEXT0-16 777 215 bytes中等长度文本数据
LONGBLOB0-4 294 967 295 bytes二进制形式的极大文本数据
LONGTEXT0-4 294 967 295 bytes极大文本数据

注意:char(n) 和 varchar(n) 中括号中 n 代表字符的个数,并不代表字节个数,比如 CHAR(30) 就可以存储 30 个字符。

CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。

BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。

BLOB 是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。

有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择。

数据表操作

show colums | 显示数据表的属性,属性类型,主键信息 ,是否为 NULL,默认值等其他信息。

mysql> SHOW COLUMNS FROM runoob_tbl;
+-----------------+--------------+------+-----+---------+-------+
| Field           | Type         | Null | Key | Default | Extra |
+-----------------+--------------+------+-----+---------+-------+
| runoob_id       | int(11)      | NO   | PRI | NULL    |       |
| runoob_title    | varchar(255) | YES  |     | NULL    |       |
| runoob_author   | varchar(255) | YES  |     | NULL    |       |
| submission_date | date         | YES  |     | NULL    |       |
+-----------------+--------------+------+-----+---------+-------+
4 rows in set (0.01 sec)

用这个也行

desc <table_name>;

show index | 显示索引信息

显示数据表的详细索引信息,包括 PRIMARY KEY(主键)

mysql> SHOW INDEX FROM runoob_tbl;
+------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table      | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| runoob_tbl |          0 | PRIMARY  |            1 | runoob_id   | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
+------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
1 row in set (0.00 sec)

create table

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

  • 表名
  • 表字段名
  • 定义每个表字段
CREATE TABLE table_name (column_name column_type);
CREATE TABLE IF NOT EXISTS `runoob_tbl`(`runoob_id` INT UNSIGNED AUTO_INCREMENT,`runoob_title` VARCHAR(100) NOT NULL,`runoob_author` VARCHAR(40) NOT NULL,`submission_date` DATE,PRIMARY KEY ( `runoob_id` ) -- 约束条件
)ENGINE = InnoDB DEFAULT CHARSET = utf8;
  • 如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为NULL ,就会报错。
  • AUTO_INCREMENT 定义列为自增的属性,一般用于主键,数值会自动加 1。
  • PRIMARY KEY 关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。
  • ENGINE 设置存储引擎,CHARSET 设置编码。

字段关键字

字段关键字用于定义列的属性,下面是常用的字段关键字:

PK | Primary Key

主键、唯一标识

多主键例子:

create table sc(sno char(9) ,cno char(4) ,primary key(sno, cno)
);
NN | Not Null

值不允许为空

UQ | Unique

值唯一

AI | Auto Increment

值自动增长

alter table | 修改表

alter table <table_name>[add [column] <column_name> <data_type> [完整约束性]][add <表级完整约束性>][drop [column] <column_name> [cascade|restrict]]
add
-- 向基本表Students中增加“入学时间”属性列,其属性名为Sentrancedate,数据类型为DATETIME型
mysql> alter table students add sentrancedate DATETIME;
-- 删除Sname(姓名)必须取唯一值的约束
mysql> alter table students add unique(sname);
-- 修改表course中cname字段为强制唯一性字段
mysql> ALTER TABLE course ADD UNIQUE (cname);
-- 在表student中增加新字段 “班级名称(sclass)”字符类型为varchar(10)
mysql> ALTER TABLE student ADD sclass varchar(10);
-- 修改表sc中grade字段的值域为0-100
mysql> ALTER TABLE sc ADD CONSTRAINT grade_check CHECK (grade >= 0 AND grade <= 100);
modify
-- 将Sage(年龄)的数据类型改为SMALLINT型
mysql> alter table students modify column sage SMALLINT;
-- 修改表student中ssex字段默认值为‘男’
mysql> ALTER TABLE student MODIFY ssex CHAR(2) DEFAULT '男';
-- 修改表student中字段名为“sname”的字段长度由原来的6改为8
mysql> ALTER TABLE student MODIFY COLUMN sname VARCHAR(8);
drop
-- 在表student中删除字段“班级名称(sclass)”
mysql> ALTER TABLE student drop sclass;

drop table

drop table table_name ;--------------
mysql> use RUNOOB;
Database changed
mysql> DROP TABLE runoob_tbl;
Query OK, 0 rows affected (0.8 sec)-- 更合理的方法(减少报错)
-- 如果表存在则删除表
drop table if exists 表名;

select | 查询

查询数据

-- 通过 * 把 users 表中所有的数据查询出来
select * from users-- 从 users 表中把 username 和 password 对应的数据查询出来
select username, password from users

insert into | 插入

插入数据

-- 向 users 表中,插入新数据,username 的值为 tony stark  password 的值为 098123
-- 括号里的数据要对应
insert into users (username, password) values ('tony stark', '098123')-- 从一个表搬到另一个表
-- 需要注意的是,关系模式必须完全一样才能进行插入操作。
INSERT INTO History_Student
SELECT * FROM Students

Nodejs

// 向 users 表中,新增一条数据,其中 username 的值为 Spider-Man,password 的值为 pcc123
const user = { username: "Spider-Man", password: "pcc123" };
// 定义待执行的 SQL 语句
const sqlStr = "insert into users (username, password) values (?, ?)";
// 执行 SQL 语句
db.query(sqlStr, [user.username, user.password], (err, results) => {// 执行 SQL 语句失败了if (err) return console.log(err.message);// 成功了// 注意:如果执行的是 insert into 插入语句,则 results 是一个对象// 可以通过 affectedRows 属性,来判断是否插入数据成功if (results.affectedRows === 1) {console.log("插入数据成功!");}
});//// 向表中新增数据时,如果数据对象的每个属性和数据表的字段一一对应,则可以通过如下方式快速插入数据
// 演示插入数据的便捷方式
const user = { username: "Spider-Man2", password: "pcc4321" };
// 定义待执行的 SQL 语句
const sqlStr = "insert into users set ?";
// 执行 SQL 语句
db.query(sqlStr, user, (err, results) => {if (err) return console.log(err.message);if (results.affectedRows === 1) {console.log("插入数据成功");}
});

update | 修改

修改数据

-- 将 id 为 4 的用户密码,更新成 888888
update users set password = '888888' where id = 4-- 更新 id 为 2 的用户,把用户密码更新为 admin123  同时,把用户的状态更新为 1
update users set password = 'admin123', status = 1 where id = 2

dalete | 删除

删除数据

-- 删除 users 表中, id 为 4 的用户
delete from users where id = 4

使用 DELETE 语句,会把真正的把数据从表中删除掉。为了保险起见,推荐使用标记删除的形式,来模拟删除的动作。 所谓的标记删除,就是在表中设置类似于 status 这样的状态字段,来标记当前这条数据是否被删除。 当用户执行了删除的动作时,我们并没有执行 DELETE 语句把数据删除掉,而是执行了 UPDATE 语句,将这条数据对应 的 status 字段标记为删除即可

辅助语句

where(条件)

select field1, field2,...fieldN from table_name1, table_name2...
[WHERE condition1 [AND [OR]] condition2.....
  • 查询语句中你可以使用一个或者多个表,表之间使用逗号**,** 分割,并使用 WHERE 语句来设定查询条件。
  • 你可以在 WHERE 子句中指定任何条件。
  • 你可以使用 AND 或者 OR 指定一个或多个条件。
  • WHERE 子句类似于程序语言中的 if 条件,根据 MySQL 表中的字段值来读取指定的数据。

WHERE 子句用于限定选择的标准。在 SELECT、UPDATE、DELETE 语句中,皆可使用 WHERE 子句来限定选择的标准

可用的表达式

表达式结束
=不解释
<>
>
<
>=
<=
between某范围内
like搜索某种模式
-- 演示 where 子句的使用
select * from users where status=1
select * from users where id >= 2
select * from users where username <> 'ls'
select * from users where username != 'ls'

exists

EXISTS 运算符用于判断查询子句是否有记录,如果有一条或多条记录存在返回 True,否则返回 False。

SELECT column_name(s)
FROM table_name
WHERE EXISTS
(SELECT column_name FROM table_name WHERE condition);

and & or

-- 使用 AND 来显示所有状态为0且id小于3的用户
select * from users where status=0 and id<3-- 使用 or 来显示所有状态为1 或 username 为 zs 的用户
select * from users where status=1 or username='zs'

order by

将结果排序

升序(ASC)------降序(DESC)

-- 对users表中的数据,按照 status 字段进行升序排序
select * from users order by status-- 按照 id 对结果进行降序的排序  desc 表示降序排序   asc 表示升序排序(默认情况下,就是升序排序的)
select * from users order by id desc-- 对 users 表中的数据,先按照 status 进行降序排序,再按照 username 字母的顺序,进行升序的排序(次级排序)
select * from users order by status desc, username asc

as

如果希望给查询出来的列名称设置别名,可以使用 AS 关键字 s

-- 使用 AS 关键字给列起别名
select count(*) as total from users where status=0
select username as uname, password as upwd from users

like

在 WHERE 子句中使用 SQL LIKE 子句。

  • SQL LIKE 子句中使用百分号 **%**字符来表示任意字符,类似于 UNIX 或正则表达式中的星号 *

  • **_**代表任意一个字符

  • 你可以使用 LIKE 子句代替等号 =。如果没有使用百分号 %, LIKE 子句与等号 = 的效果是一样的。

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

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

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

SELECT field1, field2,...fieldN
FROM table_name
WHERE field1 LIKE condition1

union 合并

MySQL UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT 语句会删除重复的数据。

SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];
  • expression1, expression2, … expression_n: 要检索的列。
  • tables: 要检索的数据表。
  • WHERE conditions: 可选, 检索条件。
  • DISTINCT: 可选,删除结果集中重复的数据。默认情况下 UNION 操作符已经删除了重复数据,所以 DISTINCT 修饰符对结果没啥影响。
  • ALL: 可选,返回所有结果集,包含重复数据。

group by 聚合函数

GROUP BY 语句用于结合聚合函数,根据一个或多个列对结果集进行分组。

-- 3. 显示选修的课程数大于3的各个学生的选修课程数
select sno,count(cno) as '选课数'
from sc
group by sno
having count(cno) >3;
+-----------+-----+-------+
| sno       | cno | grade |
+-----------+-----+-------+
| 201215121 | 1   |    92 |
| 201215121 | 2   |    85 |
| 201215121 | 3   |    88 |
| 201215122 | 2   |    90 |
| 201215122 | 3   |    80 |
+-----------+-----+-------+
5 rows in set (0.00 sec)

having 筛选

在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数一起使用。

HAVING 子句可以让我们筛选分组后的各组数据。

-- 4. 显示平均成绩大于“201215121”学生平均成绩的各个学生的学号、平均成绩
select sno,avg(grade) as avgcno
from sc
group by sno
having avg(grade) >(select avg(grade)from scwhere sno = '201215121'
);

limit 取顶

LIMIT 是用于限制查询结果返回的行数的关键字。它可以用于在查询中返回指定数量的行数,从而控制查询结果的大小。例如,可以使用 LIMIT 语句来返回前 10 行或下 5 行数据

mysql> select sno,count(cno) as cnonumfrom scgroup by snoorder by cnonum desclimit 1;
+-----------+--------+
| sno       | cnonum |
+-----------+--------+
| 201215121 |      3 |
+-----------+--------+
1 row in set (0.00 sec)

inner join 连接

INNER JOIN 是一种用于连接两个或多个表的 SQL 语句。它返回两个表中连接字段相等的行。INNER JOIN 在 SELECT 语句中作为可选部分,出现在 FROM 子句之后。在使用 INNER JOIN 之前,必须指定主表,并将要连接的表放在 INNER JOIN 子句中。INNER JOIN 可以连接多个其他表。可以在 INNER JOIN 子句中使用 ON 关键字来指定两个表之间的连接条件。如果在 INNER JOIN 中连接的两个表中没有匹配的行,则不会返回任何结果。INNER JOIN 通常与其他类型的 JOIN(如 LEFT JOIN 和 RIGHT JOIN)一起使用。

以下是一个连接两个表的 INNER JOIN 的示例:

SELECT *
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;

这将返回 table1 和 table2 中连接字段相等的行。

except 取差集

EXCEPT是 SQL 中的一个关键字,表示取差集。在 SQL 中,差集是指两个数据集之间的元素的差异。例如,如果有两个数据集 A 和 B,那么 A 和 B 之间的差集就是只属于 A 或只属于 B 的元素的集合。在 SQL 中,可以使用EXCEPT关键字来获取两个结果集之间的差异。EXCEPT的作用是返回属于第一个查询结果集但不属于第二个查询结果集的所有行。

使用EXCEPT运算符,查询数学系的学生,再查询年龄不大于 20 岁的学生,最后取差集。例如:

(SELECT * FROM Student WHERE Sdept = '数学') EXCEPT (SELECT * FROM Student WHERE Sage > 20);

fun | 函数

fun : count(*)

-- 使用 count(*) 来统计 users 表中,状态为 0 用户的总数量
select count(*) from users where status = 0

fun : 时间

  1. 使用 YEAR() 函数从指定日期值中获取年份值,使用 NOW() 函数获取当前日期和时间。
  2. 将 NOW() 函数的结果作为 YEAR() 函数的参数,即可从当前日期和时间中获取到年份值。
  3. 使用 SELECT 语句来查询当前年份,例如 SELECT YEAR(NOW());

示例代码:

删库跑路

truncate

  • truncate 是一种删除所有数据的方式,保留表结构,不能撤消还原。
  • 可以使用truncate table 表名删除表中所有数据。
  • truncate 删除数据后不记录日志,不可以恢复数据,相当于保留 mysql 表的结构,重新创建了这个表,所有的状态都相当于新表。
  • truncate 删除数据后是不可以进行 rollback 操作,语句不能与 where 一起使用。
  • truncate 不写服务器 log,速度快。
-- 删除表中所有数据
truncate table 表名;

delete

  • delete 是一种逐行删除的方式,速度较慢,不适合大量数据删除。
  • 可以使用delete from 表名删除表中所有数据。
  • 也可以使用delete from 表名 where 条件删除符合条件的数据。
  • delete 清除数据后会记录日志,可以恢复数据。
-- 删除表中所有数据
delete from 表名;-- 删除id大于10的数据
delete from 表名 where id > 10;

trigger | 触发器

CREATE TRIGGER trigger_nameBEFORE|AFTER trigger_EVENT ON TABLE_NAMEFOR EACH ROWtrigger_STMT

其中,trigger_name表示要创建的触发器名。BEFOREAFTER指定了触发器执行的时间,前者在触发器事件之前执行,后者在触发器事件之后执行。trigger_EVENT指定了触发器要响应的事件,可以是INSERTUPDATEDELETETABLE_NAME指定了要绑定触发器的表名。FOR EACH ROW表示触发器会为每一行数据都执行一次。trigger_STMT是触发器的执行语句。

  • 在触发器中使用 SET,而不是 INSERT 和 UPDATE。

delimiter

新指定一个特殊的分隔符,通常会使用“//”、“$$”或“&&”等。

-- 指定$$为结束符
delimiter $$

index | 索引

create 创建索引

index
-- 创建一个简单的索引
create index index_name on table_name(columns_name);
unique index 唯一约束

CREATE INDEXCREATE UNIQUE INDEX 之间的主要区别在于唯一性约束。CREATE INDEX 创建的是一个普通索引,它允许表中的行具有相同的索引值。而 CREATE UNIQUE INDEX 创建的是唯一索引,它不允许表中的行具有相同的索引值,即每个索引值在表中必须是唯一的

create unique index index_name on table_name(columns_name);
clustered index 聚簇索引

聚簇索引是一种在数据库中提高查询性能的方法,它会将具有相同值的行存储在一起,形成一个聚簇。在基本表 Students 的 Sname(姓名)和 Sno(学号)列上建立一个聚簇索引,并且按照 Sname 值和 Sno 值的升序存放,可以使用如下 SQL 语句:

create clustered index Stu_Sname_Sno ON Students(Sname, Sno);

这个 SQL 语句中,create CLUSTERED INDEX表示创建聚簇索引,Stu_Sname_Sno是索引的名称,Students(Sname, Sno)表示在 Students 表中的 Sname 和 Sno 列上创建索引。这个语句还指定了聚簇索引的排序方式,即按照 Sname 和 Sno 的升序存放。

需要注意的是,在创建聚簇索引时,SQL Server 会将表的数据按照指定的排序方式重新组织并存储,因此创建聚簇索引需要消耗大量的时间和磁盘空间。同时,聚簇索引只能创建在一个表上,因此需要根据具体的查询需求和表的结构来决定是否创建聚簇索引。

  • MySQL 不支持 CLUSTERED INDEX 语法

根据 MySQL 的官方文档,MySQL 不支持 “CLUSTERED INDEX” 语法。在 MySQL 中,你可以使用 “PRIMARY KEY” 或 “UNIQUE INDEX” 来创建一个具有聚簇索引特性的索引。可以参考以下示例:

CREATE TABLE Students (Sno INT PRIMARY KEY,Sname VARCHAR(50),UNIQUE INDEX Stu_Sname_Sno (Sname, Sno)
);

在这个示例中,我们使用 “PRIMARY KEY” 为 “Sno” 列创建了一个聚簇索引,同时使用 “UNIQUE INDEX” 为 “Sname” 和 “Sno” 列创建了一个唯一索引。这样,你就可以在不使用 “CLUSTERED INDEX” 语法的情况下实现相同的目的。

SHOW INDEX | 查看索引

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

尝试以下实例:

show index from table_name\G;

drop index | 删除索引

-- 删除索引
drop index index_name on table_name;

这个 SQL 语句中,DROP INDEX表示删除索引,Stu_Sname_Sno是要删除的索引的名称,Students是要删除索引的表。

procedure | 储存过程

--  1、创建存储过程,获取平均分及至少有一项小于60分的
-- 学生名单
DELIMITER $ $ --
create procedure get_avg_course() begin
selectstuName
fromstuinfo
wherestuNo in(selectstuNofromstumarkswherewrittenExam + labExam < 120and (writtenExam < 60or labExam < 60));end $ $ --
delimiter;-- 2、定义笔试及格线和机试及格线这两个参数,使笔试和
-- 机试的及格线可以通过参数值调整。
DELIMITER $ $ --
create procedure get_avg_course_plus(in written_pass_line int, in lab_pass_line int) begin
selectstuName
fromstuinfo
wherestuNo in(selectstuNofromstumarkswherewrittenExam > written_pass_lineand labExam > lab_pass_line);end $ $ --
delimiter;

用户管理

用户信息存在 mysql 的 mysql 数据库的 user 表中,可以直接修改用户信息

create user | 创建用户

-- 创建用户
create user 'username'@'host' identified by 'password';

host(可以省略) 可以是 IP 地址或者主机名,% 表示所有主机,localhost 表示本地主机。

创建用户时需要当前用户具有创建用户的权限,否则会报错。

用户修改

-- 修改用户信息
update 表名 set user='新用户名' where user='旧用户名' and host='用户地址';

用户删除

-- 删除用户
drop user 'username'@'host';

mysql 密码安全级别策略

修改安全策略需要安装插件 validate_password

INSTALL PLUGIN validate_password SONAME 'validate_password.so';
-- 查看安全策略
SHOW VARIABLES LIKE 'validate_password%';+-------------------------------------------------+--------+
| Variable_name                                   | Value  |
+-------------------------------------------------+--------+
| validate_password.changed_characters_percentage | 0      |
| validate_password.check_user_name               | ON     |
| validate_password.dictionary_file               |        |
| validate_password.length                        | 8      |
| validate_password.mixed_case_count              | 1      |
| validate_password.number_count                  | 1      |
| validate_password.policy                        | MEDIUM |
| validate_password.special_char_count            | 1      |
| validate_password_check_user_name               | ON     |
| validate_password_dictionary_file               |        |
| validate_password_length                        | 8      |
| validate_password_mixed_case_count              | 1      |
| validate_password_number_count                  | 1      |
| validate_password_policy                        | MEDIUM |
| validate_password_special_char_count            | 1      |
+-------------------------------------------------+--------+-- 修改安全策略
-- 设置密码安全策略为低
set global validate_password_policy=LOW;-- 设置密码安全策略为0
set global validate_password_policy=0;-- 还原密码安全策略
set global validate_password_policy=medium;

other

实践案例

首先,我们需要使用 MySQL 创建一个存储过程来获取平均分以及至少有一项小于 60 分的学生名单。我们可以使用以下步骤来创建这个存储过程 | CSDN:

  1. 使用CREATE PROCEDURE语句创建存储过程,并给它一个名称。
  2. 在括号中定义过程参数,如果需要的话。
  3. BEGINEND之间编写过程体,这里需要使用SELECT语句来获取学生信息。
  4. 使用DELIMITER语句来指定结束符,这个结束符可以是两个特殊符号,比如$$//等。
  5. 最后,使用CALL语句来调用这个存储过程并获取结果。

下面是一个示例代码,创建了一个名为get_avg_score的存储过程,获取平均分以及至少有一项小于 60 分的学生名单。其中,我们假设学生信息存储在tb_students_score表中 [2]:

-- 设置结束符
DELIMITER $$
-- 创建存储过程
CREATE PROCEDURE get_avg_score()
BEGIN
SELECT AVG(student_score) AS avg_score, GROUP_CONCAT(student_name) AS fail_students
FROM tb_students_score
WHERE student_score < 60;
END $$
-- 调用存储过程
CALL get_avg_score();

接下来,我们需要定义笔试及格线和机试及格线这两个参数,以便可以通过参数值调整他们的及格线。我们可以使用以下步骤来创建一个带参数的存储过程 | CSDN:

  1. 使用CREATE PROCEDURE语句创建存储过程,并给它一个名称。
  2. 在括号中定义过程参数,使用IN关键字来指定参数是输入参数。
  3. 在过程体中使用定义的参数来进行计算或其他操作。
  4. 使用DELIMITER语句来指定结束符,这个结束符可以是两个特殊符号,比如$$//等。
  5. 最后,使用CALL语句
DELIMITER //
CREATE PROCEDURE get_avg_score(IN pass_score INT, INOUT written_score INT, INOUT machine_score INT)
BEGINDECLARE avg_score FLOAT;SELECT AVG(score) INTO avg_score FROM student_score;SELECT avg_score;SELECT COUNT(*) INTO written_score FROM student_score WHERE written_exam >= pass_score;SELECT COUNT(*) INTO machine_score FROM student_score WHERE machine_exam >= pass_score;
END //
DELIMITER ;

数据库导入与导出

mysql 导入导出命令详细总结,看这一篇就够了_mysql 导入导出命令 | CSDN

mysqldump -h IP地址 -P 端口 -u 用户名 -p 数据库名 > 导出的文件名

————————————————

版权声明:本文为 田园幻想乡 的原创文章,遵循 CC 4.0 BY-NA-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:http://truraly.fun/课程笔记/数据库笔记.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/874121.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

问题解决实录 | Anaconda | Anaconda Navigator 启动无反应

问题解决实录 | Anaconda | Anaconda Navigator 启动无反应 以管理员身份运行 Anaconda Prompt conda update -n root conda conda update --all如果执行完以上步骤 碰到 AttributeError: module ‘pkgutil’ has no attribute ‘ImpImporter’. Did you mean: ‘zipimporter…

HC-SR04超声波测距模块使用方法和例程(STM32快速移植)

基于STM32和HC-SR04模块实现超声波测距功能 HC-SR04硬件概述HC-SR04超声波距离传感器的核心是两个超声波传感器。一个用作发射器&#xff0c;将电信号转换为40 KHz超声波脉冲。接收器监听发射的脉冲。如果接收到它们&#xff0c;它将产生一个输出脉冲&#xff0c;其宽度可用于…

各类专业技术的pdf电子书

从业多年&#xff0c;收集了海量的pdf电子书籍&#xff0c;感兴趣的私聊。

App Instance 架构示例

前言 在Unity程序设计过程中&#xff0c;我们处理的第一个对象是Application Instance。 它的主要职责是启动流程管理、卸载流程管理&#xff0c;次要职责是管理在内部的子系统生命周期。其他职责&#xff0c;提供或桥接应用程序的配置信息、及其他第三方接口。 它通常以单例的…

图解 Hadoop 架构 |Yarn、MapReduce

Hadoop Hadoop 是什么 Hadoop 是由 Apache 基金会所开发&#xff0c;维护的分布式系统基础架构主要解决海量数据的存储和海量数据的分析计算问题广义上来说&#xff0c;Hadoop 通常是指一个更广泛的概念——Hadoop 生态圈&#xff0c;包括 MapReduce&#xff0c;HDFS&#xf…

淼淼瀛湖水,青青枇杷林

淼淼瀛湖水&#xff0c;青青枇杷林 ——西安工程大学赴陕西安康“筑梦乡村&#xff0c;携手同行”暑期社会实践团 俗语言“五月枇杷满树金”。枇杷营养丰富&#xff0c;食用&#xff0c;具有止渴、润燥、清肺、止咳等功效。为探索枇杷产业&#xff0c;实现乡村振兴&#xff0c…

代码随想录 day 18 二叉树

第六章 二叉树part06 详细布置 530.二叉搜索树的最小绝对差 需要领悟一下二叉树遍历上双指针操作&#xff0c;优先掌握递归 题目链接/文章讲解&#xff1a;https://programmercarl.com/0530.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E7%9A%84%E6%9C%80%E5%B0%8F%E7%B…

MacOSM1 配置Miniconda环境,并设置自启动

文章目录 设置环境变量设置自启动参考 设置环境变量 cd vim .zshrc输入一下内容 # 配置Conda CONDA_HOME/Users/hanliqiang/miniconda3 PATH$CONDA_HOME/bin:$PATH生效配置 source .zshrc设置自启动 conda init zsh.zshrc 文件中将会出现以下内容 # >>> conda i…

数据结构~~顺序表

目录 一、顺序表的概念 二、顺序表的接口实现 1.顺序表初始化 2.顺序表销毁 3.检查空间并扩容 4.顺序表尾插、顺序表头插 5.顺序表尾删、顺序表头删 6.顺序表查找 7.顺序表在pos位置插入x、删除pos位置的值 三、完整代码 四、总结 一、顺序表的概念 顺序表是用一段…

SpringCloud的认识和初步搭建

目录 一.认识SpringCloud 二.SpringCloud的部署 2.1开发环境 2.2数据库的建立 2.3SpringCloud的部署 第一步&#xff1a; 创建Maven项目 第二步&#xff1a;完善pom文件 第三步&#xff1a;创建两个子项目 第四步&#xff1a;声明项目依赖以及构建插件 第五步&#xf…

Leetcode 3224. Minimum Array Changes to Make Differences Equal

Leetcode 3224. Minimum Array Changes to Make Differences Equal 1. 解题思路2. 代码实现 题目链接&#xff1a;3224. Minimum Array Changes to Make Differences Equal 1. 解题思路 这一题思路上还是挺巧妙的&#xff0c;主要就是一个累计数组的思路。 对于任意两个数 …

cocos2d-x安装和项目

首先多方查找资料发现教程很简洁&#xff0c;发现对自己的操作方面没多大帮助&#xff0c;后来干脆去官网&#xff0c;好像也很简洁。基于这样一个原因&#xff0c;加上我首次碰cocos2d-x&#xff0c;决定记录一下整个流程&#xff0c;解决实际操作上的疑惑。 涉及的方面&…

PHP接口与性状的优雅应用

本文由 ChatMoney团队出品 在PHP编程中&#xff0c;接口是一种定义对象之间交互契约的强大工具。其核心目的不是让一个对象紧耦合地依赖另一个对象的特定身份&#xff0c;而是基于另一对象的能力进行交互。通过接口&#xff0c;我们的代码可以实现与依赖的解耦&#xff0c;从而…

爬虫的深度爬取

爬虫的深度爬取和爬取视频的方式 深度爬取豆瓣读书 import time import fake_useragent import requests from lxml import etree head {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 …

【Python】探索 Python 中的 slice 方法

为何每次早餐 仍然魂离魄散 原来 那朝分手都要啜泣中上班 明明能够过得这关 赢回旁人盛赞 原来 顽强自爱这样难 难得的激情总枉费 残忍的好人都美丽 别怕 你将无人会代替 &#x1f3b5; 陈慧娴《情意结》 在 Python 编程中&#xff0c;切片&#xff08;sl…

Docker核心技术:Docker的基本使用

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 Docker核心技术 系列文章&#xff1a;Docker的基本使用&#xff0c;其他文章快捷链接如下&#xff1a; 应用架构演进容器技术要解决哪些问题Docker的基本使用&#xff08;本文&#xff09;Docker是如何实现的 3…

MongoDB自学笔记(四)

一、前文回顾 上一篇文章中我们学习了MongoDB中的更新方法&#xff0c;也学了一部分操作符。今天我们将学习最后一个操作“删除”。 二、删除 原始数据如下&#xff1a; 1、deleteOne 语法&#xff1a;db.collection.deleteOne(< query >,< options >) 具体参…

wordpress数据库中,文章表和作者表有什么关系

1、文章表&#xff1a; 在WordPress的数据库中&#xff0c;文章&#xff08;包括帖子、页面等&#xff09;的信息存储在wp_posts表中&#xff08;注意&#xff0c;如果自定义了数据库前缀&#xff0c;则可能是其他名称&#xff0c;如yourprefix_posts&#xff09;。这个表包含…

【SD】 Stable Diffusion(SD)原理详解与ComfyUI使用 2

Stable Diffusion&#xff08;SD&#xff09;原理详解与ComfyUI使用 Stable Diffusion&#xff08;SD&#xff09;原理详解与ComfyUI使用1. SD整体结构2. Clip&#xff08;文本编码器&#xff09;3. Unit&#xff08;生成模型&#xff09;4. VAE&#xff08;变分自编码器&#…

Electron 结合 Selenium + chromedriver 驱动服务实现浏览器多开

背景 在调研浏览器多开的过程中&#xff0c;electron 有自带的 browserview&#xff0c;webview&#xff0c;但是上面两个受制于 electron 内核版本限制&#xff0c;升级不够灵活&#xff0c;对新版的网页支持可能不及时&#xff0c;甚至不兼容&#xff0c;必须通过发布新的客…