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

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.xdnf.cn/news/15358.html

相关文章:

  • 2025上海市“星光计划“信息安全管理与评估赛项二三阶段任务书
  • Spring高级特性——反射和动态代理的性能优化
  • Python---上下文管理器
  • 移动端设备本地部署大语言模型(LLM)
  • 无需付费即可利用AI消除音频噪声和生成字幕
  • 浏览器渲染原理与性能优化全解析
  • 【零基础入门unity游戏开发——unity3D篇】3D光源之——unity反射和反射探针技术
  • 在线事务处理OLTP(Online Transaction Processing)负载是什么?
  • 08.如何正确关闭文件
  • QML 自定义Model基础之QAbstractListModel
  • iw 命令 -- linux 无线管理
  • python kivy 打包apk
  • Ampace厦门新能安科技Verify 测评演绎数字推理及四色测评考点分析、SHL真题题库
  • 入职华为od一个月的感受
  • 用 Node.js 构建模块化的 CLI 脚手架工具,从 GitHub 下载远程模板
  • 【Vue】浏览器缓存 sessionStorage、localStorage、Cookie
  • 初级网安作业笔记1
  • 人工智能之数学基础:神经网络的矩阵参数求导
  • S7-1200 与 ET200SP:PROFINET 设备关键数据 IP 地址、MAC 地址及 MRP 环状态获取
  • Spring Boot RESTful API 设计指南:查询接口规范与最佳实践
  • 在新版本的微信开发者工具中使用npm包
  • java8 ConcurrentHashMap 桶级别锁实现机制
  • css如何同时给元素设置背景和背景图?
  • 004_Claude功能特性与API使用
  • 垃圾收集器-Serial Old
  • Java_Springboot技术框架讲解部分(二)
  • 飞算JavaAI:开启 Java 开发 “人机协作” 新纪元
  • PyTorch武侠演义 第一卷:初入江湖 第3章:神经网络派的绝世武功
  • 全星质量管理QMS软件系统——汽车零部件制造业数字化转型的质量管理中枢
  • Mybatis 两级缓存可能导致的问题