python基础

输入输出

a = input("请输入:\n")
b = 18
print(f"大家好,我是{a},今年{b}岁")

# 以下是{}占位符的另外用法
x = "wsda"
y = 12.1982
print(f"第一个字符{x:^10},第二个浮点数{y:.4f}")

# 还有< ^ >的相关用法,如果有空可以试试


数值类型转换

int(n)

转整型

float(n)

转浮点型

str(n)

转字符串

list(n)

转列表

typle(n)

转元组

eval(n)

返回表达式计算结果

# eval返回表达式的计算结果
a = eval(input())
print(type(a))
print(a)

条件判断

# 条件语句
def col(a,b,c):
    return (b-a)*c

income = int(input())
if income <= 5000:
    print(income)
elif income <= 8000:
    print(col(5000,8000,0.03))
elif income <= 17000:
    print(col(5000,8000,0.03)+col(8000,income,0.1))
elif income <= 30000:
    print(col(5000,8000,0.03)+col(8000,17000,0.1)+col(17000,income,0.2))
else:
    print(col(5000,8000,0.03)+col(8000,17000,0.1)+col(17000,30000,0.2)+col(30000,income,0.25))

match语句(python 3.10之后引入的)

match-case

case _判断剩下的所有

a = int(input())
match a:
    case 1:
        print(a)
    case 2:
        print(a)
    case _:
        print("xxx")

mysql

1、数据库的概念

数据:能被计算机识别并处理的的符号集合。例如:数值、视频、音频、TXT文本等

数据库:数据库是有组织可共享的、持久存储和管理数据的容器。

数据库的好处:1、持久化数据到本地 2、可以实现结构化查询、方便管理

数据库的分类:

关系型数据库:一系列相互关联的二维表【行列】组成的数据库

非关系型数据库:又称NoSQL是存储数据时,不依靠固定的表组成的数据库。

        eg:键值对模型:以键值对存储数据

                文档模型:以一个个文档来存储数据

                列模型:一列来存储数据,一列为一条数据

关系型数据库管理系统主要有MySQL,Orcale,SqlServer,DB2等

非关系型数据库管理系统主要有redis,memcache,mongoDB,Hbase等

2、数据库系统的组成

数据库、数据库管理系统、数据库应用程序、人员

3、 MySQL的优点

  1. 多语言支持:MySQL为C、C++、Python、Java等多种编程语言提供了API(接口),访问和使用方便。
  2. 可以移植性好:MySQL是跨平台的(Linux、windows、macOS、鸿蒙等)。
  3. 支持大量数据查询和存储:MySQL可以承受大量的并发访问。

4、SQL语言

SQL(Structured Query Language)结构化查询语言 ,是访问和处理数据库的标准的计算机语言。

5、navicat数据库使用

MySQL的语法规范

  1. 不区分大小写,但建议关键字大写,表名、列名小写
  2. 每条命令最好用分号结尾
  3. 每条命令根据需要,可以进行缩进 或换行
  4. 注释ctrl+/ 单行注释:# 注释文字

        单行注释:-- 注释文字

        多行注释:/* 注释文字 */

5.1 数据类型

数据表是由字段和记录组成的,字段由数据类型和约束条件组成。

不同数据按照不用数据类型存储,方便清晰。

  1. 来到超市,会发现,摆放粮油的货架大小 和 摆放巧克力等零食的货架大小,不一样大小。
  2. 不同的数据,使用不同的数据类型存储,内存中分配的空间大小是不一样的。
  3. 为了合理的使用内存空间,方便清晰的存储数据,一定要合理的声明数据的数据类型。

python中数据类型有—— 数值、列表、字典、元组、集合等

C语言中数据类型有—— 整型、字符型、浮点型、指针、数组、结构体、共用体、枚举等

数据库兼容数值类型、字符串类型、时间日期类型 三种数据类型

类型1:数值

以上分别是1字节 2字节 3字节 6字节 8字节的整数

有符号数和无符号数:

有符号数区分正负 [-128, +127] 计算机中使用 0表示正 1表示负

无符号数没有正负之分 unsigned int [0, 255]

tinyint是8位的整数,位是什么东西?【内存单元】

  1. 位 最小单元 bit
  2. 字节 基本单元 Byte 1字节 = 8位 计算机中数据的存储以【字节】为单元
  3. KB 1KB = 1024B
  4. MB
  5. GB
  6. TB
  7. PB

float 和 double的区别是什么?

单精度 和 双精度,小数点的有效位不同。

decimal(5, 2)

类型2:字符串

类型3:时间日期

5.2 约束条件

使用约束条件,约束条件是用于约束和规范数据的规则。

6、操作数据表

1、查看数据表

