不管是何种开发语言,亦或是何种开发方向,SQL都是开发人员无法绕开的话题。
除了一门趁手的编程语言外,SQL语言也是开发人员人人必备的开发技能。
编程语言可以归纳为,数据的计算一类。
那数据的存储呢?
那么如何实现这种数据形式的数据管理呢?
我们需要借助:数据库管理系统,也就是常说的数据库软件。
数据库软件是非常多的,常见的有:
数据库是用来存储数据的,在这个过程中,会涉及到:
等等
而SQL语言,就是一种对数据库、数据进行操作、管理、查询的工具。
使用数据库软件去获得库->表->数据,这种数据组织、存储的能力
并借助SQL语言,完成对数据的增删改查等操作
总结:
1.数据库是什么?有什么作用呢?
数据库就是指数据存储的库,作用就是组织数据并存储数据。
2.数据库如何组织数据呢?
按照:库 -> 表 -> 数据 三个层级进行组织
3.数据库软件是什么?我们学习哪种数据库软件呢?
数据库软件就是提供库->表->数据,这种数据组织形式的工具软件,也称之为数据库管理系统
常见的数据库软件有:Oracle、MySQL、SQL Server、PostgreSQL、SQLite,课程以MySQL软件为基础进行学习
4.数据库和SQL的关系是?
数据库(软件)提供数据组织存储的能力
SQL语句则是操作数据、数据库的工具语言
简单来说,MySQL是一个中小型的数据库,简单易用性能不错,在企业中频繁出现。
大多数开发人员都会和MySQL打交道,可以说是开发人员必须会使用的一款数据库软件。
针对不同的用户,MySQL分为两种不同的版本:
免费:
收费:
下载地址:https://downloads.mysql.com/archives/installer
将MySQL安装目录的bin文件夹的路径,复制进入
即可,通过cmd命令提示符,输入:
mysql -uroot -p
回车后输入密码即可:
MySQL安装好后,就可以简单的尝试使用它。
打开:命令提示符程序,输入:mysql -uroot -p,然后回车后输入密码,即可进入命令行环境
在MySQL的命令行环境下,可以通过:
等基础命令。
这些命令就是后面我们要学习的SQL语言。
使用命令提示符进行MySQL的操作,不是太方便,一般开发者都会使用第三方的图形化工具进行使用。
可用于MySQL的图形化工具非常多,课程使用跨平台、开源、免费的图形化工具:DBeaver
下载地址:https://dbeaver.io/download
我们选择免费的社区版(DBeaver Community)
选择适用自己电脑系统的安装包下载即可。
SQL全称:Structured Query Language,结构化查询语言,用于访问和处理数据库的标准的计算机语言。
SQL语言1974年由Boyce和Chamberlin提出,并首先在IBM公司研制的关系数据库系统SystemR上实现。
经过多年发展,SQL已成为数据库领域统一的数据操作标准语言,可以说几乎市面上所有的数据库系统都支持使用SQL语言来操作
简单来说,SQL语言就是操作数据库的专用工具。
由于数据库管理系统(数据库软件)功能非常多,不仅仅是存储数据,还要包含:数据的管理、表的管理、库的管理、账户管理、权限管理等等。
所以,操作数据库的SQL语言,也基于功能,可以划分为4类:
在学习DDL、DQL等之前,我们先来了解SQL的语法特征。
show databases;
create database mry01 charset 'utf8';
drop database mry01;
总结:
1.SQL语言是什么?有什么作用?
SQL:结构化查询语言,用于操作数据库,通用于绝大多数的数据库软件
2.SQL的特征
SQL示例:
use car_booking;
show tables;
create table student(
id int,
name varchar(20),
age int
);
drop table student;
DML是指数据操作语言,英文全称是Data Manipulation Language,用来对数据库中表的数据记录进行更新。
关键字:
插入INSERT
删除DELETE
更新UPDATE
示例:
注意:
1.插入字符串数据,需要用单引号包围
2.插入全部列的时候,列的列表可以省略
SQL示例:
insert into student(id) values (1), (2), (3);
insert into student(id, name, age) values (4, '周杰伦', 31), (5, '林俊杰', 33);
SQL示例:
delete from student where id = 1;
delete from student where id > 6;
delete from student where age = 33;
delete from student;
SQL示例:
update student set name = '张学友' where id = 4;
update student set name = '王力宏';
总结:
1.DML插入、删除、更新的语法
2.注意事项
字符串的值,出现在SQL语句中,必须要用单引号包围起来
在SQL中,通过SELECT关键字开头的SQL语句,来进行数据的查询
基础语法:
含义就是:
从(FROM)表中,选择(SELECT)某些列进行展示
SQL示例:
select id, name from student;
select id, name, age from student;
select id, name, age, gender from student;
select * from student;
SQL示例:
select * from student where gender = '男';
分组聚合应用场景非常多,如:统计班级中,男生和女生的人数。
这种需求就需要:
这就称之为:分组聚合。
基础语法:
演示:
注意:SELECT中,除了聚合函数外,GROUP BY 了哪个列,哪个列在能出现在SELECT中。
SQL示例:
select gender,avg(age) from student group by gender;
select gender,avg(age), sum(age), min(age), max(age), count(*) from student group by gender;
总结:
2.分组聚合的注意事项?
GROUP BY中出现了哪个列,哪个列才能出现在SELECT中的非聚合
可以对查询的结果,使用ORDER BY关键字,指定某个列进行排序,语法:
SQL示例:
select * from student where age > 20 order by age asc;
select * from student where age > 20 order by age desc;
同样,可以使用LIMIT关键字,对查询结果进行数量限制或分页显示,语法:
SQL示例:
select * from student limit 5;
select * from student limit 10, 5;
select age, count(*) from student where age > 20 group by age order by age limit 3;
2.截止到目前学习到的关键字,需注意:
除了使用图形化工具以外,我们也可以使用编程语言来执行SQL从而操作数据库。
在Python中,使用第三方库:pymysql来完成对MySQL数据库的操作。
安装:
pip install pymysql
SQL示例:
"""
演示Python pymysql库的基础操作
"""
from pymysql import Connection
# 构建到MySql数据库的链接
conn = Connection(
host="localhost", # 主机名
port=3306, # 端口
user="root", # 账户
password="muriyue" # 密码
)
print(conn.get_server_info())
# 执行非查询性质SQL
cursor = conn.cursor() # 获取到游标对象
# 选择数据库
conn.select_db("test")
# 执行查询性质SQL
# cursor.execute("create table test_pymsql2(id int);")
cursor.execute("select * from student")
results = cursor.fetchall()
print(results)
for r in results:
print(r)
# 关闭链接
conn.close()
执行结果:
D:\python\python-learn\venv\Scripts\python.exe D:\python\python-learn\模块\01_pymysql入门.py
5.5.51
((10001, '周杰轮', 31, '男'), (10002, '王力鸿', 33, '男'), (10003, '蔡依琳', 35, '女'), (10004, '林志灵', 36, '女'), (10005, '刘德滑', 33, '男'), (10006, '张大山', 10, '男'), (10007, '刘志龙', 11, '男'), (10008, '王潇潇', 33, '女'), (10009, '张一梅', 20, '女'), (10010, '王一倩', 13, '女'), (10011, '陈一迅', 31, '男'), (10012, '张晓光', 33, '男'), (10013, '李大晓', 15, '男'), (10014, '吕甜甜', 36, '女'), (10015, '曾悦悦', 31, '女'), (10016, '刘佳慧', 21, '女'), (10017, '项羽凡', 23, '男'), (10018, '刘德强', 26, '男'), (10019, '王强强', 11, '男'), (10020, '林志慧', 25, '女'))
(10001, '周杰轮', 31, '男')
(10002, '王力鸿', 33, '男')
(10003, '蔡依琳', 35, '女')
(10004, '林志灵', 36, '女')
(10005, '刘德滑', 33, '男')
(10006, '张大山', 10, '男')
(10007, '刘志龙', 11, '男')
(10008, '王潇潇', 33, '女')
(10009, '张一梅', 20, '女')
(10010, '王一倩', 13, '女')
(10011, '陈一迅', 31, '男')
(10012, '张晓光', 33, '男')
(10013, '李大晓', 15, '男')
(10014, '吕甜甜', 36, '女')
(10015, '曾悦悦', 31, '女')
(10016, '刘佳慧', 21, '女')
(10017, '项羽凡', 23, '男')
(10018, '刘德强', 26, '男')
(10019, '王强强', 11, '男')
(10020, '林志慧', 25, '女')
进程已结束,退出代码为 0
总结:
1.Python中使用什么第三方库来操作MySQL?如何安装?
使用第三方库为:pymysql
安装:pip install pymysql
2.如何获取链接对象?
3.如何执行SQL查询
通过连接对象调用cursor()方法,得到游标对象
如图所示代码,经过执行是无法将数据插入到数据表student中的。
这是为什么呢?
pymysql在执行数据插入或其它产生数据更改的SQL语句时,默认是需要提交更改的,即,需要通过代码"确认"这种更改行为。
通过链接对象.commit()即可确认此行为。
代码示例:
"""
演示使用pymysql库进行数据插入的操作
"""
from pymysql import Connection
# 构建到Mysql数据库的链接
conn = Connection(
host="localhost", # 主机名(IP)
port=3306, # 端口
user="root", # 账户
password="muriyue" # 密码
)
# 执行非查询性质SQL
cursor = conn.cursor() # 获取到游标对象
# 选择数据库
conn.select_db("test")
# 执行SQL
cursor.execute("insert into student values(10111, '周杰伦', 31, '男')")
# 通过commit确认
conn.commit()
# 关闭链接
conn.close()
执行结果:
如果不想手动commit确认,可以在构建链接对象的时候,设置自动commit的属性。
如图代码进行设置,即可自动提交无需手动commit了。
代码示例:
"""
演示使用pymysql库进行数据插入的操作
"""
from pymysql import Connection
# 构建到Mysql数据库的链接
conn = Connection(
host="localhost", # 主机名(IP)
port=3306, # 端口
user="root", # 账户
password="muriyue", # 密码
autocommit=True # 自动提交(确认)
)
# 执行非查询性质SQL
cursor = conn.cursor() # 获取到游标对象
# 选择数据库
conn.select_db("test")
# 执行SQL
cursor.execute("insert into student values(10112, '林俊杰', 31, '男')")
# 通过commit确认
# conn.commit()
# 关闭链接
conn.close()
执行结果:
总结:
1.什么是commit提交?
pymysql库在执行对数据库有修改操作的行为时,是需要通过链接对象的commit成员方法来进行确认的。
只有确认的修改,才能生效。
2.如何自动提交呢?
我们使用<<面向对象>>章节案例中的数据集,完成使用Python语言,读取数据,并将数据写入Mysql的功能。
create database py_sql charset utf8;
use py_sql;
create table orders(
order_data date,
order_id varchar(255),
money int,
province varchar(10)
);
"""
数据定义的类
"""
class Record:
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}"
def to_json(self):
d = {"date": self.date, "order_id": self.order_id, "money": self.money, "province": self.province}
import json
return json.dumps(d)
"""
文件相关的类定义
"""
import json
from data_define import Record
# 先定义一个抽象类用来做顶层设计,确定有哪些功能需要实现
class FileReader:
def read_data(self) -> list[Record]:
# 读取文件的数据,读到的每一条数据都转换为Record对象,将它们都封装到list内返回即可
pass
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] = []
for line in f.readlines():
line = line.strip() # 消除读取到的每一行数据中的\n
data_list = line.split(",")
record = Record(data_list[0], data_list[1], data_list[2], data_list[3])
record_list.append(record)
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)
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:/yuancheng/python/2011年1月销售数据.txt")
json_file_reader = JsonFileReader("D:/yuancheng/python/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)
"""
SQL 综合案例,读取文件,写入Mysql数据库中
"""
from file_define import TextFileReader, JsonFileReader
from data_define import Record
from pymysql import Connection
text_flie_reader = TextFileReader("D:/yuancheng/python/2011年1月销售数据.txt")
json_file_reader = JsonFileReader("D:/yuancheng/python/2011年2月销售数据JSON.txt")
jan_data: list[Record] = text_flie_reader.read_data()
feb_data: list[Record] = json_file_reader.read_data()
# 将2个月份的数据合并为1个list来存储
all_data: list[Record] = jan_data + feb_data
# 构建MySql链接对象
conn = Connection(
host="localhost",
port=3306,
user="root",
password="muriyue",
autocommit=True
)
# 获得游标对象
cursor = conn.cursor()
# 选择数据库
conn.select_db("py_sql")
# 组织SQL语句
for record in all_data:
sql = f"insert into orders(order_data, order_id, money, province) " \
f"values('{record.date}', '{record.order_id}',{record.money}, '{record.province}')"
print(sql)
# 执行SQL语句
cursor.execute(sql)
# 关闭MySql链接对象
conn.close()