【详细版本】MySQL数据库部分语法,很容易就对应上

INSERT语句

语法
INSERT INTO <表名> [ <列名1> [ , … <列名n>] ] VALUES (值1) [… , (值n) ];

INSERT INTO <表名> SET <列名1> = <值1>,  <列名2> = <值2>, …

UPDATE 语句

语法
UPDATE <表名> SET 字段 1=值 1 [,字段 2=值 2… ] [WHERE 子句 ] [ORDER BY 子句] [LIMIT 子句]

UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值

DELETE

语法
DELETE FROM <表名> [WHERE 子句] [ORDER BY 子句] [LIMIT 子句]

清空表记录

语法
TRUNCATE [TABLE] 表名

TRUNCATE 和 DELETE 的区别

从逻辑上说,TRUNCATE 语句与 DELETE 语句作用相同,但是在某些情况下,两者在使用上有所区别。

  • DELETE 是 DML 类型的语句;TRUNCATE 是 DDL 类型的语句。它们都用来清空表中的数据。
  • DELETE 是逐行一条一条删除记录的;TRUNCATE 则是直接删除原来的表,再重新创建一个一模一样的新表,而不是逐行删除表中的数据,执行数据比 DELETE 快。因此需要删除表中全部的数据行时,尽量使用 TRUNCATE 语句, 可以缩短执行时间。
  • DELETE 删除数据后,配合事件回滚可以找回数据;TRUNCATE 不支持事务的回滚,数据删除后无法找回。
  • DELETE 删除数据后,系统不会重新设置自增字段的计数器;TRUNCATE 清空表记录后,系统会重新设置自增字段的计数器。
  • DELETE 的使用范围更广,因为它可以通过 WHERE 子句指定条件来删除部分数据;而 TRUNCATE 不支持 WHERE 子句,只能删除整体。
  • DELETE 会返回删除数据的行数,但是 TRUNCATE 只会返回 0,没有任何意义。
总结

当不需要该表时,用 DROP

当要删除部分记录时,用 DELETE

当仍要保留该表,但要删除所有记录时,用 TRUNCATE

过滤重复数据

语法
SELECT DISTINCT <字段名> FROM <表名>;

正则表达式查询

选项说明例子匹配值示例
^匹配文本的开始字符‘^b’ 匹配以字母 b 开头的字符串book、big、banana、bike
$匹配文本的结束字符‘st$’ 匹配以 st 结尾的字符串test、resist、persist
.匹配任何单个字符‘b.t’ 匹配任何 b 和 t 之间有一个字符bit、bat、but、bite
*匹配零个或多个在它前面的字符‘f*n’ 匹配字符 n 前面有任意个字符 ffn、fan、faan、abcn
+匹配前面的字符 1 次或多次‘ba+’ 匹配以 b 开头,后面至少紧跟一个 aba、bay、bare、battle
<字符串>匹配包含指定字符的文本‘fa’ 匹配包含‘fa’的文本fan、afa、faad
[字符集合]匹配字符集合中的任何一个字符‘[xz]’ 匹配 x 或者 zdizzy、zebra、x-ray、extra
[^]匹配不在括号中的任何字符‘[^abc]’ 匹配任何不包含 a、b 或 c 的字符串desk、fox、f8ke
字符串{n,}匹配前面的字符串至少 n 次‘b{2}’ 匹配 2 个或更多的 bbbb、bbbb、bbbbbbb
字符串 {n,m}匹配前面的字符串至少 n 次, 至多 m 次‘b{2,4}’ 匹配最少 2 个,最多 4 个 bbbb、bbbb
语法
属性名 REGEXP '匹配方式'
SELECT * FROM tb_students_info  WHERE 
name REGEXP '^J';

连接

内连接
SELECT <字段名> FROM <表1> INNER JOIN <表2> [ON子句]
SELECT s.name,c.course_name FROM tb_students_info s 
INNER JOIN    tb_course c  
ON            s.course_id = c.id;
左连接
SELECT  <字段名> FROM <表1> 
LEFT JOIN <表2> 
ON <表1> .column_name=<表2> .column_name
右连接
SELECT  <字段名> FROM <表1> 
RIGHT JOIN  <表2> 
ON <表1> .column_name= <表2> .column_name
全连接
SELECT  <字段名> FROM <表1> 
FULL JOIN <表2>  
ON <表1> .column_name= <表2> e2.column_name

主键

删除主键
语法: alter table 表名 drop PRIMARY KEY  主键约束名
 