SHOW TABLES;

2、创建数据表

CREATE TABLE table_name(

        字段1 数据类型 约束条件,

        字段2 数据类型 约束条件,

)character set 字符集;

3、查看表的创建语句

SHOW CREATE TABLE 表名;

4、查看表结构

DESC 表名;

5、修改表名

RENAME TABLE 原表名 TO 新表名;

【注意:有时出错是因为没有获得修改权限,可以使用下面修改方式:

ALTER TABLE 原表名 RENAME TO 新表名; 】

6、练习1

1、创建学生表 std1 id字段(不为负的整数,自增长,主键,不为空) name字段(数据类型为varchar(20),默认值为空字符串) age字段(数据类型为tinyint,不为负数;默认值为0) height字段(数据类型为decimal(5,2);默认值为0.0) gender字段(数据类型为enum,其中包括男,女,保密) 2、查看创建学生表的语句,查看表结构

CREATE TABLE std1(
	id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL,
	name VARCHAR(20) DEFAULT(''),
	age TINYINT UNSIGNED DEFAULT(0),
	height DECIMAL(5,2) DEFAULT(0.0),
	gender ENUM('男','女')
)

SHOW CREATE TABLE std1;

DESC std1;

7、增加数据表字段

ALTER TABLE 表名

ADD 列名 类型[约束类型]

8、修改数据表字段

ALTER TABLE 表名

CHANGE 原字段名 新字段名 类型【约束】;

注:如果原字段名与新字段名相同,此时和modify作用一样

ALTER TABLE 表名

MODIFY 字段名 类型 【约束】。

9、删除数据表字段

ALTER TABLE 表名 

DROP 字段名;

10、删除数据表

DROP TABLE 表名;

11、练习2

第1题: 创建班级(classes)表 id字段(不为负的整数,自增长,主键,不为空) name字段(数据类型为varchar(20),默认值为空) 班级表中增加字段 (course varchar(20) comment “课程”) 修改班级表中course字段 (将course字段改为courses) 查询一下表结构 desc classes;

第2题: 在终端指令处,进行如下操作: 进入数据库、查询所有数据库、创建数据库AI25071、创建数据表tb1[其中 包含id name等字段]、查询表结构、添加字段age、修改name字段类型为 varchar(20)、查询表结构、移动name字段到首列、删除字段age、查询表结构

-- 练习2
CREATE TABLE classes(
	id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL,
	name VARCHAR(20) DEFAULT("")
);

ALTER TABLE classes
ADD course VARCHAR(20) COMMENT "课程";

ALTER TABLE classes
CHANGE course courses VARCHAR(20) COMMENT "课程";

DESC TABLE classes;
use hqyj;
show databases;
CREATE DATABASE AI25071;
use AI25071;
CREATE TABLE tb1(id INT PRIMARY KEY NOT NULL,name VARCHAR(20) NOT NULL);
DESC TABLE tb1;
ALTER TABLE tb1 ADD age INT ;
ALTER TABLE tb1 MODIFY age VARCHAR(20);
DESC TBALE tb1;

7、三范式

1NF 原子化 2NF 完全依赖 3NF 无传递依赖

练习:

1、学生选课表: 学号 | 姓名 | 课程号 | 课程名 | 教师 | 教师职称 | 成绩

改成3NF:首先,确认该表满足1NF;其次,根据业务语义确定主键——由于一个学生可选多门课、一门课可被多名学生选,单属性无法唯一标识记录,故采用联合主键(学号, 课程号);接着检查2NF,发现姓名仅依赖于学号、课程名仅依赖于课程号,均属于对联合主键的部分依赖,因此拆分出学生表(学号, 姓名)与课程表(课程号, 课程名),剩余属性构成选课表(学号, 课程号, 教师, 教师职称, 成绩);再检查3NF,选课表中教师职称依赖于教师、教师依赖于主键,存在传递依赖,故继续拆分出教师表(教师, 教师职称),最终得到选课表(学号, 课程号, 教师, 成绩)。

2、【分析并创建表】设计一个图书馆借阅系统的数据库表结构,至少包含:

  • 图书信息
  • 读者信息
  • 借阅记录

关系联系:

图书信息(书编号,书名,出版社)

读者信息(读者id,读者信息)

借阅记录(读者id书编号借阅时间,是否归还)

8、数据增删改查

1、插入数据

INSERT INTO 表名 (字段1,字段2,...)

VALUES(值1,值2,...)

2、更新数据

UPDATE 表名 

SET 字段1 = 值1,字段2 = 值2,...

[WHERE 条件];

3、删除数据

DELETE FROM 表名【WHERE 条件】;

4、快速清空表

