MySQL必知必会读书笔记-8(表的操纵,视图,存储过程,游标,触发器)

1--表的操作

创建一个表

在创建表的时候应确保这个表之前不存在,若之前存在则应删除之后再创建

AUTO_INCREMENT表示自动增加

使用默认值的话,在列定义后加DEFAULT 常量,表示默认初始化为一个常量

更新一个表

添加一个列

删除一个列

定义外键

删除表

重命名一个表

2--视图

什么是视图

视图是一个虚拟的表,它与普通的表不一样,视图只包含使用时动态数据的查询。

举例:

搜索买了某个产品的客户的信息的查询语句,我们可以将其包装成为一个虚拟表productcustomers,

使用这个虚拟表可以轻松检索出相同的数据

这就是视图

为什么使用视图?

 视图的规则和限制

3--视图的使用

创建视图

示例:

创建一个视图,这个视图是包含了顾客对应的订单以及其对应的订单内容的虚拟表

CREATE VIEW productcustomers AS
SELECT cust_name, cust_contact, prod_id
FROM customers, orders, orderitems
WHERE customers.cust_id = orders.cust_id
AND   orderitems.order_num = orders.order_num

通过这个视图搜索订购了TNT的顾客

SELECT cust_name, cust_contact
FROM productcustomers
WHERE prod_id = ‘TNT2‘;

由此可见视图简化了复杂SQL代码的使用,同时也提高了代码的复用性。

使用视图重新格式化检索出的数据

 使用视图过滤数据

过滤没有邮箱的顾客

 使用视图与计算字段

列出某个订单物品表中的每一种物品的总价

CREATE VIEW orderitemsexpanded AS
SELECT order_num, prod_id, quantity, item_price, quantity*item_price AS expanded_price
FROM orderitems
SELECT *
FROM orderitemsexpanded
WHERE order_num = 20005;

4--视图更新

一个表可以进行更新操作(insert,update和delete)

虚拟表即视图同样可以,但是受到了一些限制

若视图中有以下操作则不可以更新

5--存储过程

存储过程就是为以后的使用而保存的一个SQL语言的集合,就像一个代码块

作用

编写存储过程

写一个返回产品的平均价格的存储过程

CREATE PROCEDURE productpricing()
BEGIN
    SELECT Avg(prod_price) AS priceaverage
    FROM products;
END;

执行它

CALL productpricing();

 存储过程的删除

带参数的存储过程

计算产品表中的最低,最高和平均价格(只传进去参数,不传出来)

CREATE PROCEDURE productpricing(
    OUT p1 DECIMAL(8,2),
    OUT ph DECIMAL(8,2),
    OUT pa DECIMAL(8,2)
)
BEGIN
    SELECT Min(prod_price)
    INTO p1
    FROM products;
    SELECT Max(prod_price)
    INTO ph
    FROM products;
    SELECT Avg(prod_price)
    INTO pa
    FROM products;
END;

其中关键字OUT代表传出这个参数,如果是IN的话代表传入参数,INOUT则代表传入和传出

//执行存储过程CALL productpricing(@pricelow, @pricehigh, @priceaverage)
SELECT @priceaverage

输入订单号返回订单的总价(参数的传入和传出)

CREATE PROCEDURE ordertotal (
    IN number INT,
  OUT total DECIMAL(8, 2)
)
BEGIN
    SELECT Sum(item_price*quantity)
    FROM orderitems
  WHERE order_num = number
  INTO total;
END;
CALL ordertotal(20005, @total);

SELECT @total;

6--带条件语句的存储过程

假如我们要计算订单的总价,要对总价增加营业税,不过这个营业税只针对符合某些条件的顾客

CREATE PROCEDURE ordertotal(
    IN number INT,
    IN taxable BOOLEAN, #布尔值,决定是否加税
    OUT total DECIMAL(8, 2)
)
BEGIN
    DECLARE ttotal DECIMAL(8,2);
    DECLARE taxrate INT DEFAULT 6;#税率初始化

    SELECT Sum(item_price*quantity)
    FROM orderitems
    WHERE order_num = number
    INTO ttotal;

    IF taxable THEN
        SELECT ttotal+(ttotal/100*taxrate) INTO ttotal;
    END IF;

    SELECT ttotal INTO total;
