数据库
前言:
本文面向刚入门的群体,在学习时可以多关注我的大纲,大纲是我在入门时经过数据收集,理解后总结出来的学习路径 摘要:本文主要记录对数据库的起步,如了解概念,安装数据库,使用基本指令对数据库进行操作
提示:以下链接都是学习时查阅的资料,整合起来方便查询。
整体架构
狭义的数据库:计算机的存储介质都可以是数据库,存储数据的地方就叫数据库(db)
广义的数据库:数据库管理系统(dbms)
一个完整的数据库体系:
-
存储介质
-
操作系统(os)
-
数据库管理系统(dbms)
-
数据库管理员(dba)
-
应用
-
用户
安装
MySQL :: Download MySQL Community Server
VScode配置MySQL连接使用MySQL_vs code lainjie mysql-CSDN博客
使用
操作库
查看已有数据库:show databases
创建数据库:create database db_name
选择数据库:use db_name
修改数据库参数:alter database db_name
删除数据库:drop database db_name
表结构:
-
增:主语句:create table tb_name
-
删:主语句:drop table tb_name
-
改:主语句:alert table tb_name (增删改)
-
查:主语句:show
例子:
创建新表:create table tb_name(colunm_name,data type,not null/null,defalut,auto_increament,unique key,primary key)
复制已有表:create table tb_name like tb_name
查看数据库的全部表:show tables
查看表基本结构:desc tb_name,show colunms from tb_name,
查看表的详细结构:show create table tb_name
添加新列:alter table tb_name add column cl_name ···· (添加新列的位置)
修改已有列:alter table tb_name alter/change/modify colunm cl_name ·····
删除已有列:alter table tb_name drop colunm cl_name 重命名表:alter table tb_name rename to tb_name
删除表:drop table tb_name
表数据:
-
增:主语句:insert into
子语句: values
-
删:主语句:delete from
子语句: where
-
改:主语句:update
子语句:set
where
-
查:
查询语句的执行顺序
-
FROM / JOIN: 首先执行FROM子句,确定查询将要从哪些表中检索数据。如果有JOIN子句,它们也会在这一步执行,以确定如何将多个表中的数据结合起来。
-
WHERE: 接下来执行WHERE子句,用于过滤FROM子句或JOIN操作后得到的数据集,只保留满足条件的记录。
-
GROUP BY: 如果有GROUP BY子句,执行它对数据进行分组。这意味着将根据指定的列将数据分成多个组,以便进行聚合计算。
-
AGGREGATE FUNCTIONS: 在GROUP BY之后,执行任何聚合函数(如MAX(), MIN(), SUM(), AVG(), COUNT()等),这些函数对每个分组的数据进行计算。
-
HAVING: 如果有HAVING子句,执行它以过滤分组后的数据。HAVING子句类似于WHERE子句,但它用于过滤分组后的数据,而不是单个记录。
-
SELECT: 然后执行SELECT子句,确定最终结果集中应包含哪些列。
-
DISTINCT: 如果SELECT子句中有DISTINCT关键字,执行它以消除结果集中的重复行。
-
ORDER BY: 最后执行ORDER BY子句,根据指定的列对结果集进行排序。
-
LIMIT / OFFSET: 如果有LIMIT或OFFSET子句,它们是最后执行的,用于限制结果集的大小或跳过一定数量的记录。
-
单表查询:
主语句:select
子语句:
-
from
-
where
-
group by
-
having
-
order by
-
limit
-
-
多表查询:
-
交叉连接:
-
内连接:
-
外连接:
-
自连接:
-
-
子查询:
-
in子查询:
-
比较子查询:
-
exists子查询:
-
-
联合查询:
-
例子:
为表所有列插入数据:insert into tb_name values
为表指定列插入数据:insert into tb_name (列名·····)values ( 数据·····)
替换已有数据:replace into tb_name values
将已有表数据插入另一个表中:insert into tb1_name select * from tb2_name
修改表中指定的某个数据:update tb_name set (列) = (数据) where (条件)
修改表中已有的全部数据:update tb_name set (列) = (数据)
删除表中指定数据:delete from tb_name where (列) = (数据)
删除所有数据:delete from tb_name / truncate tb_name
显示指定列的数据:select (列) from tb_name
显示指定列的数据并为显示的列区别名:select (列) as (别名),(列) as (别名) from tb_name
显示全部列的数据:select * from tb_name
显示符合指定规则的数据:select * from tb_name where (条件)
显示使用聚合函数后的数据:select (聚合函数)(列) as (别名)from tb_name
显示使用聚合函数以及分组后的数据:select (聚合函数)(列) as (别名)from tb_name where (条件) group by (分组条件)
显示分组后进一步筛选出来的数据:select (聚合函数)(列) as (别名)from tb_name where (条件) group by (分组条件) having (筛选条件)
显示排序后的数据: 显示有限制数量的数据:
视图:
视图结构:
-
增:主语句:create or replace view view_name as
子语句:select ··········
-
删:主语句:drop view view_name
-
改: 主语句:alert view view_name
-
查:
视图数据:
-
增:
-
删:
-
改:前提:更新的视图是可更新视图。当视图不是由一个基表而是进行过其他加工操作创建的视图为不可更新视图
可更新视图进行更新视图数据的操作与操作表数据是相同的。
-
查:主语句:select ···············
索引:
-
增:
-
删
-
改
-
查
应用题
-
查询score表中学号为196004,课程号为1201的学生成绩。
SELECT grade FROM score WHERE sno = '196004' AND cno = '1201';
-
查询student表中姓周的学生情况。
SELECT * FROM student WHERE sname LIKE '周%';
-
查询通信专业最高学分的学生的情况。
SELECT * FROM student WHERE major = '通信' ORDER BY credit DESC LIMIT 1;
-
将计算机专业的学生按出生时间升序排列。
SELECT * FROM student WHERE major = '计算机' ORDER BY sbirthday ASC;
-
查询1004课程的最高分、最低分,平均成绩。
SELECT MAX(grade) AS max_grade, MIN(grade) AS min_grade, AVG(grade) AS avg_grade FROM score WHERE cno = '1004';
-
查询各门课程最高分的课程号和分数,并按分数降序排列。
SELECT cno, MAX(grade) AS max_grade FROM score GROUP BY cno ORDER BY max_grade DESC;
-
查询至少有3名学生选修且以4开头的课程号和平均分数。
SELECT cno, AVG(grade) AS avg_grade FROM score WHERE cno LIKE '4%' GROUP BY cno HAVING COUNT(sno) >= 3;
-
查询选修3门以上课程且成绩在85分以上的学生的情况
SELECT * FROM student WHERE sno IN (SELECT sno FROM score WHERE grade > 85 GROUP BY sno HAVING COUNT(cno) > 3);
-
查找选修了“英语”的学生姓名及成绩。
SELECT sname, grade FROM student JOIN score ON student.sno = score.sno WHERE cno = (SELECT cno FROM course WHERE cname = '英语');
-
查询选修了“高等数学”且成绩在80分以上的学生情况,
SELECT * FROM student WHERE sno IN (SELECT sno FROM score WHERE cno = (SELECT cno FROM course WHERE cname = '高等数学') AND grade > 80);
-
查询选修某课程的平均成绩高于85分的教师姓名。
SELECT tname FROM teacher WHERE tno IN (SELECT tno FROM course WHERE cno IN (SELECT cno FROM score GROUP BY cno HAVING AVG(grade) > 85));
-
查询选学1201号课程或选学1004号课程的学生姓名、性别、总学分。
SELECT sname, ssex, SUM(credit) AS total_credit FROM student JOIN score ON student.sno = score.sno JOIN course ON score.cno = course.cno WHERE score.cno = '1201' OR score.cno = '1004' GROUP BY student.sno;
-
查询每个专业最高分的课程名和分数。
SELECT major, cname, MAX(grade) AS max_grade FROM student JOIN score ON student.sno = score.sno JOIN course ON score.cno = course.cno GROUP BY major;
-
查询通信专业的最高分。
SELECT MAX(grade) AS max_grade FROM student JOIN score ON student.sno = score.sno WHERE major = '通信';
-
查询数据库系统课程的任课教师。
SELECT tname FROM teacher WHERE tno IN (SELECT tno FROM course WHERE cname = '数据库系统');
-
查询成绩高于平均分的成绩记录。
SELECT * FROM score WHERE grade > (SELECT AVG(grade) FROM score);
-
查询数学成绩第2~5名的信息。
SELECT * FROM score WHERE cno = (SELECT cno FROM course WHERE cname = '数学') ORDER BY grade DESC LIMIT 1, 4;