举例: ALTER TABLE `hr` DROP PRIMARY KEY `PK_HR`
添加主键
语法: alter  表名 add  constraint  主键约束名 primary key(列名)

举例: alter table `hr` add constraint `PK_HR` primary key (hrno)

外键

删除外键
语法:alter table 表名 drop FOREIGN KEY 外键约束名称

举列:ALTER TABLE `hr` DROP FOREIGN KEY `fk_hr_deptno`
添加外键
语法:alter table 表名 add constraint 外键约束名 foreign key(列名) references 引用外键表(列名)

举列:ALTER TABLE `hr`ADD CONSTRAINT `fk_hr_deptno` freign key(deptno) references dept(deptno)

举列:在sc表的课号列建立外键约束fk_cno,参照course表的课号列的取值,要求实现级联更新。

alter table sc add constraint `fk_cno` fregin key(con) references course(cno) on upadte cascades;

视图

语法
CREATE VIEW <视图名> AS <SELECT语句>

完整性

在表创建完成后,定义实体完整性
alter table 表名 add constraint 主键名称 primary key (字段)

alter table 表1 add constraint 外键名称 FOREIGN KEY(字段) REFRENCES 表2(字段);

UNIQUE 约束

1.创建表的的时候指定
    create table stu(
        id int not null primary key,
        idCard varchar(18) not null unique, 
         ……
    )
2.创建表后单独添加
	alter table stu add constaint uq_name unique(name)

CHECK约束

添加
1.创建表的时候添加
	create table course(
    	cno int not null primary key,
        record int check(record between 1 and 100),
        ……
    )
2.创建表后单独添加
	alert table course add constraint che_recode check(record between 1 and 100);

删除
DROP CHECK che_recode

用户

创建用户
方法一:
CREATE USER <用户> [ IDENTIFIED BY [ PASSWORD ] '密码' ] [ ,用户 [ IDENTIFIED BY [ PASSWORD ] '密码' ]]
CREATE USER 'caiyuan'@'localhost' IDENTIFIED BY '123456';
方法二:
GRANT 权限 ON 新用户的权限范围 TO 用户名和主机名构成 [IDENTIFIED BY [PASSWORD] '密码']
GRANT SELECT ON*.* TO 'caiyuan'@'localhost' IDENTIFIED BY '123456';
“*.*” 表示所有数据库下的所有表
删除用户
DROP USER <用户1> [ , <用户2> ]…
DROP USER 'caiyuan'@'localhost';

授权

用户授权
GRANT 权限类型 [(column_list)] ON 权限的级别
TO 用户名和主机名构成 [IDENTIFIED BY [PASSWORD] 'password'][, user[IDENTIFIED BY [PASSWORD] '密码']] ...
[WITH GRANT OPTION]
WITH GRANT OPTION:被授权的用户可以将这些权限赋予给别的用户

GRANT SELECT,INSERT ON *.*
TO 'caiyuan'@'localhost' IDENTIFIED BY '123456'
WITH GRANT OPTION;
删除授权
REVOKE 权限的类型 [(column_list)]...
ON 权限的级别
FROM 用户名和主机名构成 [, user]...

REVOKE INSERT ON *.* FROM 'caiyuan'@'localhost';

角色

创建角色
-- 角色名和帐户名相同,也是名字+host,如果没有写host,默认为'%'
CREATE ROLE '角色1', '角色2', '角色3';   --创建了3个角色

CREATE ROLE 'admin'@'localhost', 'manager'@'localhost', 'personnel'@'localhost'; 
删除角色
DROP USER  'manager'@'localhost';
授权角色
GRANT <权限>[,<权限>]... ON <对象类型>对象名 TO <角色>[,<角色>]...

GRANT ALL ON yhr.* TO 'admin'@'localhost';  		-- 给yhr数据库中所有表的所有权限
GRANT SELECT ON yhr.* TO 'personnel'@'localhost';   -- yhr数据库中所有表的查询权限
GRANT INSERT, UPDATE, DELETE ON yhr.* TO 'manager'@'localhost';   --yhr数据库中所有表的修改权限
收回角色权限
REVOKE <权限>[,<权限>]... ON <对象类型>对象名 FROM <角色>[,<角色>]...

REVOKE INSERT, UPDATE, DELETE ON app_db.* FROM  'manager'@'localhost';

存储过程

创建存储过程

