联合查询
许多SQL查询包含从一个或多个表中返回数据的单一SELECT语句,MariaDB还允许你执行多个查询(即多个SELECT语句)并且将结果作为一个单一查询结果集返回。这种组合查询就是所谓的联合或者复合查询(compound query)。
需要用到的情形:
- 在一个单一查询中,从多个不同的表中返回类似结构化的数据。
- 对单个表执行多个查询,查询数据作为一个查询结果返回。
联合查询与多个WHERE条件:在大多数情况下,对同一个表进行两次查询的联合与使用多个WHERE子句的单一查询完成同样的功能。换句话说,任何带多个WHERE 子句的 SELECT 语句可以被转换为联合查询。
UNION
指定 SELECT 语句并且在它们之间放置UNION。
# 不会删除重复项
SELECT vend_id, prod_id, prod_price
FROM products
WHERE prod_price <= 5
UNION ALL
SELECT vend_id, prod_id, prod_price
FROM products
WHERE vend_id IN(1001,1002);
全文本搜索
一般来说,当一个表被创建时全文本搜索是开启的。CREATE TABLE 语句中接受FULLTEXT子句,这是一个以逗号隔开的要索引的列的列表。
# note_text 通过 FULLTEXT 建立索引,以用于全文本搜索。这里FULLTEXT是对一列建立索引,如果需要也可以指定多列
CREATE TABLE productnotes
(
note_id int NOT NULL AUTO_INCREMENT,
prod_id char(10) NOT NULL,
note_date datetime NOT NULL,
note_text text NULL,
PRIMARY KEY(note_id),
FULLTEXT(note_text)
)ENGINE=Maria;
更新索引需要时间,如果你正将数据导入新创建的表中,这时不应该使用 FULLTEXT 建立索引,而应该先导入所有的数据,接着通过修改表的方式来定义 FULLTEXT。这会使数据导入更快。
执行全文本搜索
建立索引后,使用两个函数进行全文本搜索: Match() 指定需要搜索的列,Against() 指定需要使用的搜索表达式。
SELECT note_text
FROM productnotes
WHERE Match(note_text) Against('rabbit')
数据插入
# cust_id 可以不用指定值或者指定为 NULL,数据库会自动跳过 NULL 值
INSERT INTO customers(cust_name,
cust_address,
cust_state)
VALUES('Pep E. LaPew',
'100 Main Street',
'Los Angles' );
注意:需要指定列名,避免因为列顺序改变引起错误,多列插入用逗号隔开。
插入检索到的数据
INSERT 语句的另一种形式是将SELECT语句查询的结果插入表中。这就是所谓的INSERT SELECT,并且,它是由一个 INSERT 语句和一个 SELECT 语句构成。
# 将 custnew 中的数据查找出并插入 customers 表
INSERT INTO customers(cust_id, cust_contact)
SELECT cust_id,
cust_contact
FROM custnew
更新表
UPDATE 语句基本格式:
- 需要更新的表
- 列名以及它们的新值
- 决定哪些行需要更新大的过滤条件
UPDATE customers
SET cust_email = 'elmer@fudd.com'
WHERE cust_id = 10005;
删除表
DELETE FROM customers
WHERE cust_id = 10006;