TRUNCATE TABLE 表名;

5、查找数据

1、简单查询

SELECT 列名 FROM 表名 [WHERE 条件];

-- 1.查询年龄大于18的学生信息
SELECT * 
FROM students
WHERE age >18;
-- 2.查询身高大于160的女生信息
SELECT * 
FROM students
WHERE height > 160 AND gender = "女";
-- 3.查询所有姓周的学生信息    【"周%"】
SELECT * 
FROM students
WHERE name LIKE "周%";
-- 4.查询学号为1、3、5的学生信息
SELECT *
FROM students
WHERE id IN (1,3,5);
-- 5.查询身高在[160,180]范围内的学生信息
SELECT * 
FROM students
WHERE height BETWEEN 160 AND 180;
-- 6.查询身高为空值的学生信息(查询缺失值)
SELECT *
FROM students
WHERE height IS NULL;

2、排序与分页

SELECT 列名 FROM 表名 [WHERE 条件] [ORDER BY 列名 [ASC|DESC]] [LIMIT 偏移量, 行数];

SELECT *
FROM students
WHERE gender = "女"
ORDER BY height DESC
LIMIT 3;

3. 聚合函数

函数

说明

COUNT()

计数

SUM()

求和

AVG()

平均值

MAX()

最大值

MIN()

最小值

注:GROUP BY 之后,SELECT 里要么放分组字段,要么放聚合函数(MAX/MIN/COUNT/SUM/AVG),其他裸字段会报错。

4、连接查询

1. 内连接

内连接是返回连接表中符合连接条件记录的连接查询。

包括:显式内连接、隐式内连接

显式内连接:

语法格式: SELECT 字段 FROM 表1 INNER JOIN 表2 ON 连接条件 [WHERE 条件]

隐式内连接:

语法格式: SELECT

2. 外连接

左外连接(以左表为主):

左外连接是以左表为基表,返回左表中所有记录及连接表中符合条件的记录的外连接。

语法格式: SELECT 字段 FROM 表1 LEFT [outer] JOIN 表2 ON 连接条件 [WHERE 条件];

右外连接(以右表为主):

右外连接是以右表为基表,返回右表中所有记录及连接表中符合条件的记录的外连接。

语法格式: SELECT 字段 FROM 表1 RIGHT [outer] JOIN 表2 ON 连接条件 WHERE 条件

字段 FROM 表1,表2 WHERE 表1.条件=表2.条件

SELECT t.name AS "教师名" ,c.	`name`AS "所带班级"
FROM teachers t
LEFT JOIN classes c 
ON t.id = c.teacher_id;

SELECT t.name AS "教师名" ,c.	`name`AS "所带班级"
FROM teachers t
RIGHT JOIN classes c 
ON t.id = c.teacher_id;

连接类型对比:

连接类型

说明

关键字

内连接

只返回两表中匹配的行

INNER JOIN 或 JOIN

左连接

返回左表所有行+右表匹配的行

LEFT JOIN

右连接

返回右表所有行+左表匹配的行

RIGHT JOIN

全连接

返回两表所有行(MySQL不支持)

FULL JOIN

5、子查询

1. 基本子查询

SELECT s.cls_id,s.name,s.age
FROM students s
INNER JOIN(
	SELECT cls_id,MAX(age) as max_age
	FROM students
	GROUP BY cls_id
)m ON s.cls_id = m.cls_id AND s.age = m.max_age
ORDER BY cls_id ASC;

2.ANY/SOME子查询

SELECT cls_id,name,height
FROM students
WHERE height > ANY(SELECT height FROM students WHERE cls_id = 2);

3. ALL子查询

SELECT cls_id,name,height
FROM students
WHERE height > ALL(SELECT height FROM students WHERE cls_id = 2);

ps:今天只到这里了,后续补充

4. IN/NOT IN 子查询

5. EXISTS/NOT EXISTS 子查询

一般用于删除和创建的判断。

综合练习

一些小心得(测试中犯的错)

        1、先筛选再装饰,即WHERE 要在ORDER BY之前(ps.SELECT是最后执行的,在SELECT命名的不能在其他地方使用)但可以在最后使用HAVING实现类似的功能。

        2、CASE WHEN(条件)THEN(输出值)...ELSE (输出值) END AS (标签)可做快速分组

题目:

1、查询每个班级身高最高的学生信息

  • 要求显示班级名称、学生姓名、身高
  • 按班级名称排序
SELECT c.`name` AS '班级名称' ,s.`name` AS '学生姓名',s.height AS '身高'
FROM students s
JOIN classes c ON c.id = s.cls_id
JOIN (SELECT cls_id,MAX(height) AS max_height FROM students GROUP BY cls_id) m ON m.cls_id = s.cls_id
WHERE s.height = m.max_height AND m.cls_id = s.cls_id
ORDER BY c.`name` ;

