当前位置: 首页 > news >正文

sql初学见解

学习sql,我选用的是MySQL。那么现在我会总结一下我最近学到的内容及练习情况。

  1. 数据库(Database)
    理解为“文件夹”,里面可以装很多张表。作业中要求先建一个名字叫 mydb6_product 的数据库。

  2. 表(Table)
    理解为“Excel 工作表”,由“列(字段)”和“行(记录)”组成。

  3. 列(Column / Field)
    表中的一竖条数据,每列都有:
    • 数据类型(整型、字符串、浮点型、日期型)
    • 约束(主键、非空、默认值、外键等)

  4. 主键(Primary Key)
    一列或多列的组合,用来唯一标识一行。相当于“身份证号码”,不能重复,不能为 NULL。

  5. 外键(Foreign Key)
    一张表里的某列引用另一张表的主键。作用:让两张表产生“关联”。
    例:involces 表的 order_id 是外键 → 指向 orders 表的 id。

  6. 自增长(AUTO_INCREMENT)
    整型主键专用,每插入一行自动 +1,省得手写编号。

  7. 非空(NOT NULL)
    该列必须有值,不能留空。

  8. 默认值(DEFAULT)
    插入数据时如果不给值,系统就自动用默认值填充。

  9. 浮点型(FLOAT / DOUBLE)
    存小数,如价格、工资、金额。

  10. 日期型(DATE)
    存年月日,如订单日期。

  11. SQL 语言
    用来“说话”让数据库干活的语言。核心就 4 类:
    • DDL(数据定义):CREATE / DROP / ALTER
    • DML(数据操作):INSERT / UPDATE / DELETE / SELECT
    • DCL(权限控制):GRANT / REVOKE(本次作业暂时用不到)

  12. 数据类型再认识
    • INT(11) —— 整数,括号里的 11 只是“显示宽度”,跟真正存储大小无关。
    • FLOAT(8,2) —— 最多 8 位,其中小数占 2 位(例如 999999.99)。
    • DATE —— 只存年月日,格式 ‘YYYY-MM-DD’。
    • VARCHAR(20) —— 可变长度字符串,最多 20 个字符。

  13. 列级约束/说明
    • NOT NULL —— 这一列必须填值。
    • DEFAULT —— 不给值时的默认值。
    • PRIMARY KEY —— 主键,不能重复。
    • COMMENT —— 给列写中文注释,方便以后看。

  14. 插入数据 INSERT INTO … VALUES …
    把一行行真实数据塞进表里。

  15. 查询 SELECT(本次重点)
    • 基本查询:SELECT * FROM 表名;
    • 去重:SELECT DISTINCT 列名 …
    • 聚合:COUNT()、MAX()、MIN()、AVG()、SUM()
    • 排序:ORDER BY 列名 [ASC|DESC]
    • 条件:WHERE 列名 BETWEEN … AND …、LIKE、IN、AND/OR 等
    • 分组:GROUP BY 列名
    • 分组后再过滤:HAVING 条件
    • 限制返回行数:LIMIT n

  16. 建“新表”并复制数据
    CREATE TABLE 新表名 AS SELECT …;

| 名词/关键字          | 含义 & 用途(一句话记忆)      |
| --------------- | ------------------- |
| INT             | 整型,存整数              |
| VARCHAR(n)      | 变长字符串,最多 n 个字符      |
| FLOAT           | 浮点型,存小数             |
| DATE            | 日期型,格式 'YYYY-MM-DD' |
| PRIMARY KEY     | 主键,唯一且非空            |
| FOREIGN KEY     | 外键,建立两表关联           |
| NOT NULL        | 该列必填                |
| DEFAULT         | 默认值                 |
| AUTO\_INCREMENT | 主键自增                |
| REFERENCES      | 外键指向的表和列            |

| 名词/关键字          | 一句话解释                 |
| --------------- | --------------------- |
| INT(11)         | 整数,括号里的 11 只是显示宽度,可忽略 |
| FLOAT(M,D)      | 浮点数,M 总位数,D 小数位       |
| DATE            | 年月日                   |
| VARCHAR(n)      | 可变长字符串,省空间            |
| PRIMARY KEY     | 主键,唯一标识一行             |
| NOT NULL        | 该列必填                  |
| DEFAULT         | 默认值                   |
| COMMENT         | 给列或表写注释               |
| DISTINCT        | 去重                    |
| COUNT()         | 统计行数                  |
| MAX()           | 最大值                   |
| MIN()           | 最小值                   |
| AVG()           | 平均值                   |
| SUM()           | 求和                    |
| BETWEEN … AND … | 范围查询                  |
| LIKE            | 模糊查询(% 通配符)           |
| GROUP BY        | 按列分组                  |
| HAVING          | 分组后再筛选                |
| ORDER BY        | 排序                    |
| LIMIT n         | 只取前 n 行               |

知识点如此,那么进入练习。

为了做好这一份作业。那么就要进行以下步骤。

创建数据库

CREATE DATABASE mydb6_product;
USE mydb6_product;

按顺序建 3张表

employees 员工表

CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INT,
gender VARCHAR(10) NOT NULL DEFAULT 'unknown',
salary FLOAT
);

1-1 员工表如图

orders 订单表

CREATE TABLE orders (
id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
price FLOAT,
quantity INT,
category VARCHAR(50)
);

