mysql中常见的数据库对象

发布于:2022-12-25 ⋅ 阅读:(752) ⋅ 点赞:(0)

表( 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 存储过程的名称() ;

  1. 可以供外部程序调用,比如 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(); -- 调用的时候,没有参数的存储过程()可以加,也可以不加

本文含有隐藏内容,请 开通VIP 后查看