本篇知识点

更新删除数据、创建操纵表、视图、存储过程

更新和删除数据使用UPDATE语句更新(修改)表中的数据:更新表中特定行(使用WHERE语句

更新表中所有行

UPDATE语句以要更新的表名开始,SET命令用来赋值

UPDATE customers

SET cust_email = 'elmer@fund.com'

WHERE cust_id = 10005;

更新多个列

UPDATE customers

SET cust_name = 'The Fudds',

cust_email = 'elmer@fudd.com'

WHERE cust_id = 10005;

使用IGNORE关键字,即使在更新多个行时发生错误,也能继续进行更新

UPDATE IGNORE customers删除某个列的值,可使用UPDATE设置它为NULL(假如表定义允许NULL值)

UPDATE customers

SET cust_email = NULL

WHERE cust_id = 10005;

其中NULL用来去除cust_mail列中的值使用DELETE语句从一个表中删除数据:从表中删除特定行

从表中删除所有行

DELETE删除整行,删除列(值)用UPDATE

DELETE FROM customers WHERE cust_id = 10006;

DELETE不删除表本身;删除所有行用TRUNCATE TABLE

创建和操纵表使用CREATE TABLE创建表时,须给出下列信息:新表的名字,在关键字CREATE TABLE之后给出;

表列的名字和定义,用逗号分隔

创建练习使用的customers表

CREATE TABLE customers IF NOT EXISTS

(

Cust_id int NOT NULL AUTO_INCREMENT,

Cust_name char(50) NOT NULL,

Cust_address char(50) NULL,

Cust_city char(50) NULL,

Cust_state char(5) NULL,

Cust_zip char(10) NULL,

Cust_country char(50) NULL,

Cust_contact char(50) NULL,

Cust_email char(255) NULL,

PRIMARY KEY (cust_id)

) ENGINE = InnoDB;

在表名后给出IF NOT EXISTS,仅在表名不存在时创建它。NULL值表示没有值或缺值,允许NULL值的列允许在插入行时不给出该列的值,否之必须给值

CREATE TABLE orders

(

order_num int NOT NULL AUTO_INCREMENT ,

order_date datetime NOT NULL ,

cust_id int NOT NULL ,

PRIMARU KEY (order_num)

) ENGINE = InnoDB ;

NULL值和NOT NULL可以在创建时混用主键值必须唯一;创建由多个列组成的主键,应该以逗号分隔的列表给出各列名:

CREATE TABLE orderitems

(

order_num int NOT NULL ,

order_item int NOT NULL ,

prod_id char(10) NOT NULL ,

quantity int NOT NULL ,

item_price decimal(8,2) NOT NULL ,

PRIMARY KEY (order_num, order_item)

) ENGINE = InnoDB;

订单号(order_num)和订单物品(order_item)的组合是唯一的,从而适合作为主键。

主键:其值唯一标识表中每个行的列;主键中只能使用定义为NOT NULL的列。使用AUTO_INCREMENT,当一列增加一行时自动增量,给该列赋予一个可用的值,一般用在id列,可用作主键值;每个表只允许一个AUTO_INCREMENT列,且它必须被索引。

使用last_insert_id( )函数可获得使用AUTO_INCREMENT列时获得的值

SELECT last_insert_id( )

返回一个AUTO_INCREMENT值指定默认值:如果在插入行时没有给值,可指定使用默认值

quantity int NOT NULL DEFAULT 1,

MySQL只支持常量作为默认值引擎类型InnoDB是一个可靠的事务处理引擎,不支持全文本搜索

MEMORY功能等同与MyISAM,数据存储在内存中,速度很快(适合于临时表)

MyISAM性能很高,支持全文本搜索,不支持事务处理

外键不能跨引擎使用ALTER TABLE语句更新表定义,须给出:ALTER TABLE之后给出要更改的表名

更改的列表

给表添加一个列

ALTER TABLE vendors

ADD vend_phone CHAR(20);删除刚添加的列

ALTER TABLE vendors

DROP COLUMN vend_phone;使用ALTER TABLE定义外键:

ALTER TABLE orderitems

ADD CONSTRAINT fk_orderitems_orders

FOREIGN KEY (order_num) REFERENCES orders(order_num);

对单个表进行多个更改,可使用单挑ALTER TABLE语句,每个更改用逗号分隔删除表

DROP TABLE customers2;重命名表

RENAME TABLE customers2 TO customers;

可以对多个表重命名,用逗号分开。

使用视图视图是虚拟的表;视图只包含使用时动态检索数据的查询。

为什么使用视图:重用SQL语句

简化复杂的SQL操作。编写查询后,可以方便地重用它而不必知道基本细节

使用表的组成部分而非整个表

保护表数据。用户仅被授予表的特定部分的访问权限。

更改数据格式和表使。视图可返回与底层表的表示和格式不同的数据

视图是用来查看存储在别处的数据的一种设施,它本身不包含数据。

视图的创建:用CREATE VIEW语句创建

使用SHOW CREATE VIEW viewname;来查看创建视图的语句

用DROP删除视图,语法为DROP VIEW viewname

更新视图时,可先DROP再CREATE,也可直接CREATE OR REPLACE VIEW.

使用视图隐藏复杂的SQL

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 ;

这条语句创建一个名为productcustomers的视图,它联结三个表。

为检索订购了产品TNT2的客户,可如下进行:

SELECT cust_name, cust_contact

FROM productcustomers

WHERE prod_id = 'TNT2';使用视图重新格式化检索出的数据

CREATE VIEW vendorlocations AS

SELECT Concat(Rtrim(vend_name), '(', Rtrim(vend_country), ')')

AS vend_title

FROM vendors

ORDER BY vend_name;用视图过滤不想要的数据

CREATE VIEW customermaillist AS

SELECT cust_id, cust_name, cust_email

FROM customers

WHERE cust_email IS NOT NULL ;

定义customeremaillist视图,过滤没有电子邮件地址的客户。使用视图与计算字段

CREATE VIEW orderitemsexpanded AS

SELECT order_num,

prod_id,

quantity,

item_price,

quantity*item_price AS expanded_price

FROM orderitems ;视图是可更新的(对它们使用INSERT, UPDATE和DELETE),但是如果视图定义中有以下操作(使得MySQL不能正确地确定被更新的基数据),则不能进行视图更新:分组(使用GROUP BY和HAVING)

联结

子查询

聚集函数(Min( ), Count( ), Sum( )等)

DISTINCT

导出(计算)列

使用存储过程存储过程,就是为了以后的使用而保存的一条或多条MySQL语句的集合。可将其视为批文件。

执行存储过程称为调用,使用语句CALL

CALL productpricing (@pricelow,

@pricehigh,

@priceaverage);

其中,执行名为productpricing的存储过程,它计算并返回产品的最低、最高和平均价格。创建存储过程 例子:一个返回产品平均价格的存储过程

CREATE PROCEDURE productpricing( )

BEGIN

SELECT Avg(prod_price) AS priceaverage

FROM products;

END;

此存储过程名为productpricing,用CREATE PROCEDURE productpricing( )语句定义,若存储过程接受参数,将在( )中列举出来。BEGIN和END语句用来限定存储过程体,存储过程体本身仅是一个简单的SELECT语句。mysql命令行客户机的分隔符 (我懒得打字总结了)摘自《MySQL必知必会》使用存储过程

CALL productpricing( ) ;删除存储过程

DROP PROCEDURE productpricing ;使用参数

CREATE PROCEDURE productpricing (

OUT pl DECIMAL (8, 2) ,

OUT ph DECIMAL (8, 2) ,

OUT pa DECIMAL (8, 2)

)

BEGIN

SELECT Min(prod_price)

INTO pl

FROM products;

SELECT Max(prod_price)

INTO ph

FROM products;

SELECT Avg(prod_price)

INTO pa

FROM products;

END;

此存储过程接受3个参数:pl存储产品最低价格,ph存储产品最高价格,pa存储产品平均价格。每个参数必须具有指定的类型,这里使用十进制值。关键词OUT指出相应的参数用来从存储过程传出一个值(返回给调用者)。MySQL支持IN(传递给存储过程)、OUT(从存储过程传出)和INOUT(对存储过程传入和传出)类型的参数。调用此存储过程须指定3个变量名

CALL productpricing (@pricelow,

@pricehigh,

@priceaverage);

变量以@开始。调用时上条语句不显示数据,它返回可以显示的变量。显示数据

SELECT @priceaverage;显示3个数据

SELECT @pricehigh, @pricelow, @priceaverage;使用IN和OUT参数

CREATE PROCEDURE ordertotal (

IN onumer INT,

OUT ototal DECIMAL(8, 2)

)

BEGIN

SELECT Sum(item_price*quantity)

FROM orderitens

WHERE order_num = onumer

INTO ototal;

END;

onumer定义为IN, 因为订单号被传入存储过程。ototal定义为OUT, 因为要从存储过程返回合计,INTO使用ototal存储计算出来的合计。

调用这个存储过程

CALL ordertotal (20005, @total);建立智能存储过程

智能存储过程中包含了业务规则和智能处理,不仅限于封装简单的SELECT语句

案例 需要对订单合计增加营业税,不过只针对某些顾客

-- Name: ordertotal-- Parameters: onumber = order numer-- taxable = 0 if not taxable, 1 if taxable-- ototal = order total variable

CREATE PRECEDURE ordertotal(

IN onumer INT,

IN taxable BBOLEAN,

OUT ototal DECIMAL(8, 2)

) COMMENT 'Obtian order total, optionally adding tax'

BEGIN

-- Declare variable for total DECLARE total DECIMAL(8,2);

-- Decalre tax percentage DECLARE taxrate INT DEFAULT 6;

-- Get the order total SELECT Sum(item_price*quantity)

FROM orderitems

WHERE order_num = onumber

INTO total;

-- Is this taxable? IF taxable THEN

-- Yes, so add taxrate to the total SELECT total+(total/100 *taxrate) INTO total;

END IF;

-- And finally, save to out variable SELECT total INTO ototal;

END;

这个存储过程增加了注释(前面放置--),用DECALRE语句定义了两个局部变量。COMMENT关键字非必须,如果给出,将在SHOW PROCEDURE STATUS结果中显示。试验存储过程

CALL ordertotal (20005, 0, @total);

SELECT @total;检查存储过程

SHOW CREATE PRECEDURE ordertotal;

参考^TRUNCATE实际是删除原来的表并重新创建一个表,而不 是逐行删除表中的数据.

5天学会mysql_5天学完《MySQL必知必会》学习笔记之第四天相关推荐

  1. 36篇博文带你学完opencv :python+opencv进阶版学习笔记目录

    基础版学习笔记传送门 36篇博文带你学完opencv :python3+opencv学习笔记汇总目录(基础版) 进阶版笔记 项目 opencv进阶学习笔记1: 调用摄像头用法大全(打开摄像头,打开摄像 ...

  2. 电路不挂科——四小时学完电路原理(猴博士学习笔记1)

    电路基础 ##1串并联,短路与断路 这里是一些高中基础知识,相信大家没有感到陌生,需要注意的是电阻并联的公式有两种形态. ##电源 在大学的电路分析中,电源的表示方式有很多种,其中比较常用的就两种表示 ...

  3. 一篇学完:GAMES101:现代计算机图形学入门 学习笔记

    文章首发于lengyueling.cn 欢迎访问交流! PDF版本已经附在lengyueling.cn文章末尾,需要自取. 导论 图形学应用场景 电子游戏: PBR:之狼 卡通渲染:无主之地 电影:黑 ...

  4. 网易MySQL数据库工程师微专业学习笔记(十四)

    一.mysql5.7新增的功能 mysql5.7相对于mysql5.5和5.6来说还是添加了很多实用的新功能的,下面简单列举几个实用的新功能. 1. 添加了json字段 为了应对非结构化数据库的冲击m ...

  5. mysql必知必会_5天学完《MySQL必知必会》学习笔记之第四天

    本篇知识点 更新删除数据.创建操纵表.视图.存储过程 更新和删除数据 使用UPDATE语句更新(修改)表中的数据: 更新表中特定行(使用WHERE语句 更新表中所有行 UPDATE语句以要更新的表名开 ...

  6. mysql中用完即删用什么_MySQL使用和操作总结(《MySQL必知必会》读书笔记)

    简介 MySQL是一种DBMS,即它是一种数据库软件.DBMS可分为两类:一类是基于共享文件系统的DBMS,另一类是基于客户机--服务器的DBMS.前者用于桌面用途,通常不用于高端或更关键应用. My ...

  7. mysql必学十大必会_MYSQL 学习(一)--启蒙篇《MYSQL必知必会》

    MYSQL必知必会 一. DDL 数据定义语言 Data Definition Language 是指CREATE,ALTER和DROP语句. DDL允许添加/修改/删除包含数据的逻辑结构,或允许用户 ...

  8. mysql必知必会_《MySQL必知必会》学习小结

    关于SQL,之前通过sqlzoo的题目,完成了入门,也仅仅是入门而已. 最近都在忙着投简历和找新的数据分析项目做(为了练python和面试的时候有的聊),所以SQL放了一段时间没练.目前的工作用不到, ...

  9. 【总结记录】《MySQL必知必会》读后笔记,结合 leetcode 例题理解

    文章目录 一. <MySQL知会>读后笔记 1. 零散的前文知识 2. 连接数据库 3. 检索数据(重点开始了) 4. 排序.过滤数据 5. 通配符.正则表达式 6. 汇总数据 7. 分组 ...

最新文章

  1. 苹果iOS系统下检查第三方APP是否安装及跳转启动
  2. 安装apache+gd2(jpeg,png等)+mysql-client+php脚本
  3. CTO案头必备|AI技术产业落地的42章经
  4. 基于气动人工肌肉的双足机器人关节设计
  5. java课设电子门禁_Java 并发专题 : CyclicBarrier 打造一个安全的门禁系统
  6. 上古卷轴 java_上古卷轴II-双帝传奇
  7. Teams零点击可蠕虫跨平台 RCE 漏洞详情公开,微软评为低危且拒绝分配CVE被吐槽...
  8. Python包和__init__.py文件
  9. 华为鸿蒙巴龙麒麟,华为5G新机强势曝光:麒麟985+巴龙5000+鸿蒙系统,颜值性能炸裂...
  10. 【重磅干货整理】机器学习(Machine Learning)与深度学习(Deep Learning)资料汇总
  11. 图像处理小tip——中值滤波的多种实现(包括快速中值滤波算法)
  12. python 公众号爬虫_微信公众号爬虫,看这个就足够了
  13. android微信下拉出现小程序,微信下拉出现小程序怎么关闭 微信下拉小程序去掉方法...
  14. ubuntu16.04安装theano
  15. 已知两数的最大公因数和最小公倍数
  16. 阿里巴巴十周年有感----宗教的盛宴
  17. Effective C++ NVI手法
  18. StoryBoard故事版之ViewController与实体类的关联和不同StoryBoard 跳转
  19. 局域网搭建IOS应用在线安装环境
  20. openstack ironic standalone 方式部署

热门文章

  1. 传奇私服最稳定的服务器,传奇选择什么样的服务器才能保证自己服的一个稳定...
  2. apk下载安装,存储的位置,路径
  3. 安信可Combo固件常见应用示例集合,适用RTL8720系列 / Ai-WB2系列模组
  4. 轻松实现公式识别到word,utools插件Img2Tex+Typora
  5. Ros 与 STM32 之Ros串口同设备USB固定
  6. autojs做小游戏-连连看
  7. 作业三--创建子程序
  8. SQLServer附加数据库(打开.mdf文件),及报错问题解决
  9. 软件测试的类型有哪几种?
  10. 【框架学习】spring简介