-
1 讲义
-
2 微课视频
课堂讲义
1、数据分析本质上就是数据查询。
2、MySQL中的数据查询就是使用 SELECT语句,也可以使用视图方式创建查询(不建议)
3、熟练掌握SELECT语句。
SELECT [DISTINCT] [数据列] //选择列
FROM [表] //选择表
WHERE [限定条件] //确定查询条件
GROU BY [分组] //确定分组依据
HAVING [限定分组条件] //对分组的条件进行限定,可以用聚集函数。
ORDER BY [排序条件] //确定排序的条件
LIMIT [n] //限定查询记录的数量。
4、基本语法
(1)每写一个语句都要在末尾加分号;
(2)SELECT语句中共7个子句。
(3)在使用SELECT语句时,一定有SELECT和FROM子句,其他子句根据需要使用。
5、SELECT子句:选择列
(1) * 代表所有列;
(2) SELECT 后面可以接多列,每一列之间用逗号分隔,
最后一列后面没有标点符号。
(3)可以为列改名:SELECT COL_NAME AS [新列名],也可以省略AS
不改变表的数据列名称,建议新列名用单引号括住。
(4)如果是多表查询,建议列名前面加表名作前缀。table.col
建议:表名可以在from子句中定义为简单的别名。
(5)可以使用函数对数据列进行运算。
LEFT(),RIGHT(),SUBSTR(),YEAR(),CONCAT()
(6)可以对数据列之间进行运算。例如两列相加、相乘等。
(7) DISTINCT:消除重复的行,DISTINCT紧接SELECT
6、FROM子句: 选择表
(1) FROM 后面接数据表的名字,表名可以用反单引号括住。
(2) FORM 后面可以接多个数据表,各表之间用逗号分隔。
(3) FROM后面的表面建议定义表的别名(简单易懂)。FROM TABLE AS '新表名'
(4)多表查询就是基于多个表的笛卡儿积【各表行数相乘
7、ORDER BY子句
(1)ORDER BY + 排序的依据(条件),一般后面接列名。
排序的依据一般是在SELECT子句有显示的数据列。
例如:查询staffinfo所有信息,查询结果按照ID列的升序排序。
SELECT * FROM staffinfo ORDER BY ID;
(2)排序默认为按照升序排序:ASC
如果要按降序排序,则要在排序条件后加:DESC 示例: SELECT * FROM staffinfo ORDER BY ID DESC;
(3)ORDER BY后面可以接多个排序条件,各条件之间用逗号分隔。
ORDER BY 条件1,条件2… 示例:先按性别的升序排序,后按ID降序排序。 SELECT * FROM staffinfo ORDER BY GENDER ASC, ID DESC;
(4)汉字的排序问题。中文字符数据列的排序,要按照汉语拼音顺序排序。
如果是UTF8字符集,排序规则选择:utf8mb4_zh_0900_as_cs 可以为数据列选择GB2312字符集,排序规则:gb2312_chinese_ci 示例: SELECT * FROM staffinfo ORDER BY NAME;
备注:如果数据库已经设定好了字符集和排序规则。
那么,可以在需要查询的表中,利用表设计器,选中需要排序的数据列, 修改字符集和排序规则即可。
8、LIMIT子句
用法:LIMIT n, 作用:显示前n行记录。
备注:LIMIT子句一般和ORDER BY子句一起使用。
LIMIT子句放在SELECT语句的最后。
示例:显示年龄最大前5名员工信息。
SELECT *
FROM staffinfo
ORDER BY Birthday ASC
LIMIT 5;
随堂练习:
查询staffinfo表,要求显示工龄最长的5个员工信息。
显示的信息包括:员工编号、姓名、性别、入职时间、工龄。
备注:工龄=今年-入职年份。
9、WHERE 子句【最重要的一个子句】
(1)WHERE 子句的作用:限定查询的条件。 WHERE <条件表达式>:查询满足<条件表达式>的记录。
什么叫条件表达式:常量(数值)、变量(数据列)、运算符的组合。
核心就是如何写正确的表达式,满足查询的要求。
例如:性别是男的,如何表达?籍贯是广州的? 性别是女的,而且驾驶年龄大于10年的。
常量:男、女、广州、10
变量:数据列 运算符: ——逻辑运算符:NOT, AND, OR ——算术运算符:+,-,*,/,MOD, ——比较运算符:=,>=,>,<=,!=,in,like,between…AND
能否灵活运用SELECT语句,关键是写好WHERE子句,
写好WHERE子句的关键,是熟练掌握条件表达式的写法。
(2)WHERE子句怎么写?就变成了如何写表达式的问题。和Python的编程也一样。
注意:WHERE 子句的条件表达式,不能用列的别名,因为WHERE子句是属于先判断。
其他子句可以用列的别名,因为ORDER BY,GROUP BY等属于后判断运行。
(3)最简单的条件表达式:列名=value 文本类、日期时间类的常量,要用单引号括住。 示例: SELECT * FROM staffinfo WHERE GENDER = '女';
(4)结合逻辑运算符、比较运算符:条件1 and 条件2 or 条件3… 多个条件的时候,注意使用圆括号括住。 示例: 性别是女,而且来自广州的;或者性别是男的,而且来自清远的。 SELECT * FROM staffinfo WHERE (GENDER = '女' AND NativePlace='广州') OR (GENDER = '男' AND NativePlace='清远');
(5)数据列 BETWEEN A AND B, [A,B]闭区间。 相当于: 数据列 >= A AND 数据列 <= B 示例:查询驾驶时间为5-10年的员工信息。 SELECT NAME 姓名, Gender 性别, DriveTime 准驾时间, YEAR(NOW())-YEAR(DriveTime) 驾龄 FROM staffinfo WHERE (YEAR(NOW())-YEAR(DriveTime) >= 5)
AND
(YEAR(NOW())-YEAR(DriveTime) <=10) ORDER BY 驾龄 DESC;
SELECT NAME 姓名, Gender 性别, DriveTime 准驾时间, YEAR(NOW())-YEAR(DriveTime) 驾龄 FROM staffinfo WHERE (YEAR(NOW())-YEAR(DriveTime)) BETWEEN 5 AND 10 ORDER BY 驾龄 DESC;
(6)IN取值范围:IN(取值列表),相当于OR 讨论:从staffinfo表中查询来自广州、清远、江门的员工信息。 select * from staffinfo as S WHERE S.NativePlace IN('广州','江门','清远');
错误的写法:条件表达式不能用,连接。 select * from staffinfo as S WHERE S.NativePlace='广州', S.NativePlace='江门', S.NativePlace='清远' ORDER BY S.NativePlace;
(7)LIKE和通配符
_:代表一个字符;
%:代表0个或多个字符。
LIKE 运算符,也叫模糊查询。
用法:数据列 LIKE ‘通配符’
示例: 在staffinfo表中,查询所有姓陈的员工信息。
select * from staffinfo as S WHERE S.Name LIKE '陈%'
示例: 在staffinfo表,查询姓名里面有个“八”字的。 select * from staffinfo as S WHERE S.Name LIKE '%八%'
10、GROUP BY 子句 (1)GROUP BY 的作用是分组 怎么分组? 分组的依据是什么(GROUP BY 后面接什么):有重复数值的数据列。 有重复数值的数据列,才有分组的意义。 例如:性别,籍贯。 没有重复数值的数据列,例如:ID,没有必要进行分组。
(2)分组的目的是什么? 分组的目的是:统计。
既然要分组统计,SELECT后面首先要显示分组的信息(即:分组后有多少个不同的组)
要显示的信息应该有什么?
(3)分组显示的信息: 两个重要结论 ——GROUP BY 后面接什么,SELECT后面就接什么, 分组依据应放在SELECT后的第一位,作用是显示分组信息。
——SELECT后面除了接分组条件以外,只能接聚集函数。
分组的目的是统计。统计什么?统计分组后各组的信息, 所以必须用聚集函数统计分组的相关信息。
常用的5个聚集函数:
COUNT(*):统计各组的记录的数量。AVG(数据列):统计各组的对应数据列的平均值。
MAX(数据列): 统计各组的对应数据列的最大值。
MIN(数据列): 统计各组的对应数据列的最小值。
SUM(数据列): 统计各组的对应数据列的和。
例子:
SELECT GENDER
FROM staffinfo GROUP BY GENDER;
等价于:
SELECT DISTINCT GENDER
FROM staffinfo;
思考题目:
统计男女职员的年龄信息。在staffinfo表中,请分别统计男、女职员的人数、平均年龄、 最大年龄、最小年龄,请写出SELECT语句。
11、HAVING 子句 (1)作用:限定分组的条件,和WHERE一样。
SELECT NativePlace 籍贯 FROM staffinfo WHERE NativePlace!='潮州' GROUP BY 籍贯;
等价于:
SELECT NativePlace 籍贯 FROM staffinfo GROUP BY 籍贯 HAVING 籍贯!='潮州';
(2)和WHERE不同之处
--HAVING 后面的条件,可以使用列的别名。因为HAVING是属于后判断,WHERE 后面不可以使用列的别名。
--HAVING 后面可以使用聚集函数,而WHERE后面不可以用聚集函数。
例子:
统计不同地方的人数,要求不显示潮州的,而且只显示人数大于等于3的地方。
SELECT NativePlace 籍贯, COUNT(*) 人数 FROM staffinfo GROUP BY 籍贯 HAVING 籍贯!='潮州' AND 人数 >= 3;
12、生成表
所谓生成表,就是利用已有的数据表,重新生成含有数据的新表或不含数据的表。
(1)生成新表,并包含数据。
语法:CREATE TABLE new_table AS SELECT …
备注:生成的新表只有数据和数据类型,不含数据列的约束。
例如:从staffinfo表选择所有男性的职员,生成新表new_staff
CREATE TABLE new_staff
AS
SELECT * FROM staffinfo WHERE Gender='男';
(2)生成新表,但不包含数据。使用LIKE关键字
语法: CREATE TABLE new_table LIKE old_table
备注:生成的新表和源表结构一致,包括数据列的所有约束。
示例: CREATE TABLE new_staff LIKE staffinfo;

