第一章 了解SQL
主键
primary key, 一列(或一组列),能够唯一区分表中的每个行;绝大多数情况下都应该保证每个表具有一个主键,以便于以后的数据操纵和管理;
任何列都可以作为主键,只要保证该列每行数值唯一且不为NULL;也可以使用多个列作为主键,此时所有列值的组合必须唯一,但单个列的值可以不唯一。
建议:不更新、不重用主键列中的值,也不在主键列中使用可能会更改的值。
第四章 检索数据
LIMIT子句
LIMIT 5 限制返回不多于5行
LIMIT 5,5 第一个数为开始位置,第二个数为行数(注意位置从第0行开始)
LIMIT 3 OFFSET 4 == LIMIT 4, 3
第六章 过滤数据
同时使用ORDER BY与WHERE时,必须让ORDER BY位于WHERE之后;
BETWEEEN ... AND ...是闭区间;
检查是否为空用IS NULL;
NULL在匹配过滤与不匹配过滤都不会被返回;
第七章 数据过滤
AND优先级高于OR;
应该总是用圆括号明确分组,不要过分依赖默认计算次序,即使它是对的;
IN操作符:select ... from ... where ... in ...
第八章 用通配符进行过滤
使用通配符时必须用LIKE操作符;
搜索是否区分大小写由MySql的配置方式决定;
%表示任何字符出现任意次数(包括0次),_只匹配单个字符;
%不能匹配NULL;
通配符的搜索会耗费更长的时间,不要过度使用通配符,如果其他操作符能达到相同目的,应该使用其他操作符;
第九章 正则表达式 略
第十章 创建计算字段
使用Concat拼接多个字段
SELECT Concat(vend_name, '(', vend_country, ')') FROM vendors
使用RTrim函数删除数据右侧多余空格:
SELECT Concat(RTrim(vend_name), '(', RTrim(vend_country), ')') FROM vendors
算术计算:
SELECT prod_id, quantity, item_price, quantityitem_price AS expanded_price* FROM orderitems
可以使用SELECT进行试验,并不一定需要FROM子句:
SELECT 3*2;
SELECT Now();
SELECT Trim('abc ');
第十一章 数据处理函数
常用文本处理函数
Left, Length, Locate, Lower, LTrim, SubString, Soundex
常用日期时间处理函数
AddDate, AddTime, CurDate, CurTime, Date, DateDiff, DateFormat, Hour/Minute/Month, Now, Year/Month/Day/DateOfWeek
常用数值处理函数
Abs, Cos, Exp, Mod, Pi, Rand, Sin, Sqrt, Tan
第十二章 汇总数据
聚集函数
AVG
只适用于单个列, 忽略NULL;
COUNT
COUNT()统计所有行数目, COUNT(column)忽略NULL;
MAX, MIN, SUM
忽略NULL
与DISTINCT组合使用
SELECT AVG(DISTINCT prod_price) AS avg_price FROM products
DISTINCT不能用于COUNT(),必须使用列名
根据需要,可以包含多个聚集函数
SELECT COUNT(*) AS num_items,
MIN(prod_price) AS price_min,
MAX(prod_price) AS price_max,
AVG(prod_price) AS price_avg
FROM products
第十三章 分组数据
统计每个vend_id下的产品数量
SELECT vend_id, COUNT(*) AS num_prods
FROM products GROUP BY vend_id
GROUP BY可以包含任意数目的列;
如果在GROUP BY中嵌套了分组,数据将在最后规定的分组上进行汇总;
GROUP BY中不能包含聚集函数;
除聚集计算语句外,SELECT中的每个列都必须在GROUP BY中给出;
所有NULL值将分为一组;
过滤分组
SELECT cust_id, COUNT(*) AS orders
FROM orders
GROUP BY cust_id
HAVING COUNT(*) >= 2;
WHERE在分组前进行过滤,HAVING在分组后进行过滤,WHERE排除的行不包含在分组中。
第十四章 子查询
利用子查询进行过滤
示例:
SELECT cust_id FROM orders WHERE order_num
IN (SELECT order_num FROM orderitems WHERE prod_id = 'TNT2');
子查询总是从内向外处理。
虽然子查询一般与IN结合使用,但也可以用于==、<>等;
子查询并不总是执行这种类型的数据检索的最有效方法;
作为计算字段使用子查询
示例:
SELECT cust_name,
cust_state,
(SELECT COUNT(*) FROM orders WHERE orders.cust_id = customers.cust_id) AS orders
FROM customers
ORDER BY cust_name
针对customers中的每个cust_id统计在orders表中的行数;
只要列名可能有多义性,就必须将表名带上。