MariaDB 入门笔记(三)

213 阅读2分钟

联合查询

许多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;