END;
CALL ordertotal(20005, FALSE, @total);
SELECT @total;

CALL ordertotal(20005, TRUE, @total);
SELECT @total;

7--检查存储过程

8--游标

MySQL中,游标只适用于存储过程和函数。

游标是一个存储在MySQL服务器上的数据库查询,它不是一条SELECT语句,而是被该语句检索出来的结果集,

在存储了游标之后,应用程序可以根据需要滚动或者浏览其中的数据。

游标的使用

查询所有订单的总价

 1 CREATE PROCEDURE processorders()
 2 BEGIN
 3     DECLARE done BOOLEAN DEFAULT FALSE;
 4     DECLARE o INT;
 5     DECLARE t DECIMAL(8, 2);
 6
 7     DECLARE ordernumbers CURSOR #定义一个游标,读取出orders中的所有order_num
 8     FOR
 9     SELECT order_num FROM orders;
10
11     DECLARE CONTINUE HANDLER FOR SQLSTATE ‘02000‘ SET done = TRUE;#‘02000‘是一个未找到条件,达到这个条件之后done就被设置为true了
12
13     CREATE TABLE IF NOT EXISTS ordertotals
14         (order_num INT, total DECIMAL(8,2));
15
16     OPEN ordernumbers; #使用游标前必须打开它,使用之后要关闭
17
18     REPEAT #反复执行
19         FETCH ordernumbers INTO o; #使用FETCH读取这个游标的一行,再次执行的时候读取其下一行
20         CALL ordertotal(o, 1, t); #这个存储过程是上一节的例子
21         INSERT INTO ordertotals(order_num, total)
22         VALUES(o,t);
23     UNTIL done END REPEAT;
24
25     CLOSE ordernumbers;
26 END;
27
28 CALL processorders();
29
30 SELECT *
31 FROM ordertotals;

这段代码就是通过游标查出所有订单号,通过循环一个个输出来,计算每个订单号的总额,然后将数据添加到新表ordertotals中。

9--触发器

MySQL中,触发器是在执行DELETE, INSERT, UPDATE语句时可以自动响应的一个处理动作。

比如每当我们从仓库中订购一个产品,仓库中的对应产品数量就会少一个。

创建触发器

每一个触发器名字必须是唯一的,并且只有基本表支持触发器

示例:

每有一个订单被删除,这个订单就会被添加到订单记录表里去

#新建订单记录表CREATE TABLE archive_orders
(
  order_num  int      NOT NULL ,
  order_date datetime NOT NULL ,
  cust_id    int      NOT NULL ,
  PRIMARY KEY (order_num)
) ENGINE=InnoDB;

CREATE TRIGGER deleteorder BEFORE DELETE ON orders
FOR EACH ROW
BEGIN
    INSERT INTO archive_orders(order_num, order_date, cust_id)
    VALUES(OLD.order_num, OLD.order_date, OLD.cust_id);
END;

由于订单表中有外键的限制,这些语句不可以直接使用,这里仅仅作为一个示范。

时间: 2024-08-05 13:19:43

MySQL必知必会读书笔记-8(表的操纵,视图,存储过程,游标,触发器)的相关文章

《MySQL必知必会》读书笔记_4

