第十章:创建计算字段
- 拼接字段
- 拼接函数 Concat()
- SELECT Concat(name, '(', department, ')') FROM student ORDER BY name;
- 去掉空格函数 Trim() LTrim() RTrim()
- 别名 alias
- SELECT Concat(name, '(', department, ')') AS name_department FROM student ORDER BY name;
- 拼接函数 Concat()
- 执行算术计算
- 支持加减乘除
- SELECT name, 2018-birth AS age FROM student ORDER BY age;
- 支持加减乘除
第十一章:数据处理函数
大部分SQL提供下面的函数
- 文本处理函数
- Left() 返回串左边的字符
- Length() 返回串的长度
- Locate() 找出串的一个子串
- Lower() 转换成小写
- LTrim() 去掉串左边的空格
- Right() 返回串右边的字符
- RTrim() 去掉串右边的字符
- Soundex() 返回串的Soundex值(根据发音来匹配,中文效果不怎么样)
- SubString() 返回子串的字符
- Upper() 转换成大写
- 日期和时间处理函数
- AddDate() 增加一个日期
- AddTime() 增加一个时间
- CurDate() 返回当前日期
- CurTime() 返回当前时间
- Date() 返回日期时间中的日期部分
- DateDiff() 计算两个日期之差
- Date_Add() 高度灵活的日期运算函数
- Date_Format() 返回一个格式化的日期或者时间串
- Day() 返回一个日期的天数部分
- DayOfWeek() 返回一个日期对应一周内的第几天(星期天是第1天)
- Hour() 返回一个时间的小时部分
- Minute() 返回一个时间的分钟部分
- Month() 返回一个日期的月份部分
- Now() 返回当前日期和时间
- Second() 返回一个时间的秒部分
- Time() 返回一个日期时间的时间部分
- Year() 返回一个日期的年份部分
- 数值处理函数
- Abs() 返回一个数的绝对值
- Cos() 返回一个角度的余弦
- Exp() 返回一个数的指数值
- Mod() 返回除操作的余数
- Pi() 返回圆周率
- Rand() 返回一个随机数
- Sin() 返回一个角度的正弦
- Sqrt() 返回一个数的平方根
- Tan() 返回一个角度的正切
第十二章:汇总函数
-
聚集函数(不需要实际数据本身,只是汇总信息)
- 获取行数
- 求和
- 最大值、最小值和平均值
- AVG() 返回某列的平均值
- COUNT() 返回某列的行数
- SELECT COUNT(*) FROM student; //不忽略null
- SELECT COUNT(name) FROM student; //指定列明的话,忽略null
- MAX() 返回某列的最大值
- MIN() 返回某列的最小值
- SUM() 返回某列之和
-
聚集不同值
- DISTINCE 排除值相同的行,可以用于上面的5个聚集函数,不过 COUNT(DISTINCE price) 必须指定列名,MAX() 和 MIN() 使用 DISTINCE 没有意义。
-
组合聚集函数
- SELECT COUNT(*) AS user_count, MIN(birth) AS birth_old, MAX(birth) AS birth_young, AVG(birth) AS birth_avg FROM student;
第十三章:分组数据
数据分组: 把数据分为多个逻辑组,以便对每个组进行聚集计算
-
分组 GROUP BY
- SELECT birth, COUNT(*) AS num FROM student GROUP BY birth; //检索每个出生年份有几人
- GROUP BY 可以包含多列
- GROUP BY 可以嵌套分组
- GROUP BY 必须出现在 WHERE 子句之后, ORDER BY 子句之前
-
过滤分组 HAVING(HAVING 可以代替 WHERE 子句, WHERE 是对数据分组前进行过滤,HAVING 是对数据进行分组后过滤)
- SELECT birth FROM student GROUP BY birth HAVING birth > 1990; //查询1990之后哪个年份有人出生
-
对分组进行排序 GROUP BY + ORDER BY
- SELECT birth, COUNT(*) AS num FROM student GROUP BY birth ORDER BY birth; //按出生年份分组并升序排序
-
SELECT 子句
- SELECT 要返回的列或者表达式
- FROM 从中检索数据的表
- WHERE 过滤行
- GROUP BY 分组
- HAVING 过滤分组
- ORDER BY 排序
- LIMIT 要检索的行数
第十四章:使用子查询
SQL中所有语句都是查询,一般指的是 SELECT 语句
SELECT 语句可以嵌套使用,子查询就是查询嵌套查询
子查询不能嵌套太多,会影响性能
子查询一般跟 IN 操作符配合使用,有时也会跟等于(=)、不等于(<>)配合使用
-
看一个例子(从3张表中检索数据):
- SELECT cust_name, cust_contact 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_contact FROM customers WHERE cust_id IN
-
作为计算列字段使用子查询:
- 例子:从order表和customer表中查询出每个顾客的订单数):
- SELECT cust_name,
cust_state,
(SELECT COUNT(*) FROM order WHERE order.cust_id=customer.cust_id)
AS orders FROM customer ORDER BY cust_name; - 先从customer表中找出所有顾客,然后用顾客id跟order表中的顾客id匹配,查询出每个顾客的订单数,作为计算字段orders输出。