用MYSQL学习sql第一次总结和作业

发布于:2025-07-16 ⋅ 阅读:(15) ⋅ 点赞:(0)

总结

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

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

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

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

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

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

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

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

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

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

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

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

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

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

查询 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

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

 mysql端口号:3306
mysql体系架构:
 (1)网络连接层

 (2)数据服务层

 (3)存储引擎层 (innodb事物管理(MyISAM) )

 (4)文件系统层(物理存储层)

客户端的连接指令
mysql

 -u用户名

 -p密码

 -h 主机名/ip #(localhost/127.0.0.1默认)

 -P 端口

 -D 库名

 -e sql语句 #直接在客户端连接时执行sql语句不登录mysql管理系统

1.4 sql 4大类别
 ? 获取关键字的语法

 \c 清空当前命令,不执行当前命令

 \d 指定sql结束字符 默认结束字符;

 \! 调用系统指令 system

 \q 退出 exit quit

2. DDL数据库定义语句
2.1 库
show展示(查看)
show databases|tables|warnings;
show databases like '模糊值';   #‘%my%’
            %  任意长度任意字符
             _  任意单个字符
mysql> create database db2 character set utf8mb4 collate utf8mb4_general_ci;
Query OK, 1 row affected (0.01 sec)     
mysql> select * from  information_schema.schemata;
create
create database 数据库名;
create database if not exists 数据库名;
use 数据名
use mysql   进入mysql数据库
drop 删除
drop  database 库名;
⚠️mysql引号区别:

 `` 将关键字可以引用作为数据值创建

 ‘’ “” 引用字符串数据值

2.2 表定义语句
create table 表名 (字段名1 数据类型,字段名2 数据类型,....);
drop  table  表名;   #在对应的数据库下删除

show tables; 显示库下的所有表

显示表字段名(列名)
desc|describe|explain  
desc 表名;
show columns from 表名;

复制表
create table 新表名 like 旧表;  #仅复制旧表的表结构给新表
insert  into 新表名  select  * from 旧表;   #将旧表数据插入到新表 (旧表 和新表字段和数据类型一致)
create table 新表名 select * from  旧表名;  #复制旧表的表结构以及表数据给新表
5.5  5.8
DQL数据查询语言 select
select 查询表数据

 函数结果

select          函数结果
select database();
select version();
       now()
       current_date()
       current_time()
       user()

 

 

创建数据库

CREATE DATABASE mydb6_product;
USE mydb6_product;

按顺序建 3张表

(1)employees 员工表

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

(2)orders 订单表

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

(3)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)
);

做好之后可以使用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;

 


网站公告

今日签到

点亮在社区的每一天
去签到