SQL快速入门 ( MySQL快速入门, MySQL参考, MySQL快速回(2)

CREATE TABLE newProducts ( 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 );

NOT NULL 非空约束,不允许列中有NULL值下面介绍其他约束。
列的设置可以加上默认值,如NOT NULL后边接 DEFAULT CURRENT_DATE() ,默认值为当前日期。(每个数据库获取当前日期语句不同。)后面接 PRIMARY KEY 即设置改列为主键。后面接 AUTO_INCREMENT 即设置为自增,只有int型可以设置。

约束:每个列可以有一种或几种约束。

NOT NULL 非空约束.

UNIQUE 唯一约束,可唯一标识数据库表中的每条记录。

PRIMARY KEY 主键约束,唯一标识数据库表中的每条记录,唯一且非空。

FOREIGN KEY 外键约束,一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY。

CHECK 检查约束,用于限制列中的值的范围。

DEFAULT 默认约束,用于向列中插入默认值每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。
每种约束可以创建表时设置好,也可以后期增删.

索引:在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。

CREATE INDEX 索引名 ON Person (列名[,列名])

复制表或表中部分列:

CREATE TABLE CustCopy AS SELECT * FROM Customers;

创建Customers表的复制,CustCopy。

修改表:

ALTER TABLE Vendors ADD vend_phone CHAR(20); ALTER TABLE Vendors DROP COLUMN vend_phone;

各数据库有不兼容现象,复杂表操作列可能要新建表删除旧表。
ALTER 还可以用来添加删除约束,删除索引等。

删除表: DROP TABLE CustCopy;

重命名表: RENAME Table oldTable TO newTable;

插入数据

插入整行或部分行:

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

插入整行时,可省略 Customers 括号内的内容,即按照列的顺序,分别插入数据(不推荐)。省略 Customers 括号内的内容时,无内容的列必须用NULL占位。
插入部分行时,把要插入的列填入 Customers 括号内,与VALUES内容一一对应,没有提到的列默认NULL或其他默认值。

插入查询到的值:

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_city, cust_state, cust_zip, cust_country FROM CustNew;

把从CustNew表中查到的内容插入 Customers表中。一次插入多行的方式。

更新和删除数据:

更新数据:

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

步骤为,要更新的表,要更新的列,要更新的行。一个SET可以跟多个列用逗号隔开。
删除某个值,即设置他为NULL。

删除数据:

DELETE FROM Customers WHERE cust_id = '1000000008';

删除表中指定整行,删除部分列用UPDATE
在UPDATE或DELETE语句使用WHERE子句前,应该先用SELECT进行测试,保证它过滤的是正确的记录,以防编写的WHERE子句不正确。如果不写WHERE会更新或删除所有行内容。

子查询-迭代查询

一种形式:

SELECT cust_name, cust_contact FROM Customers WHERE cust_id IN (SELECT cust_id FROM Orders WHERE order_num IN (SELECT order_num FROM OrderItems WHERE prod_id = 'RGAN01'));

先从第二个括号选择符合条件的order_num,成为第二个括号内容,再向上找到第一个括号,查到符合条件的cust_id返回给第一个括号,最后根据第一个括号内容执行主查询语句。性能问题不要嵌套太多层。
也就是对Customers表的查询要用到Orders表查询后返回的内容,对Orders表的查询要用到OrderItems表查询后返回的内容。

另一种形式:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/608365df94e829b5409921f5b778aa54.html