这是我参与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…
函数
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;