SQL必知必会(第4版)学习笔记(20200809更新至第18课)

第1课-第14课笔记

第15课 插入数据

15.1 数据插入

INSERT:用来将行插入(或添加到数据库表)。
插入有几种方式:

  • 插入完整的行;
  • 插入行的一部分;
  • 插入某些查询的结果。

注意:使用INSERT语句可能需要客户端/服务器DBMS中的特定安全权限

15.1.1 插入完整的行

INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)
VALUES('1000000006', 'Toy Land', '123 Any Street', 'New York', 'NY', '11111', 'USA', NULL, NULL);

15.1.2 插入部分行

INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country)
VALUES('1000000006','Toy Land', '123 Any Street', 'New York', 'NY', '11111', 'USA');

可以省略列,只给某些列提供值,给其他列不提供值。省略的列必须满足以下条件:

  • 该列定义为允许NULL值(无值或空值),如果不允许却省略,DBMS会产生错误,导致无法成功插入相应行;
  • 在表定义中给出默认值,即不给出值时将使用默认值。

15.1.3 插入检索出的数据

INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country)
SELECT cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country
FROM CustNew;

在本例中,

  1. 首先创建和填充CustNew表,结构与Customers表相同;
  2. 在填充CustNew表时,不应该使用已经在Customers中用过的cust_id值(如果主键值重复,后续的INSERT操作将会失败);
  3. 如果CustNew表为空,则没有行被插入(也不产生错误,因为操作仍然是合法的);
  4. 本例中在INSERTSELECT语句中使用了相同的列名,但实际上并不要求列名匹配,DBMS使用的是列的位置,即SELECT中的第一列(不管其列名)将用来填充表列中指定的第一列,第二列将用来填充表列中指定的第二列,如此类推。
  5. SELECT语句可以包含WHERE子句以过滤插入的数据。

15.2 从一个表复制到另一个表

SELECT INTO
在MySQL中,SQL语句为:

CREATE TABLE CustCopy AS
SELECT* 
FROM Customers;

创建一个新表CustCopy,将表Customers复制过去。

  • 任何SELECT选项和子句都可以使用,包括WHERE和GROUP BY;
  • 可利用联结从多个表中插入数据;
  • 不管从多少个表中检索数据,数据都只能插入到一个表中。
  • 先用SELECT INTO进行复制,可在复制的数据上测试SQL代码,而不会影响实际的数据。

在Access上也尝试了一下

SELECT *
INTO CustCopy
FROM Customers;

在这里插入图片描述
可以发现CustCopy表出现在了左侧的表里。


第16课 更新和删除数据

16.1 更新数据 UPDATE

UPDATE语句:

  • 更新表中的特定行;
  • 更新表中的所有行。

基本的UPDATE语句由三部分组成:

  • 要更新的表;
  • 列名和它们的新值;
  • 确定要更新哪些行的过滤条件。(在使用UPDATE时一定要细心,不注意过滤条件会更新表中的所有行)

1. 更新单个列
【例16-1-1】客户1000000005 现在有了电子邮件地址kim@thetoystore.com,需要对其记录进行更新。
(涉及表:Customers;涉及列:cust_id,cust_email)

UPDATE Customers
SET cust_email = 'kim@thetoystore.com'
WHERE cust_id = '1000000005';

UPDATE...SET
SET语句用来赋值,将新值赋给被更新的列。

没有WHERE子句,DBMS将会用这个电子邮件地址更新Customers表中的所有行。

2. 更新多个列
【例16-1-2】更新客户1000000006的联系人(cust_contact)和电子邮件地址(cust_email),将联系人更新为‘Sam Roberts’,将邮件地址更新为‘sam@toyland.com’

UPDATE Customers
SET cust_contact = 'Sam Roberts',
	cust_email = 'sam@toyland.com'
WHERE cust_id = '1000000006';

更新多个列时,只需要使用一条SET命令,每个“列=值”对之间用逗号分隔(最后一列之后不用逗号)。

3. 删除某个列的值
【例16-1-3】去除客户1000000005的电子邮件记录。

UPDATE Customers
SET cust_email = NULL
WHERE cust_id = '1000000005';

要删除某个列的值,可设置其为NULL(假如表定义允许NULL值)。
设置NULL值和保存空字符串不同,空字符串用’ '表示,是一个值,而NULL表示没有值。

注意:

  • UPDATE语句中可以使用子查询,使得能用SELECT语句检索出的数据更新列数据。
  • 有个SQL实现支持在UPDATE语句中使用FROM子句,用一个表的数据更新另一个表的行。

16.2 删除数据 DELETE

  • 从一个表中删除(去掉)数据,使用DELETE语句。
  • 有两种使用DELETE的方式:
    • 从表中删除特定的行;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值