MySQL
目录
MySql 一般信息
观前提示
文章中的代码块,若需要展示 sql 语句输出结果,会选择用 bash 高亮,否则使用 sql 高亮。
登录 MySQL
mysql -h 主机名 -u 用户名 -p
## -h : 指定客户端所要登录的 MySQL 主机名, 登录本机(localhost 或 127.0.0.1)该参数可以省略;
## -u : 登录的用户名;
## -p : 告诉服务器将会使用一个密码来登录, 如果所要登录的用户名密码为空, 可以忽略此选项。
## 如果我们要登录本机的 MySQL 数据库,只需要输入以下命令即可:
mysql -u root -p
mysql>
## 使用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 表。
数据类型
大致分为数字/字符串/日期
数字类型
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
TINYINT | 1 Bytes | (-128,127) | (0,255) | 小整数值 |
SMALLINT | 2 Bytes | (-32 768,32 767) | (0,65 535) | 大整数值 |
MEDIUMINT | 3 Bytes | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 |
INT 或 INTEGER | 4 Bytes | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 |
BIGINT | 8 Bytes | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 |
FLOAT | 4 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) | 单精度 浮点数值 |
DOUBLE | 8 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) | 范围 | 格式 | 用途 |
---|---|---|---|---|
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | '-838:59:59'/'838:59:59' | HH:MM:SS | 时间值或持续时间 |
YEAR | 1 | 1901/2155 | YYYY | 年份值 |
DATETIME | 8 | '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59' | YYYY-MM-DD hh:mm:ss | 混合日期和时间值 |
TIMESTAMP | 4 | '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:07 | YYYY-MM-DD hh:mm:ss | 混合日期和时间值,时间戳 |
字符串类型
类型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255 bytes | 定长字符串 |
VARCHAR | 0-65535 bytes | 变长字符串 |
TINYBLOB | 0-255 bytes | 不超过 255 个字符的二进制字符串 |
TINYTEXT | 0-255 bytes | 短文本字符串 |
BLOB | 0-65 535 bytes | 二进制形式的长文本数据 |
TEXT | 0-65 535 bytes | 长文本数据 |
MEDIUMBLOB | 0-16 777 215 bytes | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0-16 777 215 bytes | 中等长度文本数据 |
LONGBLOB | 0-4 294 967 295 bytes | 二进制形式的极大文本数据 |
LONGTEXT | 0-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 sc
where sno = '201215121'
);
limit 取顶
LIMIT
是用于限制查询结果返回的行数的关键字。它可以用于在查询中返回指定数量的行数,从而控制查询结果的大小。例如,可以使用 LIMIT
语句来返回前 10 行或下 5 行数据
mysql> select sno,count(cno) as cnonum
from sc
group by sno
order by cnonum desc
limit 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 : 时间
- 使用 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_name
BEFORE|AFTER trigger_EVENT ON TABLE_NAME
FOR EACH ROW
trigger_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
select
stuName
from
stuinfo
where
stuNo in(
select
stuNo
from
stumarks
where
writtenExam + labExam < 120
and (
writtenExam < 60
or labExam < 60
)
);
end $ $ --
delimiter;
-- 2、定义笔试及格线和机试及格线这两个参数,使笔试和
-- 机试的及格线可以通过参数值调整。
DELIMITER $ $ --
create procedure get_avg_course_plus(in written_pass_line int, in lab_pass_line int) begin
select
stuName
from
stuinfo
where
stuNo in(
select
stuNo
from
stumarks
where
writtenExam > written_pass_line
and 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:
- 使用
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)
BEGIN
DECLARE 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 数据库名 > 导出的文件名