表( TABLE)
概念:表(TABLE) ,有行有列,行又叫做记录,指的是表中的数据;列又叫做属性/字段
备份表:在数据库中创建临时备份表
语法:CREATE TABLE 表名 AS SELECT * FROM 表名 [WHERE 查询条件];
例如:CREATE TABLE tmp_emp AS SELECT * FROM emp WHERE deptno=20;
DESC tmp_emp; --查询临时表属性
SELECT * FROM tmp_emp; --查询临时表数据信息
结论:临时表不会继承原表的主外键约束,但是表结构和表数据都是一样的
备注:不建议创建比较多的临时表在数据库中,会影响数据库的空间
最后:DROP TABLE tmp_emp; --(删除临时表)
视图(VIEW)
概念:视图(view),是一种虚拟的表,具有和物理表相同的功能,视图可以进行编辑,但 是对基本表示没有影响的,作用就是可以很好的保护数据的隐私,同时让复杂的查询 变得简单。
比如:出于数据安全考虑,跟对接系统数据交互,出于数据安全考虑只对外暴露部分 数据,就可以创建一个视图,把要对外开放的数据放在视图中,让别人之间访问视图 就好。
语法:CREATE VIEW 视图名 AS
例如:查询王五的选课情况(课程老师,课时,课程名称等等)
正常比较复杂的查询语句:
SELECT cname,chour,tname FROM course WHERE cid IN(
SELECT cid FROM score WHERE sid=(
SELECT sid FROM student WHERE sname='王五'));
把查询的数据放在视图当中,以后需要查询就直接从视图中获取,不让别人看到其它信息:
CREATE VIEW v0722 AS SELECT cname,chour,tname FROM course WHERE cid IN(
SELECT cid FROM score WHERE sid=(
SELECT sid FROM student WHERE sname='王五'));
后期需要王五的选课信息,就直接从视图 v0722中查询获取,效率肯定快,另外别人也看不了其它的信息,例如:
SELECT * FROM v0722;
索引(INDEX)
概念:索引(INDEX)就是来加快搜索速度的,是优化数据库查询效率的常见方法之一。
索引加快了数据库检索的速度,但是降低了 插入、删除、修改等维护类的编辑任务 的执行速度
索引的本质是牺牲了空间换取了速度
索引一般都是添加在具体的列上面,针对了大批量数据查询才有效果,有时候,因为代码需要,会添加联合索引。
order by即distinc或是like等,都不会使用索引。也就是说,索引对于他们是无效的。
语法:CREATE INDEX 索引名 ON 表名(列名);
例如:CREATE INDEX idx_emp_ename ON EMP(ename); ---(创建索引)
SELECT *FROM EMP WHERE ename='SMITH'; ---(只要数据库认为可以使用某个 已经创建的索引,索引就会自动运用。)
删除索引: DROP INDEX 名称 ON 表名;
例如:DROP INDEX idx_emp_ename ON EMP;
存储过程(PROCEDURE)
概念:是一的复杂的程序,以便于外部程序或者其他应用程序对数据进行调用的数据库对象。种在数据库中存储
简单的说:存储过程就是在数据库中写代码,目的就是完成特定任务或者功能所组成的 SQL集合,是一个语句集,经过编译存储在数据库中,可以指定用户对其进行调用,提升效率。
优点:可封装,可校验,可回传,可隐藏复杂的商业逻辑,可以被调用,简化程序开发等等
缺点:对数据库的依赖很大,定制化于特定的数据库上;复用率很低 ;不能使用 SELECT 指令执行,它是子程序
语法:前提:进入数据库,保证可以使用正常的存储过程执行SQL命令
1、修改 mysql 的界定符(语句结束符)
DELIMITER // 或者 DELIMITER $$
2、创建存储过程
CREATE PROCEDURE 名字([参数类型] 参数名 数据类型,[参数类型] 参数名 数据类型,...)
BEGIN
过程体;
END;
// # 不加也没关系,会自动恢复
3、调用存储过程;
CALL 过程名称();
DROP PROCEDURE 名字; -- 命令删除名字后不加(),也可以选中左侧导航右键删除
1、存储过程的参数:
mysql 中参数的定义,一共支持三种类型: IN OUT INOUT
IN:输入参数,表示调用者向过程传入值(可以是具体的值,也可以是变量)
OUT:输出参数:表示调用者向过程传出值(可以返回多个值,但是传出的值 只能是变量)
INOUT: 输入输出参数,表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)
建议: 输入值就用 IN 参数
输出值就只用 OUT 参数
INOUT 参数尽量少用
注意:存储过程支持没有参数,即使没有参数,但是过程后面的()必须要有,不可以省略
参数的名字不能等于列名,否则在执行的过程当中,会被当做整个列来处理。
2、过程体:
由合法的 SQL 语句构成,即 SQL 命令集,可执行,过程体包含了过程调用执行的 所有的 SQL 语句 ;
例如: DQL 、DML、if-THEN-ELSE 等等,以及申明变量。
过程体的格式: 以 BEGIN 开始,以 END 结束(可以嵌套)
注意:每个嵌套块中每条命令就结束,都必须使用 ; 结束。
3、调用:
1)可以使用 CALL 命令通过名字对存储过程调用;
CALL 存储过程的名称() ;
- 可以供外部程序调用,比如 java ,python
存储过程编写的思路
前提:进入数据库,保证可以使用正常的存储过程执行SQL命令
1、修改 mysql 的界定符(语句结束符)
DELIMITER // 或者 DELIMITER $$
2、创建存储过程
CREATE PROCEDURE 名字()
BEGIN
过程体;
END;
// # 不加也没关系,会自动恢复
3、调用存储过程;
CALL 过程名称();
DROP PROCEDURE select2; -- 命令删除名字后不加(),也可以选中左侧导航右键删除
例如:
不带参数的存储过程
SELECT 'hello world!' FROM DUAL; -- 过程体,通过存储过程实现
CREATE PROCEDURE p1()
BEGIN
SELECT 'hello world!' FROM DUAL;
END;
报错了:/* 错误代码: 1064
You have an error in your SQL syntax; check the manual that corresponds
to your MySQL server version for the right syntax to use near '' at line 3
*/
报错的原因:是语句的命令没有正确结束,是因为 ; 界定符造成的,解决办法,修改界定符
修改界定符 ; 为 // 或者 $$ ,目的是让 ; 暂时失效,不表示语句结束
修改界定符:delimiter
DELIMITER //
CREATE PROCEDURE p1()
BEGIN
SELECT 'hello world!' FROM DUAL;
END;
调用
CALL p1 ; -- 每调用一次存储过程,就相当于把过程体执行一次
CALL p1(); -- 调用的时候,没有参数的存储过程()可以加,也可以不加