网站开发技术文档,门户网站系统建设方案,天津网站制作软件,雷锋书签制作图片来自#x1f96c;#x1f436;程序员 Truraly | 田园 的博客#xff0c;最新文章首发于#xff1a;田园幻想乡 | 原文链接 | github #xff08;欢迎关注#xff09; 文章目录 MySql 一般信息观前提示登录 MySQLSQL 语句 数据库操作指令show databases | 现实数据库列表u…来自程序员 Truraly | 田园 的博客最新文章首发于田园幻想乡 | 原文链接 | github 欢迎关注 文章目录 MySql 一般信息观前提示登录 MySQLSQL 语句 数据库操作指令show databases | 现实数据库列表use database_name | 选择数据库show tables | 显示指定数据库的所有表使用该命令前需要使用 use 命令来选择要操作的数据库。create database | 创建数据库drop database | 删除数据库grant | 授权 数据类型数字类型日期和时间类型字符串类型 数据表操作show colums | 显示数据表的属性属性类型主键信息 是否为 NULL默认值等其他信息。show index | 显示索引信息create table字段关键字PK | Primary KeyNN | Not NullUQ | UniqueAI | Auto Increment alter table | 修改表addmodifydrop drop table select | 查询insert into | 插入update | 修改dalete | 删除辅助语句where(条件)existsand ororder byaslikeunion 合并group by 聚合函数having 筛选limit 取顶inner join 连接except 取差集 fun | 函数fun : count(\*)fun : 时间 删库跑路truncatedelete trigger | 触发器delimiterindex | 索引create 创建索引indexunique 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 数据库名;
## 快捷方法
[roothost]# 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 someusersomehost;*.* 表示所有数据库的所有表mydb.* 表示 mydb 数据库的所有表mydb.mytable 表示 mydb 数据库的 mytable 表。
数据类型
大致分为数字/字符串/日期
数字类型
类型大小范围有符号范围无符号用途TINYINT1 Bytes(-128127)(0255)小整数值SMALLINT2 Bytes(-32 76832 767)(065 535)大整数值MEDIUMINT3 Bytes(-8 388 6088 388 607)(016 777 215)大整数值INT 或 INTEGER4 Bytes(-2 147 483 6482 147 483 647)(04 294 967 295)大整数值BIGINT8 Bytes(-9,223,372,036,854,775,8089 223 372 036 854 775 807)(018 446 744 073 709 551 615)极大整数值FLOAT4 Bytes(-3.402 823 466 E38-1.175 494 351 E-38)0(1.175 494 351 E-383.402 823 466 351 E38)0(1.175 494 351 E-383.402 823 466 E38)单精度 浮点数值DOUBLE8 Bytes(-1.797 693 134 862 315 7 E308-2.225 073 858 507 201 4 E-308)0(2.225 073 858 507 201 4 E-3081.797 693 134 862 315 7 E308)0(2.225 073 858 507 201 4 E-3081.797 693 134 862 315 7 E308)双精度 浮点数值DECIMAL对 DECIMAL(M,D) 如果 MD为 M2 否则为 D2依赖于 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 usersinsert into | 插入
插入数据
-- 向 users 表中插入新数据username 的值为 tony stark password 的值为 098123
-- 括号里的数据要对应
insert into users (username, password) values (tony stark, 098123)-- 从一个表搬到另一个表
-- 需要注意的是关系模式必须完全一样才能进行插入操作。
INSERT INTO History_Student
SELECT * FROM StudentsNodejs
// 向 users 表中新增一条数据其中 username 的值为 Spider-Manpassword 的值为 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 2dalete | 删除
删除数据
-- 删除 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 status1
select * from users where id 2
select * from users where username ls
select * from users where username ! lsexists
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 status0 and id3-- 使用 or 来显示所有状态为1 或 username 为 zs 的用户
select * from users where status1 or usernamezsorder 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 ascas
如果希望给查询出来的列名称设置别名可以使用 AS 关键字 s
-- 使用 AS 关键字给列起别名
select count(*) as total from users where status0
select username as uname, password as upwd from userslike
在 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 condition1union 合并
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 0fun : 时间
使用 YEAR() 函数从指定日期值中获取年份值使用 NOW() 函数获取当前日期和时间。将 NOW() 函数的结果作为 YEAR() 函数的参数即可从当前日期和时间中获取到年份值。使用 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表示要创建的触发器名。BEFORE和AFTER指定了触发器执行的时间前者在触发器事件之前执行后者在触发器事件之后执行。trigger_EVENT指定了触发器要响应的事件可以是INSERT、UPDATE或DELETE。TABLE_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 INDEX 和 CREATE 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 usernamehost identified by password;host可以省略 可以是 IP 地址或者主机名% 表示所有主机localhost 表示本地主机。
创建用户时需要当前用户具有创建用户的权限否则会报错。
用户修改
-- 修改用户信息
update 表名 set user新用户名 where user旧用户名 and host用户地址;用户删除
-- 删除用户
drop user usernamehost;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_policyLOW;-- 设置密码安全策略为0
set global validate_password_policy0;-- 还原密码安全策略
set global validate_password_policymedium;other
实践案例
首先我们需要使用 MySQL 创建一个存储过程来获取平均分以及至少有一项小于 60 分的学生名单。我们可以使用以下步骤来创建这个存储过程 | CSDN:
使用CREATE PROCEDURE语句创建存储过程并给它一个名称。在括号中定义过程参数如果需要的话。在BEGIN和END之间编写过程体这里需要使用SELECT语句来获取学生信息。使用DELIMITER语句来指定结束符这个结束符可以是两个特殊符号比如$$或//等。最后使用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:
使用CREATE PROCEDURE语句创建存储过程并给它一个名称。在括号中定义过程参数使用IN关键字来指定参数是输入参数。在过程体中使用定义的参数来进行计算或其他操作。使用DELIMITER语句来指定结束符这个结束符可以是两个特殊符号比如$$或//等。最后使用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