SQL分类
- DDL (数据定义语言),这些语句定义了不同的数据库、表、视图、索引等数据库对象,还可以用来创建、删除、修改数据库和数据表的结构。
- DML (数据操作语言),用于添加、删除、更新和查询数据库记录,并检查数据完整性。
- DCL (数据控制语言),用于定义数据库、表、字段、用户的访问权限和安全级别。
DDL:数据定义语言。CREATE \ ALTER \ DROP \ RENAME \ TRUNCATE DML:数据操作语言。INSERT \ DELETE \ UPDATE \ SELECT (重中之重) DCL:数据控制语言。COMMIT \ ROLLBACK \ SAVEPOINT \ GRANT \ REVOKE
数据库的操作
-- 【建库】创建名为test的数据库,默认字符集设置为utf8,排序规则设置为utf8_general_ci。
-- 加入IF NOT EXISTS后,如果同名的数据库存在也不会报错,语句就不会执行。
CREATE DATABASE IF NOT EXISTS test CHARACTER SET utf8 COLLATE utf8_general_ci;
-- 【删库】删除数据库test
-- 加if exists后,数据库不存在也不会报错
DROP DATABASE IF EXISTS test;
-- 【修改数据库】修改数据库test的字符集设置为uft8,排序规则设置为utf8_bin。
ALTER DATABASE test CHARACTER SET utf8 COLLATE utf8_bin;
-- 【查库】查询数据库的相关信息
-- 显示创建的数据库有哪些
SHOW DATABASES;
-- 【使用指定数据库】
USE test;
-- 显示数据库中的表
SHOW TABLES;
-- 显示建库语句
SHOW CREATE DATABASE test;
-- 显示建表语句
SHOW CREATE TABLE ttt;
表的操作
建表
建表的基本语法:
create table <表名> ( <字段1> <数据类型1> [<列级完整性约束条件>], <字段2> <数据类型2> [<列级完整性约束条件>], […..], [<表级完整性约束条件1>], [<表级完整性约束条件2>], [……] );
注:[ ]中的内容可以省略。
- 列级完整性约束条件:对单一列的值进行约束
- PRIMARY KEY:指定该字段为主键(实体完整性约束)
- NULL/NOT NULL:指定的字段允许为空/不允许为空,如果没有约束条件,则默认为NULL。
- UNIQUE:指定字段取值唯一,即每条记录的指定字段的值不能重复。
- DEFAULT<默认值>:指定设置字段的默认值。
- CHECK(条件表达式)(用户自定义完整性约束):用于对输入值进行检验拒绝接受不满足条件的值。
- AUTO_INCREMENT:指定设置字段值自动增加。
- 表级完整性约束条件:对多列值进行约束
- PRIMARY KEY用于定义表级主键约束(维护实体完整性约束),语法格式如:
- CONSTRAINT<约束名>PRIMARY KEY CLUSTERED
- FOREIGN KEY用于设置参照完整性规则,即指定某字段为外键,语法格式如下:
- CONSTRAINT<约束名>FOREIGN KEY<外键>REFERENCES<被参照表(主键)>
- UNIQUE既可用于列级完整性约束,也可用于表级完整性约束,语法格式如下:
- CONSTRAINT <约束名>UNIQUE(<字段名>)
``sql -- 【建表】 -- COMMENT 用于添加注释内容 CREATE TABLE IF NOT EXISTS
teacher(
t_idint(15) PRIMARY KEY NOT NULL AUTO_INCREMENT COMMENT '班主任id',
namechar(20) NOT NULL COMMENT '姓名',
phonechar(11) UNIQUE NOT NULL COMMENT '电话号',
ageint(3) NULL COMMENT '年龄',
sexchar(4) NULL COMMENT '性别', CONSTRAINT
sexCHECK(
sex= "男" or
sex` = “女”) )ENGINE = InnoDB CHARACTER SET = utf8;
- CONSTRAINT <约束名>UNIQUE(<字段名>)
- PRIMARY KEY用于定义表级主键约束(维护实体完整性约束),语法格式如:
CREATE TABLE IF NOT EXISTS student
(
u_id
int(15) PRIMARY KEY NOT NULL AUTO_INCREMENT COMMENT ‘学号’,
name
char(20) NOT NULL COMMENT ‘姓名’,
age
int(3) NULL COMMENT ‘年龄’,
sex
char(4) NULL COMMENT ‘性别’,
t_id
int(15) NULL COMMENT ‘班主任id’,
CONSTRAINT sex
CHECK(sex
= “男” or sex
= “女”),
CONSTRAINT FOREIGN KEY (t_id
) REFERENCES teacher
( t_id
)
)ENGINE = InnoDB CHARACTER SET = utf8;
<a name="BSDCs"></a>
## 修改表结构
- 修改表名:ALTER TABLE 旧表名 RENAME 新表名;
- 修改字段名:ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型;
- 修改字段类型:ALTER TABLE 表名 MODIFY 字段名 新数据类型;
- 添加字段:ALTER TABLE 表名 ADD 字段名 新字段类型 [约束条件];
- 删除字段:ALTER TABLE 表名 DROP 字段名;
- 修改表的存储引擎:ALTER TABLE 表名 ENGINE = 存储引擎名;
```sql
-- 修改表名
-- 前者是原本的表名,后者是新表名
ALTER TABLE `new_teacher` RENAME `xin_teacher`;
-- 修改字段名
ALTER TABLE `xin_teacher` CHANGE `phone` `number` char(12);
-- 修改一个字段的类型
ALTER TABLE `xin_teacher` MODIFY `number` int(11);
-- 添加一个字段
-- 默认添加到最后一个字段的位置
ALTER TABLE `xin_teacher` ADD `qq` int(15);
-- 删除字段
ALTER TABLE `xin_teacher` DROP `qq`;
-- 修改表的存储引擎
ALTER TABLE `xin_teacher` ENGINE = InnoDB;
删表
-- 删除表(表存在时执行)
DROP TABLE IF EXISTS student;
查看表
-- 查看表结构
DESC `student`;
-- 查看建表语句
SHOW CREATE TABLE student;
复制表
-- 复制表的数据和结构到新表
-- as可以省略
CREATE TABLE `new_teacher`
AS
SELECT * FROM `teacher`;
-- 仅复制表的结构到新表
-- as可以省略
CREATE TABLE `new_teacher`
AS
SELECT * FROM `teacher`;
WHERE FALSE;
-- 仅复制表的结构到新表
CREATE TABLE `new_teacher` LIKE `teacher`;
表中数据相关
添加数据
# 添加数据
-- 按照声明的顺序添加数据
INSERT INTO `student`
VALUES
(1, 'WTY2002', 20, '男', 1),
(2, 'WTY', 20, '男', 1);
-- 按自定义的顺序添加数据
-- 没有进行赋值的age和t_id的值为 null
INSERT INTO `student`(`u_id`, `name`, `sex`)
VALUES
(3, 'WTY', '男'),
(4, 'hello', '女');
-- 将其它表中查询的结构添加到该表中
-- 注意:查询的字段一定要与添加到的表的字段一一对应
INSERT INTO `student`(`u_id`, `name`, `sex`)
#查询语句
SELECT `u_id`, `name`, `sex`
FROM `person`
WHERE `age` IN (19, 21);
修改数据
# 修改数据
-- 修改指定字段
UPDATE `student`
SET `name` = 'hi'
WHERE `u_id` = 4;
-- 同时修改多个字段
UPDATE `student`
SET `sex` = '女'
WHERE `name` = 'WTY';
-- 带条件是指根据指定条件修改,不带条件则修改整个表。
删除数据
# 删除数据
-- 指定删除条件
DELETE FROM `student` where `u_id` = 4;
-- 不指定删除条件为删除所有数据
DELETE FROM `student`;
-- 删除所有数据
TRUNCATE `student`;
查询(大大的重点!!!)
一般格式:
select 字段名,… from 表名 where 筛选条件;
要多练习,这里我就不一一列举了😜
# 查询数据
SELECT * FROM `student`;
视图
创建视图
# 创建视图
-- 视图中的字段与基表中的字段对应
CREATE VIEW `student_view1`
AS
SELECT `u_id`, `name` FROM `student`;
-- 查询语句中字段的别名会作为视图中字段的名称出现
CREATE VIEW `student_view2`
AS
SELECT `u_id` `id`, `name` `my_name` FROM `student`;
-- 给定视图的字段来创建视图
-- 小括号内字段个数与SELECT中字段个数相同
CREATE VIEW `student_view3`(`id`, `name`)
AS
SELECT `u_id`, `name`
FROM `student`
WHERE `age` >= 20;
查看视图
# 查看视图
-- 查看数据库的表对象、视图对象
SHOW TABLES;
-- 查看视图的结构
DESCRIBE `student_view3`;
-- 查看视图的详细定义信息
SHOW CREATE VIEW `student_view3`;
删除视图
# 删除视图
DROP VIEW `student_view3`;
DROP VIEW IF EXISTS `student_view3`;
更新视图
操作和表的一样,当视图中的数据发生变化时,数据表中的数据也会发生变化,反之亦然。
在某些情况下,视图不支持更新。
-- 更新视图
UPDATE `student_view1`
SET `name` = 'WTY2002'
WHERE `u_id` = 3;
索引
- 创建索引的一般格式:CREATE INDEX 索引名 ON 表名(列名1, 列名2……);
- 删除索引的一般格式:DROP INDEX 索引名 ON 表名;
- 查看索引的一般格式:SHOW INDEX FROM 表名;
``sql -- 【创建索引】 CREATE INDEX
indexNameON
student(
u_id,
name`);
— 【删除索引】
DROP INDEX indexName
ON student
;
— 【查看索引】
SHOW INDEX FROM student
;
<a name="TzPal"></a>
# 存储过程
一般语法:in可以省略,默认为输入参数
> CREATE PROCEDURE 存储过程名(IN|OUT|INOUT 参数名 参数类型,...)
> [characteristics ...]
> BEGIN
> 存储过程体
> END
```sql
-- 创建存储过程,无参数的。
CREATE PROCEDURE add_age()
BEGIN
UPDATE `student` SET `age` = `age` + 1;
END;
-- 调用存储过程
CALL add_age();
-- 查看存储过程
SHOW PROCEDURE STATUS LIKE 'add_age';
SHOW CREATE PROCEDURE `add_age`;
-- 删除存储过程
DROP PROCEDURE `add_age`;
自定义函数
一般语法:
CREATE FUNCTION 函数名(参数名 参数类型,…) RETURNS 返回值类型 [characteristics …] BEGIN 函数体 #函数体中肯定有 RETURN 语句
END
#创建函数前执行此语句,保证函数的创建会成功
SET GLOBAL log_bin_trust_function_creators = 1;
-- 创建自定义函数
CREATE FUNCTION find_per(id int)
RETURNS char(20)
BEGIN
RETURN (SELECT `name` FROM `student` where `id` = `u_id`);
END;
-- 调用函数
SELECT find_per(3);
触发器
一般语法:
CREATE TRIGGER 触发器名称 {BEFORE|AFTER} {INSERT|UPDATE|DELETE} ON 表名 FOR EACH ROW 触发器执行的语句块;
-- 创建触发器
CREATE TRIGGER add_age
AFTER INSERT ON `student`
FOR EACH ROW
BEGIN
UPDATE `teacher` SET `name` = 'ttt' WHERE new.t_id = t_id;
END;
-- 查看触发器
-- 看当前数据库的所有触发器的定义
SHOW TRIGGERS;
-- 查看某个触发器的定义
SHOW CREATE TRIGGER add_age;
-- 删除触发器
DROP TRIGGER IF EXISTS add_age;
数据库管理
创建用户:
create user ‘用户名’@’允许登录的主机地址’ identified by 密码;
#创建指定ip为 192.168.1.1 的lyn用户登录
create user 'lyn'@'192.168.1.1' identified by '123';
#创建指定ip为 192.168.1 开头的lyn用户登录
create user 'lyn'@'192.168.1.%' identified by '123';
#创建指定任何ip的lyn用户登录
create user 'lyn'@'%' identified by '123';
删除用户:
drop user ‘用户名’@’允许登录的主机地址’;
修改用户名:
rename user ‘用户名’@’IP地址’ to ‘新用户名’@’IP地址’;
修改密码:
set password for ‘用户名’@’IP地址’ = Password(‘新密码’);
查看用户权限:
show grants for ‘用户’@’IP地址’
授权:
grant 权限列表 on 库.表 to 用户名@’ip’ identified by “密码”;
.表示所有库的所有表
grant insert, update, select on *.* to 'casual_user'@'localhost' identified by "123456";
撤销权限:
revoke 权限列表 on 库.表 from 用户名@’ip’;
revoke all on mydb1.table1 from 'user1'@'localhost';
revoke insert, select, update, delete, create, alter
on mydb2.* from 'user2'@'localhost';
数据库备份与恢复:
mysqldump -uroot -p123123 -h127.0.0.1 db1 --tables emp dept> /home/db1/backup/emp-dept.sql;
use db1;
source /home/db1/backup/sala.sql;
最后教你个操作:
DROP DATABASE test;
删库跑路🤣