《SQL必知必会》笔记8-建表create、插入insert、更新update、删除delete

1 创建和操纵表(CREATE)

1.1 创建表CREATE

利用CREATE TABLE创建表,需给出以下信息:

  1. 新表的名字,在关键字CREATE TABLE之后给出。
  2. 表列的名字和定义,用逗号分隔。
  3. 有的DBMS还要求指定表的位置。

创建产品Products表:

CREATE TABLE Products
(
 prod_id      char(10)       NOT NULL ,
 vend_id      char(10)       NOT NULL ,
 prod_name    char(255)      NOT NULL ,
 prod_price   decimal(8,2)   NOT NULL ,
 prod_desc    text           NULL 
);

添加默认值的时候,使用关键字DEFAULT。

创建订单明细OrderItems表:

CREATE TABLE OrderItems
(
 order_num    int             NOT NULL ,
 order_item   int             NOT NULL ,
 prod_id      char(10)        NOT NULL ,
 quantity     int             NOT NULL      DEFAULT 1,
 item_price   decimal(8,2)    NOT NULL 
);

1.2 更新表ALTER

利用ALTER TABLE更新表,要考虑:

  1. 理想情况下,不要在表中包含数据的时候对其进行更新,应该在创建表的时候,考虑未来的扩展性,避免对表的结构做大改动。
  2. 所有的DBMS都允许对现有表增加列,不过对所增加列的数据类型(以及NULL和DEFAULT的使用)有所限制。
  3. 多数DBMS允许重命名表中的列,不允许删除或更改表中的列。

给供应商Vendors表添加vend_phone列:

ALTER TABLE Vendors
ADD vend_phone CHAR(20);

删除供应商Vendors表的vend_phone列:

ALTER TABLE Vendors
DROP COLUMN vend_phone;

2 插入数据(INSERT)

2.1 数据插入

INSERT用来将行插入(或添加)到数据库表。

插入有几种方式:

  1. 插入完整的行。
  2. 插入行的一部分。
  3. 插入某些查询的结果。

2.2 插入完整的行

INSERT指定表名和插入到新行中的值。

INSERT INTO Customers
VALUES('1000000006','Toy Land','123 Any Street',
       'New York','NY','11111','USA',NULL,NULL);

插入数据时,各列必须以它们在表定义中出现的次序填充。

上面的SQL语句高度依赖于表中列的定义次序,还依赖于其容易获得的次序信息。即使可以得到这种次序信息,也不能保证各列在下一次表结构变动后保持完全相同的次序。因此,编写依赖于特定列次序的SQL语句是很不安全的。

实际上,在插入数据的时候,最好给出填充列的顺序。

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

注意:不管使用哪种INSERT语法,VALUES的数目都必须正确。


2.3 插入部分行

插入部分行,表示可以只给某些列提供值,其他列不提供值。

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

省略的列必须满足以下某个条件:

  1. 该列定义为允许NULL值(无值或空值)。
  2. 在表定义中给出默认值。这表示如果不给出值,将使用默认值。

2.4 插入检索出的数据

INSERT可以将SELECT语句的查询结果插入表中,这就是所谓的INSERT SELECT。它由一条INSERT语句和一条SELECT语句组成。

假如想把另一个表中的顾客列合并到Customers表中。

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

INSERT SELECT中SELECT语句可以包含WHERE子句,以过滤插入的数据。

INSERT通常只插入一行,需要插入多行,必须执行多个INSERT语句。INSERT SELECT是个例外,它可以用一条INSERT插入多行,不管SELECT语句返回多少行,都将被INSERT插入。


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

有一种数据插入不使用INSERT语句。要将一个表的内容复制到一个全新的表(运行中创建的表),可以使用SELECT INTO语句。

MariaDB、MySQL、Oracle、PostgreSQL和SQLite的语法如下:

CREATE TABLE CustCopy AS SELECT * FROM Customers;

在使用SELECT INTO时,需要知道的事情:

  1. 任何SELECT选项和子句都可以使用,包括WHERE和GROUP BY。
  2. 可利用联结从多个表插入数据。
  3. 不管从多少个表中检索数据,数据都只能插入到一个表中。

3 更新和删除数据(UPDATE、DELETE)

3.1 更新数据UPDATE

两种使用UPDATE的方式:

  1. 更新表中的特定行。
  2. 更新表中的所有行。

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

  • 要更新的表。
  • 列名和它们的新值。
  • 确定要更新哪些行的过滤条件。
UPDATE 表名
SET key1 = value1, key2 = value2
WHERE  满足条件、过滤条件

顾客ID为1000000005现在有了Email,需要更新他的记录。

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

更新多个列:

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

要删除某个列的值,可设置它为NULL(加入表定义允许NULL值)。

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

注意:UPDATE语句也可使用子查询,使得能用SELECT语句检索出的数据更新列数据。


3.2 删除数据DELETE

两种使用DELETE的方式:

  1. 从表中删除特定的行。
  2. 从表中删除所有行。

基本的DELETE语句由两部分组成:

  • 要删除的表。
  • 确定要删除哪些行的过滤条件。
DELETE FROM 表名
WHERE  满足条件、过滤条件
DELETE FROM Customers
WHERE cust_id = '1000000006';

DELETE不需要列名或通配符,删除的是整行而不是删除列。要删除指定的列,可以使用UPDATE语句。

DELETE语句从表中删除行,甚至是删除表中的所有行,但是,DELETE不删除表本身。

如果想从表中删除所有行,不要使用DELETE。可使用TRUNCATE TABLE语句,它完成相同的工作,而速度更快(因为不记录数据的变动)。


3.3 使用UPDATE和DELETE的指导原则

  1. 除非确实打算更新和删除每一行,否则绝对不要使用不带WHERE子句的UPDATE或DELETE语句。
  2. 在UPDATE或DELETE语句使用WHERE子句前,应该先用SELETE进行测试,保证它过滤的是正确的记录,以防编写的WHERE子句不正确。
  3. 增加DBMS更新和删除数据库的权限,防止执行不带WHERE子句的UPDATE或DELETE语句。

如果您发现文中有不清楚或者有问题的地方,请在下方评论区留言,我会根据您的评论,更新文中相关内容,谢谢!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容