开篇介绍

在开始之前,需要说明的是,尽管SQL上手特别简单,但是想用好SQL,你不仅需要熟练掌握SQL语法,同时也必须掌握数据库的基本运行知识,更重要的,你还需要从根本上了解你面向的业务。用一句话来总结就是,如果你始终认为SQL很简单,那只能说你和我一样还没入门,这里并不是想强调它很难,而是说它值得而且需要你投入时间和精力去研究。

数据库安装

服务端安装

设置访问权限

客户端安装

数据库连接

Navicat连接

Navicat是目前数据库可视化操作最最理想的软件,但值得注意的是它是一款收费软件,不过我相信如果你需要使用的话,你总有办法的对吧~当然了,Navicat提供为期一个月的使用时间,应该足够你边学边练看完这篇文章了。

DBaver连接

尽管与Navicat相比,dbaver的功能没有那么多,操作也比它略微复杂,但考虑到DBaver是一款可以免费使用的开源软件,你可以随时体验到它最新的功能特性,所以是一个省心省力的选择,值得一提的是,我们这里说的主要是DBaver社区版,它同时还有付费版本,感兴趣的话自行了解吧。

终端SSL连接

连接之前,先ping一下

基础语法

概览

  • 第一个小实例,创建表并存入查询结果
# 创建表并存入查询结果
CREATE TABLE `每种商品每月销售量统计` 
#这里的别名可以先使用后声明
SELECT s.`商品代码` AS `商品类型`, 
			MONTH(s.`日期`) AS `月份`,
			SUM(s.`数量`) AS `销售数量`,
			SUM(s.`金额`) AS `销售金额`
FROM data_processing  AS s WHERE s.`日期` IS NOT NULL 
			AND s.`数量` > 0
			AND s.`金额` > 0
GROUP BY MONTH(s.`日期`), s.`商品代码`
ORDER BY 月份, 销售数量, 销售金额;
  • 第二个小实例,子查询




CREAT

SELECT

BETWEEN

IN

WHERE

高阶语法

连接语法

在基础语法阶段,我们基本上都是在一张数据库的表里操作数据,然而在现实测试及生产环境中,所有数据都按照范式要求(数据库设计范式,将在其他文章里介绍)被分门别类地存在不同的表里,如果我们想获得具有业务意义的数据,就必须穿透多张表,甚至是多个数据库来进行查询来取得我们的目标数据。我们把同时查询多张表以获得其中包含的业务信息的过程叫做连接查询。

SQL有两种连接查询语法

  • 使用from和where关键字制定表的连接

与我们采用一般语法取数在形式和逻辑上都是一致的,比较好理解。

  • 使用join和on关键字指定表的连接

重要思想

关于游标

游标(Cursor),一条sql,可能对应N条资源,取出资源的接口,就是游标,沿着游标,可以一次取出1行。

使用游标

使用declare进行声明

declare 游标名 cursor for select_statement

(2)打开游标

使用open进行打开

open 游标名

(3)从游标中取值

使用fetch进行取值

fetch 游标名 into var1,var2[,...] --将取到的一行赋值给多个变量

(4)关闭游标

使用close关闭游标

close 游标名

参考链接 https://www.jb51.net/article/164679.htm

一切皆关系

Python sqlalchemy

# -*- coding: utf-8 -*-
# wwww.evertears.com

# 首先要确定已经安装pandas;sqlalchemy;pymysql

# 导入必要模块pandas和sqlalchemy
import pandas as pd
import numpy as np
from sqlalchemy import create_engine

# 初始化数据库连接,使用pymysql模块
# MySQL的用户:root, 密码:123456, 端口:3306,数据库:testdb
engine = create_engine('mysql+pymysql://root:123456@evertears.com:3306/testdb')

