MySQL基础SQL复习

190 阅读5分钟

这是我参与2022首次更文挑战的第15天,活动详情查看:2022首次更文挑战

基本的查询:SELECT

(where和group by有先后之分):

SELECT [ALL | DISTINCT] 查询列表
FROM 表1
[INNER | NATURAL | LEFT | RIGHT ] JOIN 表2  ON 连接条件
WHERE 筛选条件
GROUP BY 分组字段
HAVING 分组后的筛选
ORDER BY 排序的字段 [DESC | ASC]
LIMIT offset,size;    #  要显示条目的起始索引,从0开始和条目个数。
  • 容易忘记的关键字: DISTINCT(去重)

  • LIMIT从0开始计数,比如查询第11个到第25个员工信息(分页查询)

SELECT * FROM employees LIMIT 10,15;

表格的创建:CREATE

CREATE TABLE sc
(
	Sno CHAR(9),
    Cno CHAR(4),
    Grade SMALLINT NOT NULL, 
    PRIMARY KEY(Sno,Cno), # 要是主键为单个属性就可以放在那个字段声明的后面
    FOREIGN KEY(Sno) REFERENCES Student(Sno),
    FOREIGN KEY(Cno) REFERENCES Course(Cno),    
)

要求学生分数在0 - 100 分 之间 咋整? (CONSTRAINT)

Grade SMALLINT  CONSTRAINT conditionName CHECK(Grade BETWEEN 0 AND 100),

表数据增加:INSERT

# 常规操作
INSERT INTO avg_sal   #如果不指定表的字段,那么默认插入整个表 
VALUES (1,200);       #直接赋值
# 嵌套子查询
INSERT INTO avg_sal(deptno,avg_dept_sal)  # 指定表的字段属性
	SELECT deptno ,AVG(sal)            # 查询一个表,然后赋给avg_sal
	FROM emp_2019152042
	GROUP BY DEPTNO

表数据更新:UPDATE

  UPDATE <表名>
  SET <列名>=<表达式>[,<列名>=<表达式>]…
  [WHERE <条件>];

表数据删除:DELETE

# 删除记录
DELETE FROM tableName WHERE ..
# 删整个表
DELETE FROM tableName
#将表中数据全部删除,在功能上和不带where子句的delete语句相同,重置计数的种子
truncate table tableName;
#删除表的结构,以及被依赖的约束(constrain),触发器(trigger),索引(index);
drop table tableName;

delete,drop,truncate 都有删除表的作用,区别在于:

  • 1、delete 和 truncate 仅仅删除表数据,drop 连表数据和表结构一起删除,打个比方,delete 是单杀,truncate 是团灭,drop 是把电脑摔了。
  • 2、delete 是 DML 语句,操作完以后如果没有不想提交事务还可以回滚,truncate 和 drop 是 DDL 语句,操作完马上生效,不能回滚,打个比方,delete 是发微信说分手,后悔还可以撤回,truncate 和 drop 是直接扇耳光说滚,不能反悔。
  • 3、执行的速度上,drop>truncate>delete,打个比方,drop 是神舟火箭,truncate 是和谐号动车,delete 是自行车。

表结构修改:ALTER

# 常用的语法格式如下:
ALTER TABLE <表名> [修改选项]

# 修改选项的语法格式如下:
{ ADD COLUMN <列名> <类型>
| CHANGE COLUMN <旧列名> <新列名> <新列类型>
| ALTER COLUMN <列名> { SET DEFAULT <默认值> | DROP DEFAULT }
| MODIFY COLUMN <列名> <类型>
| DROP COLUMN <列名>
| RENAME TO <新表名> }

字符匹配:LIKE

% 代表 匹配任意字符 _ 代表匹配单个字符

如果需要匹配 特殊的字符,比如 DB_123 那么需要指定转义字符 ESCAPE '/'

WHERE name LIKE 'DB/_123'

聚合函数

COUNT MAX MIN SUM AVG ...

需要知道包不包括空值,参考:blog.csdn.net/qq_40456829…

image.png

image.png

函数

sql函数主要可以分为三个部分,数学函数,字符函数以及日期函数。每种函数都有许多mysql自带的函数,可以用在SELECT语句转化数据。

举个例子:

数学函数:round(x,d) 四舍五入 x,其中保留 d位小数...

字符函数:CONCAT(str1,str2) ...

日期函数:

DATE_FORMAT('2022-01-12 19:44:55','%Y年%m月%d日%H时%i分%s秒');

授权 :GRANT REVOKE

GRANT <权限>
ON <对象类型><对象名>[,...]
TO <用户>,
[WITH GRANT OPTION]

例子:把 查询学生表 和 修改学生学号 的权限授予给用户U2,允许该权限再次传播。

GRANT SELECT,UPDATE(Sno)
ON TABLE Student
TO U2
WITH GRANT OPTION;

触发器 :TRIGGER

触发器是用户定义在关系表上的一类由事件驱动的特殊过程。

书上的语法,不知道为什么,总感觉已经废弃了。。。

CREATE TRIGGER <触发器名>
{BEFORE | AFTER} <触发事件> ON <表名>
REFERENCING NEW|OLD ROW AS <变量> # 这个第三行真的有吗
FOR EACH {ROW | STATEMENT} 
[WHEN <触发条件>] <触发动作体>

版本二:还是这个简单一点(虽然好像少了点东西)。

CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件
ON 表名 FOR EACH ROW
BEGIN
        执行语句列表
END;

执行的语句列表里面可以用 NEW 和 OLD 来表示 新插入的记录 和 旧的记录 。 比如NEW.empno

存储过程:Procedure

MySQL 存储过程创建:

 # 修改分隔符
 DELIMITER //
 
 CREATE PROCEDURE proc(OUT result int)
 BEGIN 
 	SELECT COUNT(*) INTO result FROM table;
 END
 //
 
 # 修改回分隔符
 DELIMITER ;

注:

(1)这里需要注意的是DELIMITER //和DELIMITER ;两句,DELIMITER是分割符的意思,因为MySQL默认以";"为分隔符,如果我们没有声明分割符,那么编译器会把存储过程当成SQL语句进行处理,则存储过程的编译过程会报错,所以要事先用DELIMITER关键字申明当前段分隔符,这样MySQL才会将";"当做存储过程中的代码,不会执行这些代码,用完了之后要把分隔符还原。

(2)存储过程根据需要可能会有输入、输出、输入输出参数,这里有一个输出参数s,类型是int型,如果有多个参数用","分割开。

(3)过程体的开始与结束使用BEGIN与END进行标识。

游标 Cursor

个人理解:一般用于在过程性的语句中确定的某一种值,但是就目前碰到的问题,都可以用聚合函数来解决。所以不熟悉。

功力有限,只能挖坑。暂时参考:www.cnblogs.com/loong-hon/p…

事件 Event

适用于定时任务,比如定时刷新,拍卖的倒计时等等。

事件调度器的开关:

-- 开启事件调度器
SET GLOBAL event_scheduler = ON;
 
-- 关闭事件调度器
SET GLOBAL event_scheduler = OFF;
 
-- 查看事件调度器状态
SHOW VARIABLES LIKE 'event_scheduler';

创建:

在MySQL 5.1以上版本中,可以通过CREATE EVENT语句来创建事件。

CREATE
	[DEFINER={user | CURRENT_USER}]
	EVENT [IF NOT EXISTS] event_name
	ON SCHEDULE schedule
	[ON COMPLETION [NOT] PRESERVE]
	[ENABLE | DISABLE | DISABLE ON SLAVE]
	[COMMENT 'comment']
	DO event_body;