SQL入门和实战
无处不在的SQL
不管是何种开发语言,亦或是何种开发方向,SQL都是开发人员无法绕开的话题。
除了一门趁手的编程语言外,SOL语言也是开发人员人人必备的开发技能。
数据库介绍
无处不在的数据库
信息化社会,无处不在的就是数据。
数据库如何存储数据
我们先来看看,生活中,如何以Excel组织数据的存储
我们在来看看,数据库是如何组织数据的。
数据库管理系统(数据库软件)
那么如何实现这种数据库形式的数据管理呢?我们需要借助:数据库管理系统,也就是常说的数据库软件数据库软件是非常多的,常见的有:
数据库和SQL的关系
数据库是用来存储数据的,在这个过程中,会涉及到:
数据的新增
数据的删除
数据的修改
数据的查询
数据库、数据表的管理
等等
而SQL语言,就是一种对数据库、数据进行操作、管理、查询的工具
使用数据库软件去获得库->表->数据,这种数据组织、存储的能力
并借助SQL语言,完成对数据的增删改查等操作
MySQL的安装
MySQL的版本
针对不同的用户,MySQL分为两种不同的版本:
免费:
MysQL Community Server
社区版本,免费,但是Mysql不提供官方技术支持。
MysQL Cluster
集群版,开源免费,可将几个MySQL Server封装成一个Server。
收费:
MySQL Enterprise Edition
商业版,该版本是收费版本,可以试用30天,官方提供技术支持
MySQL Cluster CGE
高级集群版,需付费。
记得添加环境变量,从c盘的progrom file找mysql一直往下找到bin,复制路径到我的电脑里的属性的高级选项
点击path内部,新建然后粘贴刚才的那段路径即可
MySQL的入门使用
在MySQL的命令行环境下,可以通过:
show databases;查看有哪些数据库
use数据库名使用某个数据库
show tables 查看数据库内有哪些表
exit 退出MySQL的命令行环境
等基础命令
使用图形化工具操作MySQL
使用命令提示符进行MySQL的操作,不是太方便,一般开发者都会使用第三方的图形化工具进行使用可用于MySOL的图形化工具非常多,课程使用跨平台、开源、免费的图形化工具:DBeaver
下载地址: Download | DBeaver Community
我们选择免费的社区版 (DBeaver Community)选择适用自己电脑系统的安装包下载即可。
SQL的概述
SQL全称: Structured QueryLanguage,结构化查询语言,用于访问和处理数据库的标准的计算机语言。
SQL语言1974年由Boyce和Chamberlin提出,并首先在IBM公司研制的关系数据库系统SystemR上实现。
经过多年发展,SOL以成为数据库领域统一的数据操作标准语言,可以说几乎市面上所有的数据库系统都支持使用SQL语言来操作
简单来说,SQL语言就是操作数据库的专用工具。
SQL语言的分类
由于数据库管理系统(数据库软件)功能非常多,不仅仅是存储数据,还要包含:数据的管理、表的管理、库的管理账户管理、权限管理等等。
所以,操作数据库的SQL语言,也基于功能,可以划分为4类:
数据定义:DDL(Data Definition Language)
库的创建删除、表的创建制除等
数据操纵:DML (Data Manipulation Language)
新增数据、删除数据、修改数据等
数据控制: DCL(Data ControlLanquage)
新增用户、删除用户、密码修改、权限管理等.
数据查询: DQL(Data Query Language)
基于需求查询和计算数据
SQL的语法特征
在学习DDL、DQL等之前,我们先来了解SQL的语法特征
SQL语言,大小写不敏感(大写的SHOW 返回也是一样的东西)
SQL可以单行或多行书写,最后以;号结束
SQL支持注释:
单行注释:-- 注释内容(--后面一定要有一个空格)
单行注释:# 注释内容(# 后面可以不加空格,推荐加上)
多行注释:/*注释内容 */
DDL-库管理
查看数据库
SHOW DATABASES;
使用数据库
USE 数据库名称;
创建数据库
CREATE DATABASE 数据库名称 [CHARSET UTF8];
删除数据库
DROP DATABASE 数据库名称;
查看当前使用的数据库
SELECT DATABASEO;
图形化在使用的时候,也可以通过图形化来操作创建
SQL - DDL
创建表格
总结:
SQL语言是什么?有什么作用?
SQL:结构化查询语言,用于操作数据库,通用于绝大多数的数据库软
SQL的特征
大小写不敏感
需以;号结尾
支持单行、多行注释
SQL语言的分类
DDL数据定义
DML数据操作
DCL数据控制
DQL数据查询
SQL - DML
DML是指数据操作语言,英文全称是Data Manipulation Language,用来对数据库中表的数据记录进行更新
关键字:
插入INSERT
create database test;
show databases;
drop database test;
use world;
show tables;
create table student(
id int,
name varchar(10),
age int
);
#drop table student ;
insert into student(id) values (1),(2),(3);
select * from world.student;
insert into student(id,name,age) values(4,'奥特曼',21);
insert into student(id,name,age) values(5,'卫宫士郎',41);
删除DELETE
更新UPDATE
总结:
SQL - DQL
基础数据查询
基础数据查询-过滤
分组聚合
分组聚合应用场景非常多,如:统计班级中,男生和女生的人数这种需求就需要:
按性别分组
统计每个组的人数
这就称之为:分组聚合
条件限制:
总结:
结果排序
结果分页限制
同样,可以使用LIMIT关键字,对查询结果进行数量限制或分页显示,语法:
单纯limit后面只有数字的话,意思为单纯取多少数据。
关键字(order;where;group by都是有顺序的)
SFLECT 列|聚合的数FROM 表 WHERE ...GROUP BY ... LIMIT n[,m] ....ORDER BY ... [ASC I DESC]
总结:
截止到目前学习到的关键字,需注意
WHERE、GROUP BY、ORDER BY、LIMIT均可按需求省略,SELECT和FROM 是必写的
执行顺序:
FROM ->WHERE->GROUP BY和聚合函数->SELECT->ORDER BY->LIMIT
Python & MySQL
掌握Python执行SQL语句操作MySQL数据库软件
pymysql
除了使用图形化工具以外,我们也可以使用编程语言来执行SQL从而操作数据库。
在Python中,使用第三方库:pymysql来完成对MySQL数据库的操作。
创建到MySQL的数据库链接
返回版本号
# 演示Python pymysql库的装础操作
from pymysql import Connection
# 构建到mysql数据库的链接
conn = Connection(
host="localhost", #主机名
port = 3306, #端口
user="root", #用户
password="123456" #密码
)
# print(conn.get_server_info()) #测试是否可以连入mysql
#执行非查询询性质SQL
#执行查询性质SQL
#关闭链接
conn.close()
执行SQL语句
#如果要在python中去操作数据库需要先构造一个游标对象
# 演示Python pymysql库的装础操作
from pymysql import Connection
# 构建到mysql数据库的链接
conn = Connection(
host="localhost", #主机名
port = 3306, #端口
user="root", #用户
password="123456" #密码
)
# print(conn.get_server_info()) #测试是否可以连入mysql
#执行非查询询性质SQL
#如果要在python中去操作数据库需要先构造一个游标对象
cursor = conn.cursor()
#创建一个表
cursor.execute("create database test;")
conn.select_db("test") #选择数据库的操作 类似数据库中的use test;
#开始表的操作(创建)
cursor.execute("create table test_pymysql(id int); ")
#执行查询性质SQL
#关闭链接
conn.close()
执行查询性质的SQL语句:
# 演示Python pymysql库的装础操作
from pymysql import Connection
# 构建到mysql数据库的链接
conn = Connection(
host="localhost", #主机名
port = 3306, #端口
user="root", #用户
password="123456" #密码
)
# print(conn.get_server_info()) #测试是否可以连入mysql
#执行非查询询性质SQL
#如果要在python中去操作数据库需要先构造一个游标对象
cursor = conn.cursor()
#创建一个表
# cursor.execute("create database test;")
conn.select_db("world") #选择数据库的操作 类似数据库中的use test;
#开始表的操作(创建)
# cursor.execute("create table test_pymysql(id int); ")
#执行查询性质SQL
cursor.execute("select * from student")
result = cursor.fetchall()
print(type(result))
for r in result:
print(r)
#关闭链接
conn.close()
总结:
Python中使用什么第三方库来操作MySQL?如何安装?
使用第三方库为:pymysql
安装:pip install pymysql
如何获取链接对象?
from pymysql import Connection 导包
Connection(主机,端口,账户,密码)即可得到链接对象
链接对象.close()关闭和MySQL数据库的连接
如何执行SQL查询
通过连接对象调用cursor()方法,得到游标对象
游标对象.execute()执行SQL语句
游标对象.fetchall)得到全部的查询结果封装入元组内
commit提交
如图所示代码,经过执行是无法将数据插入到数据表student中的
这是为什么呢?
pymysql在执行数据插入或其它产生数据更改的SQL语句时默认是需要提交更改的,即,需要通过代码“确认”这种更改行为。
通过链接对象.commit()即可确认此行为。
# 演示Python pymysql库的装础操作
from pymysql import Connection
# 构建到mysql数据库的链接
conn = Connection(
host="localhost", #主机名
port = 3306, #端口
user="root", #用户
password="123456" #密码
)
# print(conn.get_server_info()) #测试是否可以连入mysql
#执行非查询询性质SQL
#如果要在python中去操作数据库需要先构造一个游标对象
cursor = conn.cursor()
#创建一个表
# cursor.execute("create database test;")
conn.select_db("world") #选择数据库的操作 类似数据库中的use test;
#开始表的操作(创建)
# cursor.execute("create table test_pymysql(id int); ")
#执行查询性质SQL
cursor.execute("insert into student values(10001,'卫宫士郎','22','男')")
#通过commit去确认要插入的内容才可以
conn.commit()
#关闭链接
conn.close()
如果没有commit是不能插入数据到数据库的;
自动commit
如果不想手动commit确认,可以在构建链接对象的时候,设置自动commit的属性。
# 演示Python pymysql库的装础操作
from pymysql import Connection
# 构建到mysql数据库的链接
conn = Connection(
host="localhost", #主机名
port = 3306, #端口
user="root", #用户
password="123456", #密码
autocommit = True #自动提交
)
# print(conn.get_server_info()) #测试是否可以连入mysql
#执行非查询询性质SQL
#如果要在python中去操作数据库需要先构造一个游标对象
cursor = conn.cursor()
#创建一个表
# cursor.execute("create database test;")
conn.select_db("world") #选择数据库的操作 类似数据库中的use test;
#开始表的操作(创建)
# cursor.execute("create table test_pymysql(id int); ")
#执行查询性质SQL
cursor.execute("insert into student values(10002,'远坂凛','22','女')")
#通过commit去确认要插入的内容才可以
# conn.commit()
#关闭链接
conn.close()
总结:
什么是commit提交?
pymysql库在执行对数据库有修改操作的行为时,是需要通过链接对象的commit成员方法来进行确认的。
只有确认的修改,才能生效。
如何自动提交呢?
上面有案例
综合案例
将此前的两个销售数据,通过python写入数据库
DDL定义
本次需求开发我们需要新建一个数据库来使用,数据库名称:py_sql
基于数据结构,可以得到建表语句:
实现步骤
create database py_sql ;
use py_sql;
CREATE TABLE orders(
order_date DATE,
order_id VARCHAR(255),
money INT,
province VARCHAR(10)
);
数据处理
"""
2. 设计一个抽象类,定义文件读服的相关功能,并使用子类实现具体功能
(为什么使用抽象类,因为有两个文本,但是文本不一样,一个csv一个json,那么就先定义一个标准父类做空实现只定义功能,具体再构造两个文本的子类)
"""
import json
#定义一个抽线类,做顶层设计,确定功能
from data_define import Record
class FileReader:
def read_data(self) -> list[Record]: #这里如果不导包的话会报错,因为这里没有record的类
#读文件的数据,读到的每一条数都转换为Record对象(Record层面已经使用了构造方法,直接成为了对象),将它们都封装ist内返回即可
pass
#开始第一个子类,csv文本类
class TextFileReader(FileReader):
def __init__(self,path):
self.path = path #定义成员变量记录文件的路径
#实现复写,也就是具体子类做事
def read_data(self) -> list[Record]:
f = open(self.path,"r",encoding="UTF-8")
record_list:list[Record] = [] #搞一个新的列表,从txt文件内取到的值直接append到这里来
for line in f.readlines():
line = line.strip() #消除读到的每一行的 换行符
data_list = line = line.split(',') #以逗号隔开
#构建类对象,根据下标,传入4个参数
record = Record(data_list[0],data_list[1],int(data_list[2]),data_list[3])
record_list.append(record) #封装到了list里面
f.close()
return record_list
class JsonFileReader(FileReader):
def __init__(self,path):
self.path = path #定义成员变量记录文件的路径
#实现复写,也就是具体子类做事
def read_data(self) -> list[Record]:
f = open(self.path,"r",encoding="UTF-8")
record_list:list[Record] = []
for line in f.readlines():
data_dict = json.loads(line) #json文件直接loads成为字典对象
record = Record(data_dict['date'],data_dict['order_id'],int(data_dict['money']),data_dict['province'])
record_list.append(record)
f.close()
return record_list
if __name__=='__main__':
text_file_reader = TextFileReader("D:/2011年1月销售数据.txt")
json_file_reader=JsonFileReader("D:/2011年2月销售数据JSON.txt")
list1 = text_file_reader.read_data()
list2 = json_file_reader.read_data()
for l in list1:
print(l)
for l in list2:
print(l)
"""
数据定义的类
1. 设计一个类,可以完成数据的封奖
"""
class Record:
#定义成员变量,看了一下文件有四列,所以我们定制4个成员变量,两种方法
# date = None
# order_id = None
# money = None
# province = None
#第二种方法:构造方法!这个可以直接可以取值,推荐使用这个
def __init__(self,date,order_id,money,province):
self.date = date #订单日期
self.order_id = order_id #订单id
self.money = money #金额
self.province = province #省份
def __str__(self):
return f"{self.date},{self.order_id},{self.money},{self.province}"
构建sql
"""
面向对象,数据分析案例,主业务逻辑代码
实现步骤:
1. 设计一个类,可以完成数据的封奖
2. 设计一个抽象类,定义文件读服的相关功能,并使用子类实现具体功能
(为什么使用抽象类,因为有两个文本,但是文本不一样,一个csv一个json,那么就先定义一个标准父类做空实现只定义功能,具体再构造两个文本的子类)
3.读取文件,生产数据对象
4. 进行数据需求的逻耕计第《计算每一天的销售额)
5,数据库综合案例
"""
#3.读取文件,生产数据对象
#导入之前所有的包
from file_define import FileReader,TextFileReader,JsonFileReader
from data_define import Record
from pymysql import Connection
#生成数据对象
text_file_reader = TextFileReader("D:/2011年1月销售数据.txt")
json_file_reader=JsonFileReader("D:/2011年2月销售数据JSON.txt")
jan_data :list[Record]= text_file_reader.read_data() #1月份的数据
feb_data :list[Record] = json_file_reader.read_data() #2月的数据
#现将两个月份的数据合并为一个list
all_data:list[Record] = jan_data + feb_data
#构建mysql链接对象
conn = Connection(
host="localhost", #主机名
port = 3306, #端口
user="root", #用户
password="123456", #密码
autocommit = True #自动提交
)
#创建游标对象
cursor = conn.cursor()
#选择数据库
conn.select_db("py_sql")
#组织sql语句
#注意在sql中字符串需要加单引号,但是数字可以不需要
for record in all_data:
sql = f"insert into orders " \
f"values('{record.date}','{record.order_id}',{record.money},'{record.province}')"
#执行sql语句
cursor.execute(sql)
#关闭sql对象
conn.close()