前言:因为数据库结业了,明天要交一个项目,所以今天都在忙项目,刚好,梳理一下数据库项目的一些东西
第一部分任务描述
包括团队分配,功能需求,总体设计 啥功能需求?其实就是对项目的介绍,比如有什么表,为什么要创建,分几个部分。 总体设计:就是对照功能需求,画图
第二部分,数据库设计
先概念设计,就是分几张表,各自功能等 并且完成相应的er图 逻辑设计 表名字(主键字段,其他字段) 物理设计
| 列名 | 数据类型| | 能不能为空 | 说明 |
然后就是建表,插入数据
DROP TABLE IF EXISTS 表名; CREATE TABLE 表名 (
字段
primary key (主键字段)
); insert into 表名(字段) values(值)
新建查询
SELECT 的基本语法如下:
SELECT 列名 FROM 表名;
如果需要从表中选取多个列,列名之间用逗号分隔。
SELECT 列名1, 列名2, ……, 列名n FROM 表名;
单表查询
算数:
加法运算
SELECT 1 + 2;
减法运算
SELECT 3 - 2;
乘法运算
SELECT 2 * 3;
除法运算
SELECT 6 / 5;
DIV 用法:
SELECT 3 DIV 2;
需要注意 / 与 DIV 的区别:/ 默认保留四位小数,DIV 只取整数部分。
取余运算
SELECT 6 % 4;
select 字段 from 表 where xx条件 group by 分组依据的字段名字 having 分组后数据的条件 order by 排序字段;
使用 WHERE 的基本语法如下:
SELECT 列名 FROM 表名 WHERE 列名 运算符 条件值;
对查询结果进行排序,语法如下:
SELECT 列名 FROM 表名 ORDER BY 列名
SELECT 列名 FROM city [WHERE 条件] GROUP BY 列名;
其中 GROUP BY 关键字表示分组
HAVING 也是条件筛选,和 WHERE 的作用差不多,前者在分组基础上筛选,后者是基于行的筛选。也可以说,WHERE 子句是在分组之前对表的行进行筛选,而 HAVING 则是在分完组后对组进行条件筛选,其语法如下。
SELECT 列名 FROM city GROUP BY 列名 HAVING 分组条件;
多表查询
等值连接的语法较为简单,语法如下:
SELECT table1.column1, table2.column2
FROM table1, table2
WHERE table1.column3 = table2.column4;
自然连接使用关键字 NATURAL JOIN,其 SQL 语法如下:
SELECT t1.column1, t2.column2
FROM table1 t1
NATURAL JOIN table2 t2
自连接实现 SQL 语句如下:
SELECT e1.emp_name, e2.emp_name mgr
FROM employee e1, employee e2
WHERE e1.mgr_id = e2.emp_id;
使用左连接的 SQL 语法如下:
SELECT * FROM table1 t1
LEFT JOIN table2 t2
ON(t1.column1 = t2.column2);
使用右连接的 SQL 语法如下:
SELECT * FROM table1 t1
RIGHT JOIN table2 t2
ON(t1.column1 = t2.column2);
相关子查询 首先,我们需明确不相关子查询和相关子查询的概念:
- 不相关子查询:子查询的查询条件不依赖于父查询的称为不相关子查询。
- 相关子查询:子查询的查询条件依赖于外层父查询的某个属性值的称为相关子查询,带
EXISTS的子查询就是相关子查询。
视图,函数,存储过程,游标,触发器
视图
创建视图
创建视图
CREATE VIEW viewname[column1, ……, columnn]
AS
SELECT 语句;
show tables 查看视图
删除视图,其语法如下:
DELETE FROM 视图名 [WHERE子句];
自定义函数
MySQL 安装完成后默认不允许创建自定义函数,需要在 my.cnf 配置文件中增加 log-bin-trust-FUNCTION-creators=1,然后重启数据库,使其具有创建函数的权限。也可以在 MySQL 命令行中输入以下命令来解决。
SET GLOBAL log_bin_trust_function_creators = 1;。
创建自定义函数使用 CREATE FUNCTION 语句,语法如下:
CREATE FUNCTION 函数名([变量名1 变量类型1, ……, 变量名n 变量类型n]) RETURNS 数据类型
BEGIN
sql语句;
RETURN 值;
END;
删除自定义函数使用 DROP FUNCTION 语句,其语法如下:函数名后面不能加括号
DROP FUNCTION 函数名;
存储过程
创建存储过程,其关键语法如下:
CREATE PROCEDURE 存储过程名([IN|OUT|INOUT] 参数名 数据类型)
BEGIN
……
END
删除存储过程使用 DROP PROCEDURE 语句,其语法如下:
DROP PROCEDURE 存储过程名;
游标
sql值只有一条
CREATE PROCEDURE 存储过程名([IN|OUT|INOUT] 参数名 数据类型)
BEGIN
DECLARE 变量名字q 变量类型;
DECLARE 变量名字 变量类型;
# 定义游标
DECLARE getCity CURSOR FOR sql语句
# 打开游标
OPEN getCity;
# 从游标中取值
FETCH getCity INTO 变量名字q,变量名字;
# 显示结果
SELECT 变量名字q,变量名字;
#关闭游标
CLOSE getCity;
#结束存储过程
end$
#调用存储过程,查看
CALL pro_city();
……
END
sql值多条 如下所示:
DELIMITER $
CREATE PROCEDURE pro_city()
BEGIN
# 定义变量,
DECLARE 变量名字q 变量类型;
DECLARE 变量名字 变量类型;
DECLARE DONE BOOLEAN DEFAULT 0; # 设置循环标志,默认值为 0
# 定义游标
DECLARE getCity CURSOR FOR
sql语句
DECLARE CONTINUE HANDLER FOR NOT FOUND SET DONE = 1; # 该语句表示游标遍历完后,设置循环标志为 1
# 打开游标
OPEN getCity;
REPEAT # 循环开始
# 从游标中取值
FETCH getCity INTO 变量名字q,变量名字;
IF DONE <> 1 THEN # 循环条件
# 显示结果
SELECT 变量名字q,变量名字;
END IF; # IF语句结束
UNTIL DONE END REPEAT; # 结束循环
CLOSE getCity;
END $
DELIMITER ;
#调用存储过程
CALL pro_city();
触发器
创建触发器的语法如下:
CREATE TRIGGER trigger_name trigger_time trigger_event ON table_name FOR EACH ROW trigger_statement;
删除触发器使用的语法如下:
DROP TRIGGER 触发器名;