在 MySQL 中,服务器处理 SQL 语句默认是以分号作为语句结束标志的。然而,在创建存储过程时,存储过程体可能包含有多条 SQL 语句,这些 SQL 语句如果仍以分号作为语句结束符,那么 MySQL 服务器在处理时会以遇到的第一条 SQL 语句结尾处的分号作为整个程序的结束符,而不再去处理存储过程体中后面的 SQL 语句,这样显然不行。

通常使用 DELIMITER命令将结束命令修改为其他字符。语法格式如下:

DELIMITER $$

语法说明如下:

  • $$ 是用户定义的结束符,通常这个符号可以是一些特殊的符号,如两个“?”或两个“¥”等。
  • 当使用 DELIMITER 命令时,应该避免使用反斜杠“\”字符,因为它是 MySQL 的转义字符。

在 MySQL 命令行客户端输入如下 SQL 语句。

mysql > DELIMITER ??

成功执行这条 SQL 语句后,任何命令、语句或程序的结束标志就换为两个问号“??”了。

若希望换回默认的分号“;”作为结束标志,则在 MySQL 命令行客户端输入下列语句即可:

mysql > DELIMITER ;

注意:DELIMITER 和分号“;”之间一定要有一个空格。在创建存储过程时,必须具有 CREATE ROUTINE 权限。

ok,进入正题

举例子

这样理解得快,可能有点乱,但是思路还是蛮清晰的,希望你能对应的上

  • 创建名称为 ShowHr 的存储过程,存储过程的作查询所有用户,输入的 mysql 语句和执行过程如下所示。
DELIMITER $$
CREATE PROCEDURE ShowHr()
BEGIN
SELECT * FROM hr;
END $$

结果显示 ShowHr存储过程已经创建成功。

  • MySQL 中使用 DROP PROCEDURE 语句来删除数据库中已经存在的存储过程。语法格式如下:
DROP PROCEDURE [ IF EXISTS ] <过程名>

DROP PROCEDURE IF EXISTS  ShowHr
  • 创建名称为 GetHrNameByRole的存储过程,输入参数是角色名称。存储过程的作用是通过输入的角色名称从用户表查询出对应的用户,输入的 SQL 语句和执行过程如下所示。
DELIMITER $$
CREATE PROCEDURE GetHrNameByRole(IN name VARCHAR(64))
 BEGIN
		SELECT hr.`name` FROM hr,hr_role,role
		WHERE role.`name`=name AND role.id = hr_role.rid AND hr.id = hr_role.hrid;
 END $$
  • 使用stu_course数据库中的student表、sc表。
    • 创建存储过程stu_name,当任意输入一个学生的姓名时,查看其所选课程的最高分、最低分、平均分。
    • 调用存储过程stu_name。
    • 删除存储过程stu_name。
delimiter $$
create procedure stu_name(in cin_name varchar(64))
begin
	select student.sname, max(grade),min(grade),avg(grade) from student,sc
	where student.sname=cin_name and sc.sno = student.sno;
end $$
delimiter ; 
调用
call stu_name("小源同学");
删除
drop stu_name;

函数

函数和储存过程几乎一样

创建
    CREATE [AGGREGATE] FUNCTION function_name(parameter_name type,[parameter_name type,...])

    RETURNS {STRING|INTEGER|REAL}

    runtime_body
    
简单说就是:
    CREATE FUNCTION 函数名称(参数列表)

    RETURNS 返回值类型

    函数体
举例
  • 定义一个函数,输出hello。(提示:使用select显示输出)
create function say_hello() RETURNS VARCHAR(64);
RETURN "hello"; 

select say_hello(); 

drop FUNCTION say_hello;
  • 定义一个函数,使用While语句求1到100之间的累加和,并输出结果。(提示:使用select显示输出)
方法一:
while循环语法:
   while 条件 DO
               循环体;
   end while;
-------------------------------------------
DELIMITER $$
CREATE FUNCTION add_num () RETURNS INTEGER BEGIN
	DECLARE
		i INT DEFAULT 1;
	DECLARE
		count INT DEFAULT 0;
	WHILE
			i <= 100 DO
			
			SET count = count + i;
		
		  SET i = i + 1;
		
	END WHILE;-- 循环结束 
	return count;
END $$ 
DELIMITER ; 
 
 -- 执行存储过程[call的话执行函数会出错,一般都是执行`储存过程`,select没有出错]
select add_num();
 -- 删除存储过程
drop procedure if exists add_num; 
方法二: 
loop 循环语法:
  loop_name:loop
          if 条件 THEN -- 满足条件时离开循环
               leave loop_name;  -- 和 break 差不多都是结束训话
       end if;
  end loop; 