PS:一个实际的存储过程案例 CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_delete_article_by_id`(IN `id` int) BEGIN #Routine body goes here... DECLARE temp INT; SET @aid = id; SELECT COUNT(*) FROM gk_reply_article WHERE a_id = @aid INTO temp; IF(temp <> 0) THEN

《MySQL必知必会》读书笔记_3

PS:这次的信息量有点大. 聚集不同值 SELECT AVG(DISTINCT prod_price) AS avg_price FROM products WHERE vend_id = 1003 #相同的值不会被计算 组合聚集函数 SELECT COUNT(*) AS num_items, MIN(prod_price) AS price_min, MAX(prod_price) AS price_max, AVG(prod_price) AS price_avg FROM products

《mysql必知必会》读书笔记--存储过程的使用

以前对mysql的认识与应用只是停留在增删改查的阶段,最近正好在学习mysql相关内容,看了一本书叫做<MySQL必知必会>,看了之后对MySQL的高级用法有了一定的了解.以下内容只当读书笔记. 如有转载请注明出处~ 存储过程的使用 执行存储过程 CALL productpricing() 执行名为productpricing的存储过程 创建存储过程 CREATE PROCEDURE productpricing() BEGIN SELECT avg(prod_price) AS pricea

MySQL必知必会 学习笔记(一)

第一章  了解SQL 模式:   关于数据库和表的布局以及特性的信息.[描述表可以存储什么样的数据,数据如何分解,各部分信息如何命名等等,可以用来描述数据库中特定的表以及整个数据库(和其中表的关系)]. 第二章 MySQL简介 MySQL是一种DBMS,即它是一种数据库软件.基于客户机----服务器的数据库. MySQL工具: 1.mysql 命令行实用程序 2.MySQL Administrator 3.MySQL query Browser 第四章 检索数据 LIMIT 5 表示MySQL返

SQLServer:《SQL必知必会》一书的读书笔记(五)

第5课 高级数据过滤 5.1 组合 WHERE 子句 第4课介绍的 WHERE 子句在过滤数据时都是用单一的条件. 5.1.1 AND 操作符 检索由供应商 DLL01 制造且价格小于等于 4 美元的所有产品的名称和价格: SELECT prod_id, prod_price, prod_name FROM Products WHERE vend_id = 'DLL01' AND prod_price <= 4; 5.1.2 OR 操作符 检索任一个指定供应商制造的所有产品的名称和价格: SEL

《MySQL 必知必会》读书总结

这是 <MySQL 必知必会> 的读书总结.也是自己整理的常用操作的参考手册. ? ? 使用 MySQL 连接到 MySQL shell>mysql -u root -p Enter password:****** 显示数据库 mysql>SHOW DATABASES; 选择数据库 mysql>USE mytest; 显示数据库中的表 mysql>SHOW TABLES; 显示表列 mysql>SHOW COLUMNS FROM tmall_user; mysql

SQLServer:《SQL必知必会》一书的读书笔记(八)

第8课 使用函数处理数据 8.1 函数 [名词]可移植:所编写的代码可以在多个系统上运行 8.2 使用函数 8.2.1 文本处理函数 例1:使用 UPPER() 函数--将文本转换为大写 SELECT vend_name, UPPER(vend_name) AS vend_name_upcase FROM Vendors ORDER BY vend_name; 常用的文本处理函数: LEFT():返回字符串左边的字符 DATALENGTH():返回字符串的长度 LOWER():将字符串转换为小写

SQLServer:《SQL必知必会》一书的读书笔记(四)

第4课 过滤数据 4.1 使用 WHERE 子句:过滤 只检索所需数据需要指定搜索条件(即过滤条件). WHERE 子句在表名(FROM 子句)后给出,根据 WHERE 子句中指定的条件过滤. SELECT prod_name, prod_price FROM Products WHERE prod_price = 3.49; -- 分析:从 Products 表中检索两个列,只返回 prod_price 值为 3.49 的行 [提示]SQL 过滤与应用过滤: 数据也可以在应用层过滤.但是在优化

《MySQL必知必会》学习笔记_1

#选择数据库 USE mysql #返回可用数据库列表 SHOW DATABASES #返回当前数据库中可用表 SHOW TABLES #返回表列 SHOW COLUMNS FROM db #显示特定数据库的创建语句 SHOW CREATE DATABASE mysql #显示广泛的服务器状态信息 SHOW STATUS #显示授权用户的安全权限 SHOW GRANTS 多条SQL语句必须以分号分隔. SQL语句不区分大小写,习惯性大写. 检索不同的行用DISTINCT,只返回不同的值. 限制结

《mysql必知必会》笔记-部分

<mysql必知必会>笔记-部分 注释: 开始时整理笔记,记录自己看书过程的疑问和重点,后来发现记录没太多意义,还不如直接去翻原书,所以就放弃了. 因此,这个笔记只有一部分,不过依旧分享出来. 1.语言分类: 客户机可以是MySQL提供的工具.脚本语言(如perl).Web应用开发语言(如ASP.ColdFusion.JSP和PHP).程序设计语言(如C.C+kJava)等. 2.之前找不到表的原因: 虽然SQL是不区分大小写的,但有些标识符(如数据库名.表名.列名)可能不同:在MySQL4.