计算机二级MySQL自学笔记
SELECT查询数据INSERT插入数据新增数据UPDATE修改数据更新数据DELETE删除数据删除数据ALTER修改表结构(如添加字段、修改字段类型)CREATE创建数据库 / 表 / 视图DROP删除数据库 / 表 / 视图
视图
#不是很懂 写题的时候逻辑有点难理解哦
CREATE [OR REPLACE] VIEW 视图名 [(视图列名列表)] AS
--OR REPLACE可选:如果视图已存在,覆盖原有视图
查询语句
[WITH [CASCADED | LOCAL] CHECK OPTION];--可选
示例
看着不难 但写题写不对
-- 创建基础视图(单表查询)
CREATE VIEW v_student_info
AS
SELECT sname, age, smajor
FROM tb_student
WHERE smajor = '计算机';
-- 多表连接(常考)
CREATE VIEW v_student_class
AS
SELECT s.sname, c.class_name
FROM tb_student s
JOIN tb_class c ON s.class_id = c.class_id;
-- 分组统计
-- 显式指定视图列名,避免依赖查询语句的别名
CREATE VIEW v_major_num (smajor, snumber)
AS
SELECT s.smajor, COUNT(DISTINCT g.sno)
FROM tb_student s
LEFT JOIN tb_gs g ON s.sno = g.sno
GROUP BY s.smajor;
外键
- 主表(父表):被关联的表,外键字段必须是主表的主键或唯一索引(比如
tb_class班级表,class_id是主键); - 从表(子表):关联主表的表;
- 外键(Foreign Key)的作用是关联两张表的字段,保证数据的完整性和一致性。外键必须关联主表的唯一索引字段(主键 / 唯一约束字段)
创建表时建立外键语句
--创建表时建立外键
CREATE TABLE 从表名 (
字段1 类型 约束,
字段2 类型 约束,
-- 定义外键
FOREIGN KEY (从表外键字段) REFERENCES 主表名(主表关联字段)
[ON DELETE 操作] [ON UPDATE 操作] -- 可选:级联操作
);
ON DELETE SET NULL主表删除从表关设为NULL主表删除从表自动删除
ON DELETE CASCADEON UPDATE CASCADE主表更新关联字段值从表关联字段同步更新ON DELETE RESTRICT主表删除的行若有从表关联数据,禁止删除(默认值)
添加外键语句
ALTER TABLE 从表名
ADD CONSTRAINT 外键名 -- 自定义外键名称(见名知意即可)
FOREIGN KEY (从表外键字段) REFERENCES 主表名(主表关联字段);
疑惑:创建表时直接定义外键 为啥没有ADD CONSTRAINT 外键名 添加时却有ADD CONSTRAINT 外键名 是修改表结构(ALTER TABLE) 时的语法,而创建表(CREATE TABLE)时定义外键属于表结构初始化,语法更简洁,无需ADD(添加)这个动作,外键名也可省略(MySQL 会自动生成)
例子
-- 1. 创建主表:班级表(tb_class),class_id是主键
CREATE TABLE tb_class (
class_id INT PRIMARY KEY AUTO_INCREMENT, -- 班级ID(主键)
class_name VARCHAR(20) NOT NULL -- 班级名称
);
-- 2. 创建从表:学生表(tb_student),class_id作为外键关联班级表
CREATE TABLE tb_student (
sno INT PRIMARY KEY AUTO_INCREMENT, -- 学号(主键)
sname VARCHAR(20) NOT NULL, -- 姓名
class_id INT, -- 班级ID(外键字段)
-- 定义外键:关联班级表的class_id
FOREIGN KEY (class_id) REFERENCES tb_class(class_id)
ON DELETE SET NULL -- 可选:主表删除班级时,从表该字段设为NULL
ON UPDATE CASCADE -- 可选:主表更新班级ID时,从表同步更新
);
授权
核心语法
--创建用户
CREATE USER '用户名'@'访问主机' IDENTIFIED BY '密码';
--授权
GRANT 权限列表 ON 数据对象 TO '用户名'@'访问主机' [IDENTIFIED BY '密码'];
-- 撤销testuser对testdb库所有表的INSERT权限
REVOKE INSERT ON testdb.* FROM 'testuser'@'localhost';
-- 刷新权限
FLUSH PRIVILEGES;
权限列表:要授予的权限(如SELECT、INSERT,多个权限用逗号分隔,所有权限用ALL)数据对象:权限作用范围(如testdb.*代表 testdb 库下所有表,*.*代表所有库所有表)
例题-基本操作题
#今天练两个基本操作题 题目素材来源b站
题目1.社团数据库db_accoication 学生表tb_student、社团表tb_group、学生参加社团表tb_gs.
tb_student(sno,sname,smajor)学号、名、专业
tb_group(gno,gname,gdata)社团号、名、创建日期
tb_gs(gno,sno,grole)号、号、角色
1)使用SQL语句在tb_student表添加一个字段ssex,数据类型为char,长度为2,字段值允许为空值,缺省值为"女"。
use db_accociation
alter table tb_student
add column ssex char(2) null default'女';
column是列的意思 default为缺省值也就是默认值 题目说允许为空所以加了null 不加应该也行ALTER TABLE用于修改表结构;用于修改表结构;
2)用SQL语句删除"计算机"专业的学生参加社团的信息。
只要 tb_gs 表中的 sno(学号)值,出现在 “子查询查出的所有计算机专业学生的学号列表” 里,就删除这行数据。
delete from tb_gs
where sno in(select sno from tb_student where amajor='计算机');
SELECT 字段/聚合函数 -- 1. 提取字段
FROM 表名 -- 2. 定位表
JOIN 关联表 ON 关联条件 -- 3. 多表连接(如有)
WHERE 行筛选条件 -- 3. 筛选原始行
GROUP BY 分组字段 -- 4. 按字段分组
HAVING 分组后筛选条件 -- 5. 筛选分组结果
ORDER BY 排序字段 ASC/DESC -- 6. 对结果排序
LIMIT 分页参数; -- 7. 限制返回行数
3)使用SQL语句建立一个视图v_number,按照专业统计参加学生社团的人数,设视图包含的列名为smajor(所在专业)、snumber(人数).
create VIEW v_namer AS
Select smajor,COUNT(DISTINCT tb_gs.sno) AS snumber
FROM tb_student
JOIN tb_gs ON tb_student.sno=tb_gs.sno
GROUP BY tb_student.smajor
JOIN:等价于INNER JOIN(内连接),作用是把tb_student(学生表)和tb_gs(社团表,gs大概率是 “社团” 拼音缩写)关联起来;
GROUP BY:分组关键字,作用是把查询结果按smajor(专业)分组;这里配合COUNT()使用。
4)使用SQL语句在tb_gs表上建立外键,属性sno参照学生表的sno。
alter table tb_gs
add constraint tb_gs_fk
foreign key (sno) references tb_student(sno);
5)新建一个名称为tmpuser的用户,密码是a12345,并为其授予对tb group表的SELECT、INSERT权限。
create user 'tmpuser'@'localhost' identified by 'a12345';
grant select,insert on tb_group to 'tmpuser'@'localhost' identified by 'a12345';
题目二.图书借阅管理系统数据库db_book中包含一个图书借阅信息表tb_book:
tb_book(bno,bname,btype,publisher,ldate,price,desc1),各字段的含义依次为:借阅号、图书名、图书类型、出版社、借出日期、图书价格、图书简介。
上述数据库及数据表已经创建,请按要求完成以下操作。
1)将借阅表中图书"MySQL程序设计"的价格上调至42元。
update tb_book set price=42 where bname='MySQL程序设计';
-- UPDATE 表名
-- SET 字段1=值1, 字段2=值2
-- WHERE 条件;
2)在数据库db_book中创建一个视图v_book,要求该视图显示借阅表中出版社为"高等教育出版社"的全部图书借阅信息。
create view v_book as
select*
from db_book
where publisher='高等教育出版社';
3)查询图书类型为"计算机"的图书名称、出版社和图书价格,并将此语句以sij13.txt为文件名存入考生文件夹中。
注意:请将此语句以sj13.txt为文件名存入考生文件夹下,否则没有成绩。
select bname,publisher,price from tb_book where btype='计算机';
4)将借阅表中的图书简介(desc1)字段删除。
alter table tb_book
drop column desc1;
-- column是列
5)在当前系统中新建一个名为client的用户,主机名为localhost,并为其授予借阅表中借阅号(bno)字段和图书名(bname)字段的select权限。
create user 'client'@'localhost' identifided by 'ab1234';
grant select(bon,bname) on to 'client'@'localhost' identifided by 'ab1234';
触发器
触发器是保护表数据的数据库对象,当指定的表发生INSERT(插入数据),UPDATE(修改数据),DEL(删除数据)时候被自动触发,进行相应的动作。分为BEFORE(操作执行前)和AFTER(操作执行后);
作用:数据校验、日志记录、数据同步(如删除主表数据自动删除从表数据)。保证数据的一致性、完整性和正确性。
语法:
-- 第一步:修改语句结束符(避免触发器内的;与默认结束符冲突)
DELIMITER //
-- 第二步:创建触发器
CREATE TRIGGER 触发器名
{BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON 表名
FOR EACH ROW -- 行级触发(考试必写,不可省略)
BEGIN
执行语句;
END //
-- 第三步:恢复默认结束符
DELIMITER
查看触发器
SHOW Triggers [{From|In}db_name]
删除触发器
DROP Trigger [If Exist][schema_namer.]trigger_name --结构,触发器
使用触发器
insert 是new;update,delete是new(不用理解,写题的时候就懂啥意思了)
例题-简单应用题
图书借阅管理系统数据库db_book中包含一个图书借阅信息表tb_book:
tb_book(bno,bname,btype,publisher,ldate,price,desc1).各字段的含义依次为:借阅号、图书名、图书类型、出版社、借出目期、图书价格、图书简介。上述数据库及数据表已经创建,请按要求完成以下操作。
1)请创建一个名为tri_type的触发器,在插入新的借阅记录时,如果借出日期为空,就把它设置为当前日期.。
DELIMITER
CREATE TRIGGER tri_date BEFORE INSERT ON tb_bOOk FOR EACH ROW
BEGIN
IF(ISNULL(NEW.ldate) THEN --NEW.ldate填空
SET NEW.ldate=curdate0; --SET填空
END IF;
END
DELIMITER;
-
NEW代表 “即将插入的新记录”,.ldate就是新记录里的借出日期字段。ISNULL(NEW.ldate)的作用是判断新插入的记录中,借出日期是否为空值。 SET是 MySQL 中专门用来赋值的关键字,如果为空,就用SET将ldate赋值为当前日期(curdate()是 MySQL 获取当前日期的函数)。
2)请创建一个名为sp_counter的存储过程,用于计算借阅表tb_book的图书借阅记录数,并返回该记录数.
DELIMITER
CREATE PROCEDURE sp_counter(OUT rows INT) --OUT填空 定义了一个输出参数 rows,类型是整数。
BEGIN
DECLARE bid INT;
DECLARE FOUND BOOLEAN DEFAULT TRUE;
DECLARE cur_bid CURSOR FOR
SELECT bno FROM tb_book;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET FOUND=FALSE;
SET rows = 0; --0,初始化为0
OPEN cur_bid;
FETCH cur_bid INTO bid; --FETCH:从游标里读取一条记录。把读到的 bno(借阅号)存入变量 bid。是第一次读取来启动遍历
WHILE FOUND DO --WHILE 循环,只要FOUND为TRUE,就会一直循环下去。
SET rows = rows + 1;
FETCH cur_bid INTO bid; --FETCH 游标操作,(前面有一样的一句话)在循环内部再次读取游标,获取下一条记录的 bno。
END WHILE;
CLOSE cur_bid;
END$$
DELIMITER ;
选择题 个人错题整理知识点
AUTO_INCREMENT是 MySQL 中非常常用的关键字,专门用来实现字段值的自动递增,通常和主键配合使用,确保每条记录都有唯一的标识。初始值为1.只能用于整数类型的字段(如INT、BIGINT)- 网状模型与具体计算机无关。在数据库的三大经典数据模型(层次、网状、关系)中,网状模型属于概念模型,它的设计目的是描述数据之间的逻辑关系,和具体的计算机硬件、操作系统等物理环境是相互独立的。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)