SELECT
DISTINCT:应用于所有列而不仅是前置它的列。列出的元组的属性只要有一个不同都要列出来。
SELECT DISTINCT id,name FROM table;
LIMIT:限制返回的最大行值。LIMIT 5—返回不多于5行。LIMIT 5,5—从行5开始的5行,第一个数为开始位置,第二个数为要检索的行数
SELECT DISTINCT vend_id FROM products LIMIT 5,5;
子句:sql语句由子句构成。一个子句通常由一个关键字和所提供的数据组成。
排序检索数据:
ORDER BY:按字母顺序排序数据。通常ORDER BY子句中使用的列将是为显示所选择的列。但实际上并不一定要这样,用非检索的列排序数据时完全合法的。按多个列排序:只要指定列名,列名之间用逗号分开即可。
DESC:按降序排序,DESC只应用到直接位于其前面的列名。如果想在多个列上进行降序排序,必须对每个列指定DESC关键字
ASC:升序(默认)
SELECT prod_price FROM products ORDER BY prod_price DESC LIMIT 1;
过滤数据:WHEREWHERE和ORDER BY同时出现时,ORDER BY位于WHERE后面
操作符:用来联结或改变WHERE子句中子句的关键字。
AND,OR,AND的优先级大于OR,使用圆括号。
IN:用来指定条件范围,范围中的每个条件都可以进行匹配,由逗号分隔,IN完成与OR相同的功能
NOT:否定它之后所跟的任何条件
通配符:用来匹配值的一部分的特殊字符。在搜索子句中使用通配符,必须使用LIKE操作符。
%:表示匹配任何字符出现任意次数(也能匹配0个字符),但不能匹配NULL;
_(下划线):匹配任意字符,但只匹配单个字符。
正则表达式:REGEXPmysql中的正则表达式匹配不区分大小写,为区分大小写,用BINARY关键字, REGEXP BINARY
.:匹配任意一个字符
|:匹配其中之一
[]:匹配特定字符[]中的一个字符,[123],[^123]表示匹配除这些字符外的任何字符,[1-9]、[a-z]表示范围
为了匹配特殊字符,必须用\\为前导,转义。
元字符:具有特殊含义的字符。
\\f:换页
\\n:换行
\\r:回车
\\t:制表
\\v:纵向制表
例:REGEXP '\\([0-9] sticks?\\)'. \\(匹配(,[0-9]匹配任意数字,sticks匹配stick和sticks(s后的?使s可选,因为?匹配它前面的任意字符的0次或1次出现,\\)匹配))
HAVING支持所有WHERE操作符,WHERE过滤行,HAVING过滤分组。WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。WHERE排除的行不包括在分组中。^:在集合中[]用它来否定该集合,否则,用来指串的开始处
LIKE匹配整个串,REGEXP匹配子串。利用定位符,通过用^开始每个表达式,用&结束每个表达式,可以使REGEXP的作用与LIKE一样
计算字段、拼接字段:使用Concat()函数拼接。使用RTrim()函数删除数据右侧多余的空格,LTrim()去掉左边的空格,Trim()去掉左右两边的空格
别名AS:一个字段或值的替换名。
SELECT Concat(RTrim(vend_name),'(',RTrim(vend_country),')') AS vend_title FROM vendors ORDER BY vend_name;
AS vend_title指示SQL创建一个包含指定计算的名为vend_title的计算字段,任何客户机应用都可以按名引用这个列
SELECT prod_id,quantity,item_price,quantity*itme_price AS expanded_price FROM orderitems WHERE order_num=20005;
汇总数据:聚集函数:运行在行组上,计算和返回单个值的函数
分组数据:分组是在SELECT语句的GROUP BY子句中建立的使用WITH ROLLUP关键字,得到每个分组以及每个分组汇总级别(针对每个分组)的值
SELECT cust_name,cust_contact
SELECT vend_id,COUNT(*) AS num_prods FROM products WHERE prod_price >= 10 GROUP BY vend_id HAVING COUNT(*) >= 2;
子查询:嵌套在其他查询中的查询。
FROM customers
WHERE cust_id IN(SELECT cust_id
FROM orders
WHERE order_num IN (SELECT order_num
FROM orderitems
WHERE prod_id='TNT2'));
SELECT cust_name,
cust_state,
(SELECT COUNT(*) FROM orders WHERE orders.cust_id = customers.cust_id) AS orders
FROM customers
ORDER BY cust_name;
相关子查询:设计外部查询的子查询。只要列名可能有多义性,就使用(表名和列名由一个句点分隔)
联结
在一条SELECT语句中联结几个表时,相应的关系是在运行中构造的。在联结两个表时,实际上做的是将第一个表中的每一行与第二个表中的每一行配对。WHERE子句作为过滤条件,它只包含哪些匹配给定条件(这里的联结条件)的行。应该保证所有联结都有WHERE子句
笛卡儿积:没有联结条件(WHERE子句)的表关系返回的结果为笛卡儿积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数
等值联结
SELECT vend_name,prod_name,prod_price
FROM vendors,products
WHERE vendors.vend_id = products.vend_id
ORDER BY vend_name,prod_name;
内部联结
SELECT vend_name,prod_name,prod_price
FROM vendors INNER JOIN products
ON vendors.vend_id = products.vend_id;
联结多个表SELECT prod_name,vend_name,prod_price,quantity
FROM orderitems,products,vendors
WHERE products.vend_id = vendors.vend_id
AND orderitems.prod_id = products.prod_id
AND order_num = 20005;
表别名:缩短SQL语句;允许在单条SELECT语句中多次使用相同的表。customers AS c
自联结、自然联结、外部联结(联结包含了那些在相关表中没有关联行的行)SELECT customer.cust_id, orders.order_num
FROM customers INNER JOIN orders
ON customer.cust_id = orders.cust_id;
包括没有订单的客户:
SELECT customer.cust_id, orders.order_num
FROM customers LEFT OUTER JOIN orders
ON customers.cust_id = orders.cust_id;
UNION:1、UNION必须由两条或两条以上的SELECT语句组成,语句之间用关键词UNION分隔;在使用OUTER JOIN 语法时,必须使用LEFT或RIGHT关键字指定包含其所有行的表。
使用带聚集函数的联结
组合查询
2、UNION中的每个查询必须包含相同的列、表达式或聚集函数(不过各个列不需要以相同的次序列出);
3、列数据类型必须兼容:类型不必完全相同,但必须是DBMS可以隐含地转换的类型(例如不同的数值类型或不同的日期类型)。
UNION从查询结果集中自动去除了重复的行(它的行为与单条SELECT语句中使用多个WHERE子句条件一样),这是UNION的默认行为,使用UNION ALL可以返回所有匹配行。
在用UNION组合查询时,只能使用一条ORDER BY子句,必须出现在最后一条SELECT语句之后。用来排序所有SELECT语句返回的所有结果。
使用UNION极大地简化复杂的WHERE子句,简化从多个表中检索数据的工作。
全文本搜索
mysql支持几种基本的数据库引擎,最常用的是MyISAM和InnoDB,前者支持全文本搜索,后者不支持。
为了进行全文本搜索,必须索引被搜索的列,而且要随着数据的改变不断地重新索引。可以索引单个列,也可以指定多个列。可以在创建表时指定FULLTEXT,或者在稍后指定(在这种情况下所有已有数据必须立即索引)。在索引之后,使用Match()和Against()执行全文本搜索,Match()指定被搜索的列,Against()指定要使用的搜索表达式。
传递给Match()的值必须与FULLTEXT()定义中的相同。如果指定多个列,则必须列出它们(而且次序正确)。搜索不区分大小写。
全文本搜索的一个重要部分是对结果排序。具有较高等级的行先返回
查询扩展(放宽所返回的全文本搜索结果的范围)
步骤:1、首先进行一次全文本搜索,找出与搜索条件匹配的所有行;
2、mysql检查这些匹配行并选择所有有用的词(mysql如何断定什么有用,什么无用)
3、mysql再次进行全文本搜索,不仅使用原来的条件,而且还使用所有有用的词。
SELECT note_text
FROM productnotes
WHERE Match(note_text) Against('anvils' WITH QUERY EXPANSION);
布尔文本搜索(提供内容细节):即使没有FULLTEXT索引也可以使用
1、要匹配的词;
2、要排斥的词;
3、排列提示(等级);
4、表达式分组;
5、另外一些内容。
SELECT note_text
FROM productnotes
WHERE Match(note_text) Against('heavy' IN BOOLEAN MODE );
匹配包含heavy但不包含任意以rope开始的词的行:
SELECT note_text
FROM productnotes
WHERE Match(note_text) Against('heavy -rope*' IN BOOLEAN MODE );