2023年7月23日星期日

pymysql

sql

SQL

数据库的作用

数据的利用:

  • 数据的存储
  • 数据的计算

数据库如何存储数据

数据库如何组织数据

\to\to数据

数据库是用来存储数据的,在这个过程中,会涉及到:

  • 数据的新增
  • 数据的删除
  • 数据的修改
  • 数据的查询
  • 数据库、数据表的管理
  • 等等
    而SQL语言,就是一种对数据库、数i据进行操作、管理、查询的工具
    使用数据库软件去获得库->表->数据,这种数据组织、存储的能力
    并借助SQL语言,完成对数据的增删改查等操作

SQL语言分类

SQL全称: Structured Query Language,结构化查询语言,用于访问和处理数据库的标准的计算机语言

  1. 数据定义:DDL(Data Definition Language)
    • 库的创建删除、表的创建删除等
  2. 数据操纵:DML(Data Manipulation Language)
    • 新增数据、删除数据、修改数据等
  3. 数据控制:DCL(Data ControlLanguage)
    • 新增用户、删除用户、密码修改、权限管理等
  4. 数据查询: DQL(Data Query Language)
    • 基于需求查询和计算数据

SQL语言的特征

  • 大小写不敏感
  • 通过分号;结尾
  • 支持单行多行注释
单行注释:-- 注释内容(--后面一定要有一个空格)
单行注释:# 注释内容(# 后面可以不加空格,推荐加上)
多行注释:/*注释内容*/- 

DDL

库管理

# 查看数据库
SHOW DATABASES# 使用数据库
USE 数据库名称;
# 创建数据库
CREATE DATABASE 数据库名称 [CHARSET UTF8];
# 删除数据库
DROP DATABASE 数据库名称 ;
# 查看当前使用的数据库
SELECT DATABASE();

表操作

# 查看有哪些表
SHOW tables; # 需要先选择数据库
# 删除表
DROP TABLE 表名称;
DROP TABLE IF EXISTS 表名称;
# 创建表
CREATE TABLE 表名称(
    列名称 列类型,
    列名称 列类型,
);
/*
列类型有
int                     整数
float                   浮点数
varchar(长度)           文本,长度为数字,做最大长度限制
date                    日期类型
timestamp               时间戳类型
*/

字符串出现必须用单引号

DML

插入,删除,更新

数据插入INSERT

INSERT INTO 表[(列1_1,列2_2,\cdots,列N_N)] VALUES(值1_1,值2_2,\cdots,值N_N)[,(值1_1,值2_2,\cdots,值N_N),\cdots,(值1_1,值2_2,\cdots,值N_N)]

# sample
# 仅插入id列数据
INSERT INTO student(id) VALUES(10001)(10002)(10003)
# 插入全部列数据
INSERT INTO student(id,name,age) VALUES(10001,'周杰轮',31),(10002,'王力鸿',33),(10003,'林俊节',26)
#插入全部列数据,快捷写法
INSERT INTO student VALUES(10001,'周杰轮',31),(10002,'王力鸿',33),(10003,'林俊节'26)

关于单独插入某几类数据的结果
首先只插入两个含id成员的数据
insert-only-id.png
其次在其基础上再只插入两个name成员,可以看到没有更新而是插入两个新的数据
insert-only-name.png

数据删除DELETE

DELETE FROM 表名称 [WHERE 条件判断]
条件判断:列 操作符 值
操作符:= < <= >= != 等等,如
id = 5
id < 3
id >= 6
id != 5

DROP TABLE IF EXISTS student; # 备份sql中一般都有这样的语句,如果是数据库中有这个表,先drop掉,然后create表,然后再进行数据插入。
CREATE TABLE student(
    id INT,
    name VARCHAR(20),
    age INT
)
INSERT INTO student VALUES(10001,'周杰轮',31),(10002,'王力鸿',33),(10003,'林俊节',35),(10004,'张学油',36),(10005,'刘德滑',30);

# 删除name为林俊节的数据
DELETE FROM student WHERE name ='林俊节';# 注意,不要忘记'',而且这里判断等于用的是一个等号
# 删除age > 33 的数据
DELETE FROM student WHERE age > 33;
# 删除全部数据
DELETE FROM student;

数据更新UPDATE

UPDATE 表名 SET 列=值 [WHERE 条件判断]
没有where条件表示改变此列所有的值为新值

DROP TABLE IF EXISTS student;
CREATE TABLE student(
    id INT,
    name VARCHAR(20)
    age INT
)
INSERT INTO student VALUES(10001,'周杰轮',31),(10002,'王力鸿',33),(10003,'林俊节'35),(10004,'张学油',36),(10005,'刘德滑',30);