------------------------------------------- 
DELIMITER $$
create FUNCTION add_nums() RETURNS INTEGER BEGIN DECLARE i INT DEFAULT 1; DECLARE count INT DEFAULT 0; 

	loop_name : LOOP 
				IF i > 100 THEN
					LEAVE loop_name;-- 判断条件成立则结束循环  好比java中的 boeak
				END IF;
			
				SET count = count + i;
		
				SET i = i + 1;
			
			END LOOP;
			
	RETURN count;-- 函数写return,储存过程写select count
	
END $$
DELIMITER ;

select add_nums();

drop procedure if exists add_nums; 

结果示例:

image-20211205111948500

image-20211205112832045

调用
call/select function_name(parameter_value,...)
修改
alter function 重命名一个函数
alter function 过程名1 rename to 过程名2;

alter function 重新编译一个函数
alter function 函数名 compile;
删除
DROP FUNCTION function_name

触发器

MySQL 所支持的触发器有三种:INSERT 触发器、UPDATE 触发器和 DELETE 触发器。

  • INSERT 触发器

    • 在 INSERT 语句执行之前或之后响应的触发器。

    • 使用 INSERT 触发器需要注意以下几点:
      	在 INSERT 触发器代码内,可引用一个名为 NEW(不区分大小写)的虚拟表来访问被插入的行。
      	在 BEFORE INSERT 触发器中,NEW 中的值也可以被更新,即允许更改被插入的值(只要具有对应的操作权限)。
      	对于 AUTO_INCREMENT 列,NEW 在 INSERT 执行之前包含的值是 0,在 INSERT 执行之后将包含新的自动生成值。
      
  • UPDATE 触发器

    • 在 UPDATE 语句执行之前或之后响应的触发器。注意:当触发器设计对触发表自身的更新操作时,只能使用 BEFORE 类型的触发器,AFTER 类型的触发器将不被允许。

    • 使用 UPDATE 触发器需要注意以下几点:
      	在 UPDATE 触发器代码内,可引用一个名为 NEW(不区分大小写)的虚拟表来访问更新的值。
      	在 UPDATE 触发器代码内,可引用一个名为 OLD(不区分大小写)的虚拟表来访问 UPDATE 语句执行前的值。
      	在 BEFORE UPDATE 触发器中,NEW 中的值可能也被更新,即允许更改将要用于 UPDATE 语句中的值(只要具有对应的操作权限)。
      	OLD 中的值全部是只读的,不能被更新。
      
  • DELETE 触发器

    • 在 DELETE 语句执行之前或之后响应的触发器。

    • 使用 DELETE 触发器需要注意以下几点:
      	在 DELETE 触发器代码内,可以引用一个名为 OLD(不区分大小写)的虚拟表来访问被删除的行。
      	OLD 中的值全部是只读的,不能被更新。
      
查询已经有的触发器
SHOW TRIGGERS 
创建触发器
CREATE <触发器名> < BEFORE | AFTER >
<INSERT | UPDATE | DELETE > ON <表名> 
FOR EACH ROW
<触发器主体>

举例:在course表上创建触发器del_trig,当course表上删除一门课程时,级联删除sc表该课程的记录。
删除course表的一条记录,查看sc表相应记录是否被自动删除。
Create trigger del_trig after 
delete on course 
for each row 
delete from sc where kehao=select kehao from deleted;
  • 创建一个触发器,触发的条件是向数据表 salary中插入数据之前,对新插入的 allSalary字段值进行求和计算【总发出的工资】。输入的 SQL 语句和执行过程如下所示。
 
 CREATE TRIGGER trig_hr1 AFTER INSERT ON hr 
 FOR EACH ROW
 INSERT INTO log VALUES ( NOW());
创建只有一个执行语句的触发器
 --在向用户表INSERT数据时,用户数增加,DELETE用户时,用户数减少
CREATE TRIGGER trigger_hr_count_insert AFTER INSERT ON hr 
FOR EACH ROW
UPDATE hr_count SET hr_count=hr_count+1; 

CREATE TRIGGER trigger_hr_count_delete AFTER DELETE ON hr 
FOR EACH ROW 
UPDATE hr_count SET hr_count=hr_count-1;

CREATE TABLE hr_count (
  hr_count INT(11) DEFAULT 0
);
INSERT INTO hr_count VALUES(0);
SELECT * FROM hr_count;

