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 CASCADE
主表删除从表自动删除
ON 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;

权限列表:要授予的权限(如SELECTINSERT,多个权限用逗号分隔,所有权限用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 中专门用来赋值的关键字,如果为空,就用SETldate赋值为当前日期(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.只能用于整数类型的字段(如 INTBIGINT
  • 网状模型与具体计算机无关。在数据库的三大经典数据模型(层次、网状、关系)中,网状模型属于概念模型,它的设计目的是描述数据之间的逻辑关系,和具体的计算机硬件、操作系统等物理环境是相互独立的。
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