# 修改id为10001的name为陈一讯
UPDATE student SET name = '陈一讯' WHERE id = 10001;

# 修改全部数据的age为11
UPDATE student SET age = 11;

数据查询DQL

  1. 基础查询
  2. 排序聚合
  3. 排序分页

基础查询

在SQL中,通过SELECT关键字开头的SQL语句,来进行数据的查询
基础语法:

SELECT 字段列表|* FROM 表

DROP TABLE IF EXISTS student;
CREATE TABLE student(
    id INT,
    name VARCHAR(20),
    age INT
)

INSERT INTO student VALUES(10001,'周杰轮',31),(10002,'王力鸿',33),(10003,'林俊节',35),(10004,'张学油',36),(10005,'刘德滑',30);
#查询id和name两个列
SELECT id,name FROM student;
#查询全部列
SELECT id,name,age FROM student;
# 查询全部列,快捷写法
SELECT * FROM student;

分组聚合

分组聚合应用场景非常多,如: 统计班级中,男生和女生的人数。
这种需求就需要

  • 按性别分组
  • 统计每个组的人数
    这就称之为:分组聚合

基础语法:

SELECT 字段|聚合函数 FROM 表[WHERE 条件] GROUP BY 列

聚合函数有:

  • SUM(列) 求和
  • AVG(列) 求平均值
  • MIN(列) 求最小值
  • MAX(列) 求最大值
  • COUNT(列|*) 求数量
SELECT gender, AVG(age) from student GROUP BY gender;
# 字段中加入name报错,因为组的平均不能由一个名称替代

语法限制:group by写了谁,select字段中才能选择谁
一个sql可以写多个聚合

排序

对查询结果进行排序

可以对查询的结果,使用ORDER BY 关键字,指定某个列进行排序,语法

SELECT|聚合函数|* FROMWHERE ...
GROUP BY ...
ORDER BY ... [ASC | DESC]

分页

SELECT|聚合函数|* FROMWHERE ...
GROUP BY ...
ORDER BY ... [ASC | DESC]
LIMIT n[,m]

LIMIT如果是单参数n则为列出前n列数据
如果是n,m,则指从序号n+1开始列举m列数据

pymyspl

基础使用

from pymysql import Connection

# 获取到MySQL数据库的链接对象
conn = Connection(
    host="127.0.0.1",  # 主机名(ip)
    port=3306,  # 端口
    user="root",  # 用户名
    password="123456",  # 密码
)

# 测试
print(conn.get_server_info())

# 获取游标对象
cursor = conn.cursor()
conn.select_db("test")  # 选择数据库

使用游标对象执行sql语句
1.执行非查询性质的sql
cursor.execute(
    """CREATE TABLE test_pymysql(
        id INT,
        info VARCHAR(255)
)"""
)

# 关闭对数据库的connection
conn.close()

from pymysql import Connection

# 获取到MySQL数据库的链接对象
conn = Connection(
    host="127.0.0.1",  # 主机名(ip)
    port=3306,  # 端口
    user="root",  # 用户名
    password="123456",  # 密码
)

# 获取游标对象
cursor = conn.cursor()
conn.select_db("test")  # 选择数据库

# 2.执行查询性质的sql
cursor.execute("SELECT * FROM students")
# 获取查询结果
results: "tuple" = cursor.fetchall()  # 获取所有列
for line in results:
    print(line)
'''
结果:仅值,无属性
元组里套元组
(1, 'zun', 1.0)
(2, 'kisan', 5.0)
(3, 'reimu', 30.0)
(4, 'marisa', 90.0)
(5, 'sakuya', 20.0)
(6, 'yuyuko', 30.0)
'''

# 关闭对数据库的connection
conn.close()

数据插入

在数据插入中,如果像上文一样链接对象.execute()命令是无法将数据插入到数据表中的
pymysql在执行数据插入或其它产生数据更改的SQL语句时默认是需要提交更改的,即,需要通过代码“确认”这种更改行为。
通过链接对象.commit()即可确认此次行为

from pymysql import Connection

# 获取到MySQL数据库的链接对象
conn = Connection(
    host="127.0.0.1",  # 主机名(ip)
    port=3306,  # 端口
    user="root",  # 用户名
    password="123456",  # 密码
    # autocommit = True # 设置自动提交
)

# 获取游标对象
cursor = conn.cursor()
conn.select_db("test")  # 选择数据库

# 使用游标对象执行sql语句

# 数据插入
# 执行sql
cursor.execute(
    "INSERT INTO students(id,name,score) values(10,'remilia',6),(11,'flandre',23);"
)
# 通过commit确认
conn.commit()

# 关闭对数据库的connection
conn.close()

0 评论:

发表评论