Excel数据分析mysql进阶之基础

数据库与数据仓库的区别

数据仓库(DataWareHouse,DW或DWH):是一种面向主题,集成的,稳定的,反映历史变化的数据集合,用于支持管理决策.面向主题:数据仓库中的数据按照一定的主题域进行组织.集成:原有分散的数据库数据经过系统加工,消除源数据中的不一致性相对稳定:指一旦某个数据进入数据仓库后只需定期的加载和更新反映历史变化:指通过信息,对企业未来趋势定量做出分析预测.

数据仓库与数据库区别:1.数据库是面向事务的,而数据仓库是面向主题设计的2.数据库中存储的一般为实时数据,而数据仓库一般为历史数据3.数据库设计尽量避免冗余,而数据仓库是有意引入冗余4.数据库是为了存储数据设计的,而数据仓库是为了分析数据引入的.

检索单个列

select name from user

检索多个列

select id,name,age,sex from user

检索所有列

select * from user
使用通配符 一般除非你确实需要表中的每个列,否则最好别使用*通配符

检索不同的行 DISTINCT

select distinct classid from user
类似于group by 分组
例如: select distinct a,b,c from tableA; 等同于 select a,b,c from tableA group by a,b,c

限制结果 LIMIT

select * from user limit 3,4
LIMIT 3, 4的含义是从行3开始的4行.(跳过前3行,取4行)

使用完全限定的表名

select name from user
select user.name from user
select user.name from itxdl.user

排序数据 ORDER BY

select * from user order by age
默认升序asc,降序desc

按多个列排序

select * from user order by classid,age
在需要对多列数据进行排序时,使用逗号分隔列名,并会按照前后顺序依次对比排序

过 滤 数 据 WHERE

在SELECT语句中,数据根据WHERE子句中指定的搜索条件进行过滤。
select name from user where age = 22
在同时使用ORDER BY和WHERE子句时,应该让ORDER BY位于WHERE之后,否则将会产生错误

WHERE子句操作符

操作符 说明
= 等于
<> != 不等于
< 小于
<= 小于等于
> 大于
>= 大于等于
BETWEEN 指定两个值之间
IS NULL 空值

AND与OR

SQL在处理OR操作符前,优先处理AND操作符。
select name from user where (classid=18 or classid =19) and sex='m'
因为圆括号具有较AND或OR操作符高的计算次序,数据库首先过滤圆括号内的OR条件。

IN与NOT

select name from user where classid in (18,19)
IN WHERE子句中用来指定要匹配值的清单的关键字,功能与OR相当
select user from user where classid not in (18,19)
在与IN操作符联合使用时,NOT使找出与条件列表不匹配的行非常简单。

LIKE与通配符

  • 百分号(%)通配符 在搜索串中,%表示任何字符出现任意次数
    select name from user where name like 'a%'
  • 下划线(_)通配符 下划线的用途与%一样,但下划线只匹配单个字符而不是多个字符

了解下MySQL的正则 REGEXP

1
2
3
> 所有种类的程序设计语言、文本编辑器、操作系统等都支持正则表达式
> mysql没有\d\w等
`select name from user where name regexp '[0-5]abc'`

拼接 Concat

解决办法是把两个列拼接起来。在MySQL的SELECT语句中,可使用Concat()函数来拼接两个列
select concat(vend_name,'(',vend_country')') from vendors order by vend_name
起别名:
select concat(vend_name,'(',vend_country')') as vend_title from vendors order by vend_name

函数的使用

文本处理函数

1
2
3
4
5
6
7
8
9
10
11
12
| 函数        | 说明             |
| ----------- | ---------------- |
| Left() | 返回串左边的字符 |
| Length() | 返回串的长度 |
| Locate() | 找出串的一个子串 |
| Lower() | 将串转换为小写 |
| LTrim() | 去掉串左边的空格 |
| Right() | 返回串右边的字符 |
| RTrim() | 去掉串右边的空格 |
| SubString() | 返回子串的字符 |
| Upper() | 将串转换为大写 |
| Concat | 拼接字符串 |

日期和时间处理函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| 函数          | 说明                           |
| ------------- | ------------------------------ |
| AddTime() | 增加一个时间(时、分等) |
| CurDate() | 返回当前日期 |
| CurTime() | 返回当前时间 |
| Date() | 返回日期时间的日期部分 |
| DateDiff() | 计算两个日期之差 |
| Date_Add() | 高度灵活的日期运算函数 |
| Date_Format() | 返回一个格式化的日期或时间串 |
| Day() | 返回一个日期的天数部分 |
| DayOfWeek() | 对于一个日期,返回对应的星期几 |
| Hour() | 返回一个时间的小时部分 |
| Minute() | 返回一个时间的分钟部分 |
| Month() | 返回一个日期的月份部分 |
| Now() | 返回当前日期和时间 |
| Second() | 返回一个时间的秒部分 |
| Time() | 返回一个日期时间的时间部分 |
| Year() | 返回一个日期的年份部分 |

数值处理函数

1
2
3
4
5
6
7
8
9
10
11
| 函 数  | 说 明              |
| ------ | ------------------ |
| Abs() | 返回一个数的绝对值 |
| Cos() | 返回一个角度的余弦 |
| Exp() | 返回一个数的指数值 |
| Mod() | 返回除操作的余数 |
| Pi() | 返回圆周率 |
| Rand() | 返回一个随机数 |
| Sin() | 返回一个角度的正弦 |
| Sqrt() | 返回一个数的平方根 |
| Tan() | 返回一个角度的正切 |

聚集函数的使用

函数 说明
AVG() 返回某列的平均值
COUNT() 返回某列的行数
MAX() 返回某列的最大值
MIN() 返回某列的最小值
SUM() 返回某列值之和

注意

在使用count时,如果指定列名,则指定列的值为空的行被忽略,但如果COUNT()函数中用的是星号(*),则不忽略

数据分组 GROUP BY与HAVING

  • GROUP BY
    select vend_id,count(*) as num_prods from products group by vend_id
  • HAVING
    select cust_id,count(*) as orders from orders group by cust_id having count(*) >= 2;

总结SELECT子句及其顺序

子句 说明 是否必须
SELECT 要返回的列或表达式
FROM 从中检索数据的表 仅在从表选择数据时使用
WHERE 行级过滤
GROUP BY 分组说明 仅在按组计算聚集时使用
HAVING 组级过滤
ORDER BY 输出排序顺序
LIMIT 要检索的行数