# 查询语句
sql = '''
      WITH final_score AS (
SELECT
	student.student_ID,
	student.student_name,
	course.course_name,
	score.score 
FROM
	student
	LEFT JOIN score ON ( student.student_ID = score.student_ID )
	LEFT JOIN course ON ( course.course_ID = score.course_ID ) 
	) SELECT
	student_ID AS "学号",
	student_name AS "姓名",
	SUM( CASE WHEN course_name = "语文" THEN score ELSE 0 END ) AS "语文",
	SUM( CASE WHEN course_name = "数学" THEN score ELSE 0 END ) AS "数学",
	SUM( CASE WHEN course_name = "英语" THEN score ELSE 0 END ) AS "英语",
	SUM( CASE WHEN course_name = "物理" THEN score ELSE 0 END ) AS "物理",
	SUM( CASE WHEN course_name = "生物" THEN score ELSE 0 END ) AS "生物",
	SUM( CASE WHEN course_name = "政治" THEN score ELSE 0 END ) AS "政治",
	SUM( CASE WHEN course_name = "地理" THEN score ELSE 0 END ) AS "地理",
	SUM( CASE WHEN course_name = "历史" THEN score ELSE 0 END ) AS "历史",
	SUM( CASE WHEN course_name = "音乐" THEN score ELSE 0 END ) AS "音乐",
	SUM( CASE WHEN course_name = "体育" THEN score ELSE 0 END ) AS "体育",
	SUM( CASE WHEN course_name = "数据库基础" THEN score ELSE 0 END ) AS "数据库基础",
	SUM( CASE WHEN course_name = "数据治理" THEN score ELSE 0 END ) AS "数据治理",
	SUM( CASE WHEN course_name = "财务会计" THEN score ELSE 0 END ) AS "财务会计",
	SUM( CASE WHEN course_name = "管理学" THEN score ELSE 0 END ) AS "管理学",
	SUM( CASE WHEN course_name = "统计学" THEN score ELSE 0 END ) AS "统计学",
	SUM( CASE WHEN course_name = "税法" THEN score ELSE 0 END ) AS "税法",
	SUM( CASE WHEN course_name = "经济法" THEN score ELSE 0 END ) AS "经济法",
	SUM( CASE WHEN course_name = "公司战略" THEN score ELSE 0 END ) AS "公司战略",
	SUM( CASE WHEN course_name = "美术" THEN score ELSE 0 END ) AS "美术" 
FROM
	final_score 
GROUP BY
	student_ID 
ORDER BY
	student_ID;
      '''

# read_sql_query的两个参数: sql语句, 数据库连接
df = pd.read_sql_query(sql, engine)


print('数据加载成功!')

df.replace(0,"缺考")

数据分析实战

使用SQL取数

利用python进行数据预处理

线性回归

得出结论

前端分页实战

SQL语句可以与web服务端代码或者前端代码交互。我们经常会看到各种 Top-N 排行榜,例如排名前十的同学、Top5高校等。web页面中显示数据时通常不是一次列出所有的结果,而是每次显示 N 条(10、20、50 等)记录;然后提供“下一页”、“上一页”等翻页功能。下面我们就来了解一下如何使用 SQL 语句实现以上两种常见的功能。

要实现Top-N 排行榜首先要先排序,再限制返回的记录数。

SELECT student_id,  student_name,  score
  FROM final_scores
 ORDER BY score DESC
 LIMIT 5 OFFSET 20;

OFFSET 是一个偏移量,表示从第N+1行开始返回记录

LIMIT 5 OFFSET 20 表示从第21条记录开始,返回5条记录,上面的例子可以被写为如下:

SELECT student_id,  student_name,  score
  FROM final_scores
 ORDER BY score DESC
 LIMIT  20, 5;

在我们的web app中,我们可以将20分别5写入app配置文件,然后在实际的视图函数中定义一个n=n+5的步进值,这样,每当我们点击“上一页”或者“下一页“的时候,实际上每次sql查询的内容将会发生改变,从而实现翻页的效果。