Skip to content

Latest commit

 

History

History
executable file
·
182 lines (152 loc) · 3.87 KB

82.09、SQL 修改数据.adoc

File metadata and controls

executable file
·
182 lines (152 loc) · 3.87 KB

SQL 修改数据

INSERT 语句

向已有的表中插入新行

INSERT INTO <表名> (<1>[, <2> ...])
VALUES
    (<11>[, <12> ...]),
    [(<21>, <12> ...),]
    ...
Note

在使用 INSERT 语句插入新行时,不要求必须输入该行所有列的数据,
但一个语句中,给出的每行的数据的列要与语句中指定的列匹配

INSERT 基本语法
/*
创建一个表,并向其中写入两行数据
*/

CREATE TABLE mytable (
    id INTEGER PRIMARY KEY,
    name TEXT,
    'phone number' INTEGER,
    address TEXT
);

-- 如上说所,向表中插入新行不需要指定所有的字段
-- 比如这里就忽略了电话号码和地址,在插入行时,SQLite 会自动填充 NULL 到未指定的列中
INSERT INTO mytable (id, name)
VALUES
    (1, 'alice'),
    (2, 'bob');

若要以全默认值插入一行,可以这样写

INSERT INTO <表名> DEFAULT VALUE;

INSERT 可以与 SELECT 连用,这样就可以把查询到的数据插入另一个表中

-- 注意,若 SELECT 的键名刚好与 INSERT 的列名相同,
-- 那么 INSERT INTO 可以不写列名
INSERT INTO <要修改的表> (<列名1><列名2>)
SELECT ...
INSERT 与 SELECT 连用
/*
创建一个 mytable 的备份表
*/

-- 创建备份表
CREATE TABLE mytable_bk (
    id INTEGER PRIMARY KEY,
    name TEXT,
    'phone number' INTEGER,
    address TEXT
);

-- 把 mytable 的数据完全导入至 mytable_bk 中
-- 由于 mytable 的列名与 mytable_bk 的完全相同,
-- 这里忽略了 INSERT INTO 后面的列名
INSERT INTO mytable_bk
SELECT * FROM mytable;

UPDATE 语法

更新一个表中的行

UPDATE 基础语法
/*
注意,仅使用 UPDATE 会修改整个表中所有行对应的数据
*/

UPDATE <表名>
SET
    <1> = <新值1>,
    [<2> = <新值2>,]
    ...;

由于上面的语法会修改整个表指定的列的所有的数据,
因此单纯使用 UPDATE 几乎是没有什么用的,
一般来说,UPDATE 至少会搭配 WHERE 来使用

UPDATE <表名1>
SET
    <1> = <新值1>,
    [<2> = <新值2>,]
    ...
WHERE
    <行筛选条件>;
修改单列信息
-- 修改雇员表中 employeeid 为 3 的行的 lastname 修改为 'Smith'
UPDATE employees
SET lastname = 'Smith'
WHERE employeeid = 3;
修改多列信息
-- 更新雇员表中 employeeid 为 4 的行的地址信息
UPDATE employees
SET
    city = 'Toronto',
    state = 'ON',
    postalcode = 'M5P 2N7'
WHERE
    employeeid = 4;
在修改中使用变量
-- 将所有员工的邮件地址设置为全名的形式
-- 下方 SET 语句中,虽然我们仅指出了列名,
-- 但是实际上 SQLite 会自动为每一行替换对应的内容
UPDATE employees
SET email = LOWER(
    firstname || "." || lastname || "@chinookcorp.com"
)

DELETE 语法

DELETE FROM <1>
WHERE <搜索条件>;

REPLACE 语法

REPLACE 其实是 INSERT 的一个变种,REPLACE 的全称应该为 INSERT OR REPLACE
所以 REPLACE 应该满足 INSERT 的语法。与 INSERT 的不同的地方在于:
若 REPLACE 的列具有 UNIQUEPRIMARY KEY 约束,且新的数据的该列与旧数据的该列相同, 则移除旧行,再插入新行(REPLACE 的语义是如此)。

特别注意的是,若新的数据不满足约束,那么不会插入新行,而删除旧行的操作也会回滚。

CREATE TABLE IF NOT EXIST positions(
    id INTERGER PRIMARY KEY, -- 注意这里的 PRIMARY KEY 约束
    title TEXT NOT NULL UNIQUE, -- 以及这里的 UNIQUE 约束
    min_salary NUMERIC
);

INSERT INTO positions
    (title, min_salary)
VALUES
    ('DBA', 120000),
    ('Developer', 100000),
    ('Architect', 150000);