第 15 课 插入数据
INSERT 用来将行插入(或添加)到数据库表。
插入完整的行
INSERT INTO Customers
VALUES('1000000006','Toy Land','123 Any Street',
'New York','NY','11111','USA',NULL,NULL);
每一列的数据在 VALUES 子句中给出,必须给每一列提供一个值。如果某列没有值,则应该使用 NULL 值。
上述语句是依赖于特定列次序。
一下是编写 INSERT 语句的更安全(不过更烦琐)的方法:
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);
即表名后的括号里明确给出了列名。
插入部分行
明确给出表的列名,省略某些列,这表示可以只给某些列提供值,给其他列不提供值。
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 值(无值或空值)。
在表定义中给出默认值。这表示如果不给出值,将使用默认值。
插入检索出的数据
由一条 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语句但不一定要求列名匹配。DBMS 使用的是SELECT列的位置,因此 SELECT 中的第一列(不管其列名)将用来填充表列中指定的第一列。
从一个表复制到另一个表
将一个表的内容复制到一个全新的表(运行中创建的表),可以使用 SELECT INTO 语句。DB2 不支持这里描述的 SELECT INTO。
MariaDB、 MySQL、 Oracle、 PostgreSQL 和 SQLite中:
CREATE TABLE CustCopy AS
SELECT * FROM Customers;
创建一个名为 CustCopy 的新表,并把 Customers 表的整个内容复制到新表中。(其他语法:SELECT * INTO CustCopy FROM Customers;)。要想只复制部分的列,可以明确给出列名,而不是使用*通配符。
注意:
任何 SELECT 选项和子句都可以使用,包括 WHERE 和 GROUP BY;
可利用联结从多个表插入数据;
不管从多少个表中检索数据,数据都只能插入到一个表中
第 16 课 更新和删除数据
更新数据
UPDATE Customers
SET cust_contact = 'Sam Roberts',
cust_email = 'sam@toyland.com'
WHERE cust_id = '1000000006';
删除数据
DELETE FROM Customers
WHERE cust_id = '1000000006';
DELETE 删除整行而不是删除列。要删除指定的列,请使用 UPDATE 语句(即设置为空)
删除所有行可使用 TRUNCATE TABLE
在 UPDATE 或 DELETE 语句使用 WHERE 子句前,应该先用 SELECT 进行测试,保证它过滤的是正确的记录,以防编写的 WHERE 子句不正确。
第 17 课 创建和操纵表
创建表
CREATE TABLE Products
(prod_id CHAR(10) NOT NULL,
vend_id CHAR(10) NOT NULL,
prod_name CHAR(254) NOT NULL,
prod_price DECIMAL(8,2) NOT NULL,
prod_desc VARCHAR(1000) NULL);
MySQL、 Oracle、PostgreSQL、SQL Server 和 SQLite中有效
对于 DB2,必须从最后一列中去掉 NULL
在创建新的表时,指定的表名必须不存在,否则会出错。防止意外覆盖已有的表, SQL 要求首先手工删除该表,然后再重建它,而不是简单地用创建表语句覆盖它。
指定默认值:关键字 DEFAULT 指定,quantity INTEGER NOT NULL DEFAULT 1,
CREATE TABLE OrderItems
(order_num INTEGER NOT NULL,
order_item INTEGER NOT NULL,
prod_id CHAR(10) NOT NULL,
quantity INTEGER NOT NULL DEFAULT 1,
item_price DECIMAL(8,2) NOT NULL);
默认值经常用于日期或时间戳列,通常将系统日期用作默认日期。
更新表
更新表定义,可以使用 ALTER TABLE 语句。
增加一个列:
ALTER TABLE Vendors
ADD vend_phone CHAR(20);
删除列:
ALTER TABLE Vendors
DROP COLUMN vend_phone;
添加主键约束
ALTER TABLE products
add [constraint PK_stuNo] primary key(prod_id)
删除主键约束:
ALTER TABLE products
drop primary key;
添加外键:
主表:
create table vend(
vend_id int auto_increment primary key,
vend_price int DEFAULT 22,
vend_name char(10) unique,
vend_a int ZEROFILL)
从表
CREATE TABLE Products
(prod_id int(10) NOT NULL,
vend_id int(10) NOT NULL,
prod_name CHAR(254) NOT NULL,
prod_price DECIMAL(8,2) NOT NULL,
prod_desc VARCHAR(1000) NULL,
CONSTRAINT pd_ve_ID FOREIGN KEY(vend_id) REFERENCES vend(vend_id)
);
或直接:
ALTER table products
add CONSTRAINT pd_ve_ID FOREIGN KEY(vend_id) REFERENCES vend(vend_id)
删除外键:
ALTER table products
drop FOREIGN key pd_ve_ID
禁用外键约束SET FOREIGN_KEY_CHECKS = 0;
启用外键约束SET FOREIGN_KEY_CHECKS = 1;
外键中的级联关系:
ON DELETE CASCADE 删除主表中的数据时,从表中的数据随之删除
ON UPDATE CASCADE 更新主表中的数据时,从表中的数据随之更新
ON DELETE SET NULL 删除主表中的数据时,从表中的数据置为空
默认 删除主表中的数据前需先删除从表中的数据,否则主表数据不会被删除
用法
ALTER table products
add CONSTRAINT pd_ve_ID FOREIGN KEY(vend_id) REFERENCES vend(vend_id)
ON DELETE CASCADE
约束:
ALTER TABLE products
add constraint UQ_stuID unique(prod_id)
删除唯一约束:
ALTER TABLE products
drop index UQ_stuID
或 drop index UQ_stuID on products
实际就是删除索引
添加自增:(一般是主键)
alter table products
change prod_id prod_id int NOT NULL AUTO_INCREMENT [PRIMARY key]
删除自增:
alter table products MODIFY prod_id INT(10);
添加默认约束:
alter table products MODIFY vend_id INT(10) DEFAULT 2;
删除默认约束:
ALTER TABLE products MODIFY vend_id INT(10);
添加零填充:
ALTER TABLE products MODIFY vend_id INT(10) ZEROFILL;
删除零填充:
ALTER TABLE products MODIFY vend_id INT(10) ;
查表的key结构:show keys from products;
显示表结构:desc products;
删除表
DROP TABLE CustCopy;
#永久删除该表
先判断再删除(判断表是否存在,存在则删除)drop table if exists products
重命名表
ALTER TABLE products RENAME pr;
DB2、 MariaDB、 MySQL、 Oracle 和 PostgreSQL 使用 RENAME语句
SQL Server 使用 sp_rename 存储过程
SQLite 用户使用 ALTER TABLE 语句
《sql必知必会》------day6
《sql必知必会》------day5
《sql必知必会》------day4
《sql必知必会》------day3
《sql必知必会》------day2
《sql必知必会》------day1