第十七章 组合查询
组合查询
有两种基本情况,其中需要使用组合查询:
- 在单个查询中从不同的表返回类似结构的数据;
- 对单个表执行多个查询,按单个查询返回数据。
创建组合查询
需要价格小于等于5的所有物品的一个列表,而且还想包括供应商1001和1002生产的所有物品(不考虑价格)。
SELECT prod_id,prod_name,vend_id
FROM products
WHERE prod_price <= 5
UNION
SELECT prod_id,prod_name,vend_id
FROM products
WHERE vend_id IN (1001,1002);
UNION规则
- UNION必须由两条或两条以上的SELECT语句组成,语句之间用关键字UNION分隔(因此,如果组合4条SELECT语句,将要使用3个UNION关键字)。
- UNION中的每个查询必须包含相同的列、表达式或聚集函数(不过分析各个列不需要以相同的次序列出)。
- 列数据类型必须兼容:类型不必完全相同,但必须是DBMS可以隐含地转换的类型(例如,不同的数值类型或不同的日期类型)。
- UNION从查询结果集中自动去除了重复的行使用UNION ALL可保留重复行
SELECT prod_id,prod_name,vend_id
FROM products
WHERE prod_price <= 5
UNION ALL
SELECT prod_id,prod_name,vend_id
FROM products
WHERE vend_id IN (1001,1002);
对组合查询结果排序
SELECT语句的输出用ORDER BY子句排序。在用UNION组合查询时,只能使用一条ORDER BY子句,它必须出现在最后一条SELECT语句之后。
SELECT prod_id,prod_name,vend_id
FROM products
WHERE prod_price <= 5
UNION ALL
SELECT prod_id,prod_name,vend_id
FROM products
WHERE vend_id IN (1001,1002)
ORDER BY vend_id,prod_name
第十八章 全文本搜索
略
第十九章 插入数据
数据插入
- INSERT是用来插入(或添加)行到数据库表的。插入可以用几种方式使用:
1 插入完整的行;
2 插入行的一部分;
3 插入多行;
4 插入某些查询的结果。
插入完整的行
INSERT INTO customers(cust_name,cust_address,cust_state,cust_zip,cust_country,cust_email)
VALUES('Pep','100 fvmdofv','Los skvmdv','CA','90046','USA')
-
省略列 如果表的定义允许,则可以在INSERT操作中省略某些列。省略的列必须满足以下某个条件。
1该列定义为允许NULL值(无值或空值)。
2在表定义中给出默认值。这表示如果不给出值,将使用默认值 -
如果数据检索是最重要的(通常是这样),则你可以通过在INSERT和INTO之间添加关键字LOW_PRIORITY,指示MySQL降低INSERT语句的优先级,如下所示:
INSERT LOW_PRIORITY INTO
顺便说一下,这也适用于下一章介绍的UPDATE和DELETE语句。
插入多行
INSERT INTO customers(cust_name,cust_address,cust_state,cust_zip,cust_country,cust_email)
VALUES('Pqew','101 fvmdofv','Lo','CA','90056','USA'),
('Aoo','200 sovsvdm','Mi','AC','11213','USA');
插入检索出的数据
INSERT INTO customers(cust_id,cust_contact,cust_address,cust_state,cust_zip,cust_country,cust_email)
SELECT cust_id,cust_contact,cust_address,cust_state,cust_zip,cust_country,cust_email
FROM custnew;
第二十章 更新和删除数据
更新数据
- 为了更新(修改)表中的数据,可使用UPDATE语句。可采用两种方式使用UPDATE:
1更新表中特定行;
2更新表中所有行。 - UPDATE语句由3部分组成,分别是:
1要更新的表;
2列名和它们的新值;
3确定要更新行的过滤条件
UPDATE customers
SET cust_email = '111222@com'
WHERE cust_id = '10005';
- IGNORE关键字 如果用UPDATE语句更新多行,并且在更新这些行中的一行或多行时出一个现错误,则整个UPDATE操作被取消(错误发生前更新的所有行被恢复到它们原来的值)。为即使是发生错误,也继续进行更新,可使用IGNORE关键字,如下所示:
UPDATE IGNORE customers
删除数据
- 为了从一个表中删除(去掉)数据,使用DELETE语句。可以两种方式使用DELETE:
1 从表中删除特定的行;
2 从表中删除所有行。 - 删除表的内容而不是表 DELETE语句从表中删除行,甚至是删除表中所有行。但是, DELETE不删除表本身。
- 更快的删除 如果想从表中删除所有行,不要使用DELETE。可使用TRUNCATE TABLE语句,它完成相同的工作,但速度更快( TRUNCATE实际是删除原来的表并重新创建一个表,而不是逐行删除表中的数据)。
- 下面是许多SQL程序员使用UPDATE或DELETE时所遵循的习惯。
除非确实打算更新和删除每一行,否则绝对不要使用不带WHERE子句的UPDATE或DELETE语句。
保证每个表都有主键,尽可能像WHERE子句那样使用它(可以指定各主键、多个值或值的范围)。
在对UPDATE或DELETE语句使用WHERE子句前,应该先用SELECT进行测试,保证它过滤的是正确的记录,以防编写的WHERE子句不正确。
使用强制实施引用完整性的数据库(关于这个内容,请参阅第15章),这样MySQL将不允许删除具有与其他表相关联的数据的行
DELETE FROM customers
WHERE cust_id = '10006';
第二十一章 创建和操纵表
创建表
- 一般有两种创建表的方法:
使用具有交互式创建和管理表的工具(如第2章讨论的工具);
表也可以直接用MySQL语句操纵。
表创建基础 - 为利用CREATE TABLE创建表,必须给出下列信息:
新表的名字,在关键字CREATE TABLE之后给出;
表列的名字和定义,用逗号分隔。
CREATE TABLE customs(
cust_id int NOT NULL AUTO_INCREMENT,
cust_name char(20) NOT NULL,
cust_zip char(20) NULL,
PRIMARY KEY (cust_id)
) ENGINE=INNODB;
- 确定AUTO_INCREMENT值 让MySQL生成(通过自动增量)主键的一个缺点是你不知道这些值都是谁。使用last_insert_id()函数获得这个值,如下所示:
SELECT last_insert_id()
此语句返回最后一个AUTO_INCREMENT值,然后可以将它用于后续的MySQL语句 - 以下是几个需要知道的引擎:
InnoDB是一个可靠的事务处理引擎(参见第26章),它不支持全文本搜索;
MEMORY在功能等同于MyISAM, 但由于数据存储在内存(不是磁盘)中,速度很快(特别适合于临时表);
MyISAM是一个性能极高的引擎,它支持全文本搜索(参见第18章),但不支持事务处理。
更新表
这条语句给vendors表增加一个名为vend_phone的列,必须明确其数据类型
ALTER TABLE vendors
ADD vend_phone CHAR(20);
删除刚刚添加的列,可以这样做:
ALTER TABLE vendors
DROP COLUMN vend_phone;
定义外键
ALTER table 表名 add constraint FK_ID foreign key(外键字段名) references 外表表名(主键字段名)
删除表
DROP TABLE 表名;
重命名表
RENAME TABLE 原表名 TO 表名;