子句 说明 是否必须使用
SELECT 要返回的列或表达式 是
FROM 从中检索数据的表 仅在从表选择数据时使用
WHERE 行级过滤 否
GROUP BY 分组说明 仅在按组计算聚集时使用
HAVING 组级过滤 否
ORDER BY 输出排序顺序 否
LIMIT 要检索的行数 否
查询query:任何SQL语句都是查询,子查询总是从内向外处理。子查询一般与IN操作符结合使用,也可以用于测试等于(=)、不等于(<>)等。
相关子查询correlated subquery:涉及外部查询的子查询。
外键foreign key:外键为某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系
可伸缩性scale:能够适应不断增加的工作量而不失败
笛卡尔积cartesian product:由没有联结条件的表关系返回的结果为笛卡尔积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数。
等值联结equijoin:它基于两个表之间的相等测试,也称为内部联结。
并union:这些组合查询也叫复合查询compound query,执行多个查询(多条SELECT语句),并将结果作为单个查询结果集返回。
全文本搜索:两个最常用的引擎MyISAM和InnoDB,前者支持全文本搜索,而后者不支持。
1、orders是一个计算字段,由圆括号中子查询语句建立,该子查询对检索出的每个客户执行一次。WHERE子句使用完全限定列名;不止一种解决方案。
SELECT cust_name,cust_state,(SELECT COUNT(*) FROM orders WHERE orders.cust_id=customers.cust_id) AS orders FROM customers ORDER BY cust_name;
2、内部联结,两个表之间的关系是FROM子句的组成部分,以INNER JOIN指定。联结条件用特定的ON子句而不是WHERE子句。传递给ON的实际条件与传递给WHERE的相同。
SELECT vend_name,prod_name,prod_price FROM vendors INNER JOIN products ON vendors.vend_id=products.vend_id;
3、外部联结,与内部联结不同的是,还包括没有关联行的行。在使用OUTER JOIN语法时,必须使用RIGHT或LEFT关键字指定包括其所有行的表(RIGHT指出的是OUTER JOIN右边的表,而LEFT指出的是OUTER JOIN左边的表)。例子使用LEFT OUTER JOIN从FROM子句的左边表(customers表)中选择所有行。
SELECT customers.cust_id,orders.order_num FROM customers LEFT OUTER JOIN orders ON customers.cust_id = orders.cust_id;
4、使用带聚集函数的联结
SELECT customers.cust_name,customers.cust_id,COUNT(orders.order_num) AS num_ord FROM customers INNER JOIN orders ON customers.cust_id = orders.cust_id GROUP BY customers.cust_id;
5、组合查询,并,在各条SELECT语句之间放上关键字UNION即可,UNION把输出组合成单个查询结果集。UNION中的每个查询必须包含相同的列、表达式或聚集函数,列数据类型必须兼容。结果集自动去除重复的行。如果想返回所有的匹配行,可使用UNION ALL而不是UNION。ORDER BY必须出现在最后一条SELECT语句之后,它将排序所有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 (1001,1002) ORDER BY vend_id, prod_price;
6、启用全文本搜索支持,为了进行全文本搜索,必须索引被搜索的列,而且要随着数据的改变不断地重新索引。CREATE TABLE语句接受FULLTEXT子句,包含的列中有一个名为note_text的列,为了进行全文本搜索,子句FULLTEXT(note_text)的指示对它进行索引。这里的FULLTEXT索引单个列,如果需要也可以指定多个列。定义后,MySQL自动维护该索引。在增加、更新或删除行时,索引随之自动更新。不要在导入数据时使用FULLTEXT
CREATE TABLE productnotes
(note_id int NOT NULL AUTO_INCREMENT,
......,
note_text text NULL,
FULLTEXT(note_text)
)ENGINE=MyISAM;
7、进行全文本搜索,Match()指定被搜索的列,必须与FULLTEXT()定义中的相同。如果指定多个列,则必须列出它们,而且次序正确。Against()指定要使用的搜索表达式。除非使用BINARY方式,否则全文本搜索不区分大小写。具有较高等级的行先返回。文本中词靠前的行的等级值比词靠后的行的等级值高。50%规则,如果一个词出现在50%以上的行中,搜索它没有用处(返回太多的结果),则将它定义为一个非用词忽略。如果表中行数少于3行,全文本搜索不返回结果。忽略词中的单引号。不具有词分隔符的语言不能恰当地返回全文本搜索结果。
SELECT note_text FROM productnotes WHERE Match(note_text) Against('rabbit');
SELECT note_text,Match(note_text) Against('rabbit') AS rank FROM productnotes;
8、查询扩展,用来设法放宽所返回的全文本搜索结果的范围,MySQL对数据和索引进行两遍扫描来完成搜索。
SELECT note_text FROM productnotes WHERE Match(note_text) Against('anvils' WITH OUERY EXPANSION);
9、布尔文本搜索,匹配包含heavy但不包含任意以rope开始的词的行,下面语句有两个全文本搜索布尔操作符,-排除一个词,*截断操作符,可以想象为词尾的通配符。另外+包含,词必须存在,>包含,而且增加等级值,<包含,且减少等级值。不含指定操作符,匹配包含至少一个词的行。50%的规则不用于IN BOOLEAN MODE
SELECT note_text FROM productnotes WHERE Match(note_text) Against('heavy -rope*' IN BOOLEAN MODE);
10、数据插入,第一列cust_id省略,这是因为每次插入一个新行时该列由MySQL自动增量。省略的列需满足某个条件,或者该列定义为允许NULL值(无值或空值),或者在表定义中给出默认值。否则相应的行插入不成功,并产生一条错误消息。如果数据检索是最重要的,可以在INSERT和INTO之间添加关键字LOW_PRIORITY,降低INSERT语句的优先级。用单条INSERT语句处理多个插入比使用多条INSERT语句快。
INSERT INTO customers (cust_city,cust_state,cust_email) VALUES (‘Los Angles’,'CA',NULL),(‘New York’,'NY',NULL);
11、插入检索出的数据,如果custnew表含有数据,则所有数据将被插入到customers。SELECT中列名可以不匹配,主要使用列的位置。SELECT可以包含WHERE子句过滤插入的数据。
INSERT INTO customers (cust_city,cust_state,cust_email) SELECT cust_city,cust_state,cust_email FROM custnew;
12、更新数据,WHERE子句告诉MySQL更新哪一行,没有WHERE子句,将更新表中所有行,所以要小心使用UPDATE。即使发生错误也继续进行更新,可使用IGNORE关键字,如UPDATE IGNORE customers...
UPDATE customers SET cust_name = 'The Fudds', cust_email = 'elmer@fudd.com' WHERE cust_id = 10005;
13、为了删除某个列的值,可设置它为NULL(假定表定义允许NULL值)
UPDATE customers SET cust_email = NULL WHERE cust_id = 10005;
14、删除数据,如果省略WHERE子句,它将删除表中每个客户。DELETE删除整行而不是删除列,不删除表本身。如果想从表中删除所有行,不要使用DELETE,使用TRUNCATE TABLE语句,它速度更快,它实际是删除原来的表并重新创建一个表。
DELETE FROM customers WHERE cust_id = 10006;