2、查询教师带班数量统计

  • 显示教师姓名、带班数量
  • 按带班数量降序排列
SELECT t.name , COUNT(c.id) AS "带班数量"
FROM teachers t 
JOIN classes c ON c.teacher_id = t.id
GROUP BY t.`name`
ORDER BY COUNT(c.id) DESC;

3、查询学生年龄分布情况

  • 按12岁为一个年龄段分组统计        

    1-12 少年

    13-24 青少年

    25-36 青年

    37-48 中年

    49-60 中老年

  • 显示年龄段、学生人数、占总人数百分比

这道题我遇到了问题,我一直在想着怎么建立个子查询将组分开,但是可以用case when age between and进行分组

SELECT CASE 
	WHEN age BETWEEN 1 AND 12 THEN
		"少年"
	WHEN age BETWEEN 13 AND 24 THEN
		"青少年"
	WHEN age BETWEEN 25 AND 36 THEN
		"青年"
	WHEN age BETWEEN 37 AND 48 THEN
		"中年"
	WHEN age BETWEEN 49 AND 60 THEN
		"中老年"
	ELSE
		"老年"
END AS "年龄段",
COUNT(*) AS "学生人数",
COUNT(*) / SUM(COUNT(*)) OVER() *100 AS "占总人数百分比"
FROM students
GROUP BY 
CASE 
	WHEN age BETWEEN 1 AND 12 THEN
		"少年"
	WHEN age BETWEEN 13 AND 24 THEN
		"青少年"
	WHEN age BETWEEN 25 AND 36 THEN
		"青年"
	WHEN age BETWEEN 37 AND 48 THEN
		"中年"
	WHEN age BETWEEN 49 AND 60 THEN
		"中老年"
	ELSE
		"老年"
END;

注:OVER()可用于解决嵌套聚合函数报错的问题

如果顺着我之前的子表的思路可以做以下调整

维度表设计:age_groups

CREATE TABLE age_groups (
    id INT PRIMARY KEY AUTO_INCREMENT,
    min_age INT NOT NULL COMMENT '年龄段下限',
    max_age INT NOT NULL COMMENT '年龄段上限',
    label VARCHAR(20) NOT NULL COMMENT '年龄段名称',
    sort_order INT NOT NULL DEFAULT 0 COMMENT '排序权重',
    UNIQUE KEY uk_age_range (min_age, max_age)
) COMMENT='年龄段配置表';
INSERT INTO age_groups (min_age, max_age, label, sort_order) VALUES
(1, 12, '少年', 1),
(13, 24, '青少年', 2),
(25, 36, '青年', 3),
(37, 48, '中年', 4),
(49, 60, '中老年', 5);
SELECT 
    ag.label AS `年龄段`,
    COUNT(s.id) AS `学生人数`,
    ROUND(
        COUNT(s.id) * 100.0 / 
        NULLIF((SELECT COUNT(*) FROM students WHERE age BETWEEN 1 AND 60), 0), 
        2
    ) AS `占总人数百分比`
FROM students s
JOIN age_groups ag 
    ON s.age BETWEEN ag.min_age AND ag.max_age
WHERE s.age BETWEEN 1 AND 60
GROUP BY ag.label, ag.sort_order
ORDER BY ag.sort_order;

仅作思路。

4、查询班级间的身高差异

    • 计算每个班级的最高、最低和平均身高
    • 计算全校平均身高
    • 显示班级身高与全校平均身高的差值
SELECT cls_id,MAX(height) ,MIN(height),AVG(height),AVG(height) - (SELECT AVG(height) FROM students),(SELECT AVG(height) FROM students)
FROM students
GROUP BY cls_id;

注:有点燃尽了,细节就不写了

5、查询没有学生的班级及其班主任信息

    • 使用LEFT JOIN和IS NULL实现
    • 再使用NOT EXISTS实现一次
    • 比较两种方法的执行计划
SELECT 
    c.id AS `班级ID`,
    c.name AS `班级名称`,
    t.name AS `班主任姓名`
FROM classes c
LEFT JOIN teachers t ON c.teacher_id = t.id
LEFT JOIN students s ON s.cls_id = c.id
WHERE s.id IS NULL;
SELECT 
    c.id AS `班级ID`,
    c.name AS `班级名称`,
    t.name AS `班主任姓名`
FROM classes c
LEFT JOIN teachers t ON c.teacher_id = t.id
WHERE NOT EXISTS(SELECT 1 FROM students s WHERE s.cls_id = c.id);

查询就到这吧

更多推荐