1-2订单图

involces 发票表(注意拼写是 involces,作业原图如此)

CREATE TABLE involces (
number INT PRIMARY KEY AUTO_INCREMENT,
order_id INT,
in_date DATE,
totalamount FLOAT CHECK (totalamount > 0),
FOREIGN KEY (order_id) REFERENCES orders(id)
);

1-3发票图

完成!

做好之后可以使用SHOW TABLES; 查看库里的表,用 DESC 表名; 查看表结构,确认无误后就可以插入数据做后续练习了。

好,现在我们来复习下一个内容。

好长的题目啊,脖子都看断了。咱慢慢来。

(1)显示所有职工的基本信息。

SELECT * FROM t_worker;

(2)查询所有职工所属部门的部门号,不显示重复的部门号。

SELECT DISTINCT department_id FROM t_worker;

(3)求出所有职工的人数。

SELECT COUNT(*) AS 总人数 FROM t_worker;

(4)列出最高工和最低工资。

思路:聚合 MAX、MIN。

SELECT MAX(wages) AS 最高工资, MIN(wages) AS 最低工资 FROM t_worker;

列出职工的平均工资和总工资。

思路:聚合 AVG、SUM,保留 2 位小数。

SELECT ROUND(AVG(wages),2) AS 平均工资, ROUND(SUM(wages),2) AS 总工资 FROM t_worker;

(6)创建一个只有职工号、姓名和参加工作的新表,名为工作日期表。
思路:建表并复制三列数据。

CREATE TABLE 工作日期表 AS
SELECT worker_id, name, worker_date FROM t_worker;

(7)显示所有党员的年龄。思路:先算年龄 = 今年 - 出生年;筛选 politics='党员'。

SELECT name, YEAR(CURDATE())-YEAR(borth_date) AS 年龄
FROM t_worker
WHERE politics='党员';

(8)列出工资在 4000–8000 之间的所有职工姓名。

SELECT name FROM t_worker WHERE wages BETWEEN 4000 AND 8000;

(9)列出所有孙姓和李姓的职工姓名。

SELECT name FROM t_worker
WHERE name LIKE '孙%' OR name LIKE '李%';

(10)列出所有部门号为 102 和 103 且不是党员的职工号、姓名。
思路:多条件 AND + IN。

SELECT worker_id, name
FROM t_worker
WHERE department_id IN (102,103) AND politics != '党员';

(11)将职工表 t_worker 中的职工按出生的先后顺序排序。

SELECT * FROM t_worker ORDER BY borth_date;

(12)显示工资最高的前 3 名职工的职工号和姓名。

SELECT worker_id, name
FROM t_worker
ORDER BY wages DESC
LIMIT 3;

(13)求出各部门党员的人数。

SELECT department_id, COUNT(*) AS 党员人数
FROM t_worker
WHERE politics='党员'
GROUP BY department_id;

(14)统计各部门的工资和平均工资并保留 2 位小数。

思路:GROUP BY + SUM/AVG + ROUND。

SELECT department_id,
ROUND(SUM(wages),2)   AS 部门总工资,
ROUND(AVG(wages),2)   AS 部门平均工资
FROM t_worker
GROUP BY department_id;

(15)列出总人数大于等于 3 的部门号和总人数。

思路:分组后统计人数,再用 HAVING 过滤。

SELECT department_id, COUNT(*) AS 总人数
FROM t_worker
GROUP BY department_id
HAVING 总人数 >= 3;

终于打完了,恕我太懒忘记截屏了(),不过主播相信直接把文章中的命令复制上去都能运行(maybe)。

        以上便是对sql一些简单只是的复习及练习思考。感谢大家能看到最后!欢迎批评指正!

http://www.dtcms.com/a/277914.html

相关文章:

  • 多线程死锁
  • 飞算Java AI开发助手:引领智能编程新风尚
  • Llama系列:Llama1, Llama2,Llama3内容概述
  • 【读书笔记】《C++ Software Design》第九章:The Decorator Design Pattern
  • HTML 基本骨架
  • [GWCTF 2019]我有一个数据库
  • SOMEIP协议与测试
  • LeetCode 2401.最长优雅子数组
  • C++数组指针与函数指针
  • 为什么要有延时回调?
  • 2024-2025-2 山东大学《软件工程与实践》期末(回忆版)
  • p4 大小写检查
  • C++高级编程,类模版成员函数类外实现
  • windows10如何安装vue开发环境
  • JAVA-springboot 整合Activemq
  • ECU(电子控制单元)是什么?
  • C++中顶层const与底层const
  • JSX 语法
  • 【前端知识】移动端APP原生应用与H5交互底层逻辑
  • Dubbo跨越分布式事务的最终一致性陷阱
  • 有效感受野(ERF)可视化工具
  • hash表的模拟--开放定址法
  • 如何将本地代码同步到远程Github仓库
  • 【Docker基础】Dockerfile指令速览:环境与元数据指令详解
  • OSPF与BGP的联动特性
  • Utils系列之内存池(MultiSizePool)
  • 【MLLM】多模态理解GLM-4.1V-Thinking模型
  • OpenVela 日志系统:从配置到落地的实操手册
  • Python装饰器(自定义装饰器和3个内置装饰器)
  • Java反射机制深度解析