MySQL必知必会——代码2

两种基本情况需要使用组合查询:
1.在单个查询中从不同的表返回类似结构的数据;
2.对单个表执行多个查询,按单个查询返回数据。
创建组合查询
SELECT vend_id, prod_id, prod_price
FROM products
WHERE prod_price <= 5
UNION
SELECT vend_id, prod_id, prod_price
FROM products
WHERE vend_id IN (1002,1001) ;

UNION规则
1.UNION 必须由两条或两条以上的 SELECT 语句组成,语句之间用关键字 UNION 分隔
2.UNION 中的每个查询必须包含相同的列、表达式或聚集函数
3.列数据类型必须兼容:类型不必完全相同,但必须是DBMS可以隐含地转换的类型

SELECT 语句的输出用 ORDER BY 子句排序。
在用 UNION 组合查询时,只能使用一条 ORDER BY 子句且必须出现在最后一条 SELECT 语句之后。
SELECT vend_id, prod_id, prod_price
FROM products
WHERE prod_price <= 5
UNION
SELECT vend_id, prod_id, prod_price
FROM products
WHERE vend_id IN (1002,1001)
ORDER BY vend_id, prod_price ;

进行全文本搜索:
Match() 说明 :传递给 Match() 的值必须与FULLTEXT() 定义中的相同。
如果指定多个列,则必须列出它们(而且次序正确)。
搜索不区分大小写,除非使用 BINARY 方式
SELECT note_text
FROM productnotes
WHERE MATCH(note_text) AGAINST(‘rabbit’) ;
SELECT note_text
FROM productnotes
WHERE note_text LIKE ‘%rabbit%’ ;

全文本搜索的一个重要部分就是对结果排序。具有较高等级的行先返回
SELECT note_text,
MATCH(note_text ) AGAINST (‘rabbit’) AS ranks
FROM productnotes

查询扩展:
SELECT note_text
FROM productnotes
WHERE MATCH(note_text) AGAINST(‘anvils’ WITH QUERY EXPANSION) ;

布尔文本搜索
指示MySQL排除包含 rope*
SELECT note_text
FROM productnotes
WHERE MATCH(note_text) AGAINST(‘heavy -rope*’ IN BOOLEAN MODE)

全文本布尔操作符
+  包含,词必须存在
-  排除,词必须不出现
>  包含,而且增加等级值
<  包含,且减少等级值把词组成子表达式(允许这些子表达式作为一个组被包含、排除、排列等)
~ 取消一个词的排序值
* 词尾的通配符
"" 定义一个短语(与单个词的列表不一样,它匹配整个短语以便包含或排除这个短语)

全文本搜索的使用说明
1.在索引全文本数据时,短词被忽略且从索引中排除。短词定义为那些具有3个或3个以下字符的词
2. MySQL带有一个内建的非用词(stopword)列表,这些词在索引全文本数据时总是被忽略。如果需要,可以覆盖这个列表
3.许多词出现的频率很高,搜索它们没有用处(返回太多的结果)。因此,MySQL规定了一条50%规则,如果一个词出现在50%以上的行中,则将它作为一个非用词忽略。50%规则不用于 IN BOOLEANMODE 。
4.如果表中的行数少于3行,则全文本搜索不返回结果(因为每个词或者不出现,或者至少出现在50%的行中)。
5.忽略词中的单引号。例如, don’t 索引为 dont ’
6.不具有词分隔符(包括日语和汉语)的语言不能恰当地返回全文本搜索结果。
7.如前所述,仅在 MyISAM 数据库引擎中支持全文本搜索

数据插入
INSERT INTO customers(cust_name,cust_address,cust_city,cust_state,
cust_zip,cust_country,cust_contact,cust_email)
VALUES(‘Pep E. LaPew’, ‘100 Main Street’, ‘Los Angeles’,
‘CA’, ‘90046’, ‘USA’,NULL,NULL) ;

省略列:省略的列必须满足以下某个条件。
1.该列定义为允许 NULL 值(无值或空值)
2.在表定义中给出默认值。这表示如果不给出值,将使用默认值

MySQL用单条 INSERT 语句处理多个插入比使用多条 INSERT语句快
INSERT INTO customers(cust_name,cust_city)
VALUES(‘LiLee’,‘China’),(‘MOnkey’,‘US’) ;

INSERT SELECT 插入检索出的数据
不一定要求列名匹配
INSERT INTO customers(cust_name,cust_city)
SELECT prod_name, vend_id
FROM products

基本上UPDATE由三部分组成,分别是:
1.要更新的表
2.列名和新值
3.确定要更新的过滤条件

UPDATE customers
SET cust_email = ‘@qq.com’,
cust_name = ‘LiMing’
WHERE cust_id = 10005 ;

如果用 UPDATE 语句更新多行,并且在更新这些行中的一行或多行时出一个现错误,则整个 UPDATE 操作被取消
可以使用关键字IGNORE,即使发生错误,也继续更新
UPDATE IGNORE customers…

删除某个列的值,可将它设置为NULL
UPDATE customers
SET cust_email = NULL,
cust_name = ‘LiMing’
WHERE cust_id = 10005 ;

DELETE 语句:从表中删除特定的行;从表中删除所有行
DELETE FROM customers
WHERE cust_id = 10006 ;

UPDATE 或 DELETE 应遵循的习惯
1.除非确实打算更新和删除每一行,否则绝对不要使用不带 WHERE子句的 UPDATE 或 DELETE 语句
2.保证每个表都有主键,尽可能像 WHERE 子句那样使用它
3.在对 UPDATE 或 DELETE 语句使用 WHERE 子句前,应该先用 SELECT 进行测试,保证它过滤的是正确的记录,以防编写的 WHERE 子句不正确
4.使用强制实施引用完整性的数据库,这样MySQL将不允许删除具有与其他表相关联的数据的行

表创建基础
CREATE TABLE cust
(
cust_id int NOT NULL AUTO_INCREMENT,
cust_name char(50) NULL,
PRIMARY KEY (cust_id)
)ENGINE = INNODB ;
如果想在一个表不存在时创建它,应该在表名后给出 IF NOT EXISTS

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值