insert.....
delete.....
SELECT * FROM hr_count;
创建有多个执行语句的触发器
--定义一个触发器,在DELETE时首先减少用户总人数,然后判断删除的用户是哪个部门的,再减少对应部门的用户总数:
DELIMITER $$
CREATE TRIGGER trigger_hr_count_delete AFTER DELETE ON hr 
FOR EACH ROW
BEGIN
	UPDATE hr_count SET hr_count=hr_count-1 WHERE hr_dept=0;
	UPDATE hr_count SET hr_count=hr_count-1 WHERE hr_dept= OLD.hr_dept;
END $$
DELIMITER ;
删除触发器
DROP TRIGGER IF EXISTS  [trigger_name]

断言

断言创建
CREATE ASSERTION <断言名> <CHECK 字句>
举例子
-- 限制数据库课程最多60名学生选修
CREATE ASSERTION ASSE_SC_DB_NUM 
CHECK(
    60>=(SELECT COUNT(*) FROM coourse,sc 
         where sc.cno = course.cno
         and course.name = '数据库') 
)

数据库的备份

打开命令行(cmd)窗口,输入备份命令和密码,运行过程如下:

因为早期版本的MySQL数据库的information_schema数据库中没有名为COLUMN_STATISTICS的数据表。新版的mysqldump默认启用了一个新标志,通过--column-statistics=0来禁用他。

mysqldump --column-statistics=0 -h127.0.0.1 -uroot -p --databases yhr > e:\yhrs.sql

数据库恢复

 mysqldump --column-statistics=0 -h127.0.0.1 -uroot -p --databases yhr < e:\yhrs.sql

ok,对应上了吗?点个关注♥,点个赞👍吧!!!

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
交互式SQL的使用 环境:WINDOWS,Microsoft SQL Server 实验要求: 1,创建Student数据库,包括Students,Courses,SC表,表结构如下: Students(SNO,SNAME,SEX,BDATE,HEIGHT,DEPARTMENT) Courses(CNO,CNAME,LHOUR,CREDIT,SEMESTER) SC(SNO,CNO,GRADE) (注:下划线表示主键,斜体表示外键),并插入一定数据。 2.完成如下的查询要求及更新的要求。 (1)查询身高大于1.80m的男生的学号和姓名; (2)查询计算机系秋季所开课程的课程号和学分数; (3)查询选修计算机系秋季所开课程的男生的姓名、课程号、学分数、成绩; (4)查询至少选修一门电机系课程的女生的姓名(假设电机系课程的课程号以EE开头); (5)查询每位学生已选修课程的门数和总平均成绩; (6)查询每门课程选课的学生人数,最高成绩,最低成绩和平均成绩; (7)查询所有课程的成绩都在80分以上的学生的姓名、学号、且按学号升序排列; (8)查询缺成绩的学生的姓名,缺成绩的课程号及其学分数; (9)查询有一门以上(含一门)三个学分以上课程的成绩低于70分的学生的姓名; (10)查询1984年~1986年出生的学生的姓名,总平均成绩及已修学分数。 (11) 在STUDENT和SC关系中,删去SNO以’01’开关的所有记录。 (12)在STUDENT关系中增加以下记录: (13)将课程CS-221的学分数增为3,讲课时数增为60 3.补充题: (1) 统计各系的男生和女生的人数。 (2) 列出学习过‘编译原理’,‘数据库’或‘体系结构’课程,且这些课程的成绩之一在90分以上的学生的名字。 (3) 列出未修选‘电子技术’课程,但选修了‘数字电路’或‘数字逻辑’课程的学生数。 (4) 按课程排序列出所有学生的成绩,尚无学生选修的课程,也需要列出,相关的学生成绩用NULL表示。 (5) 列出平均成绩最高的学生名字和成绩。(SELECT句中不得使用TOP n子句) 4.选做题:对每门课增加“先修课程”的属性,用来表示某一门课程的先修课程,每门课程应可记录多于一门的先修课程。要求: 1) 修改表结构的定义,应尽量避免数据冗余,建立必要的主键,外键。 2) 设计并插入必要的测试数据,完成以下查询: 列出有资格选修数据库课程的所有学生。(该学生已经选修过数据库课程的所有先修课,并达到合格成绩。) 注意:须设计每个查询的测试数据,并在查询之前用INSERT语句插入表中。 提交作业形式: 1) 建立Student数据库的SQL脚本,插入所有数据项的SQL脚本(包括所有的测试数据)。 2) 完成查询要求的SQL语句脚本。 3) 选做题:须提交修改数据库表定义的SQL脚本,插入测试数据的SQL脚本以及用于查询的SQL语句。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小源同学r

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值