Mysq数据库面试题从基础到精通超级详细

一、数据库的操作
什么是数据库?
数据库是按照数据结构来组织、存储和管理数据的仓库。常见的数据库软件包括 MySQL、Oracle、SQL Server 等。

什么是关系型数据库,主键,外键,索引分别是什么?
关系型数据库:是依据关系模型来创建的数据库。所谓关系模型就是"一对一、一对多、多对多"等关系模型,因而一个关系型数据库就是由二维表及其之间的联系组成的一个数据组织。

主键:在关系型数据库中,每个表都需要有一个主键来唯一标识每一行数据。主键是一列或一组列,它们的值唯一且不允许为空,用于保证各行数据的唯一性。常见的主键类型包括自增长整数、GUID、字符串等。

外键:是用于建立表与表之间联系的,它是在一个表中创建的指向另一个表的主键的字段。通过定义外键,可以实现表之间的关联。外键还可以用于实现数据的完整性约束,保证数据的一致性和正确性。

索引:是一种特殊的数据结构,用于提高数据库查询的效率。索引可以加速数据搜索和查询,它通常基于某一列或几列数据建立。当使用索引进行数据查询时,数据库系统会直接跳转到索引中的相关位置,从而大幅提高查询效率。常见的索引类型包括B-树索引、哈希索引、全文索引等。

Mysql数据库的操作
数据库创建与删除:

create database db_name;

创建数据库的语法格式为: 

drop datebase db_name;
删除数据库的语法格式为

drop datebase  db_name;
二、表格的操作
三、经典题目
写出表的增删改查SQL语法
表格增加数据:insert/create

insert into  table (column1, column2, column3, ...)
values (value1, value2, value3, ...);
举例:

我们有一张名为 student 的学生表,其中包含学号、姓名、性别、年龄等字段,它的结构如下:

create table student (
    id int primary  KEY AUTO_INCREMENT,
    name varchar(50) not null,
    gender varchar(5) not null,
    age int not null
);
在 student 表格中添加一条新纪录,可以使用以下 SQL 语句:

insert into student (name, gender, age)
values ('Jack', 'Male', 22);
表格删除数据:delete

delete from table where condition;
举例:

如果我们需要删除年龄小于 18 岁的学生,可以使用以下 SQL 语句:

delete from student where age <18;
表格修改数据:update

update table set column1 = value1, column2 = value2, ...
WHEREcondition;
举例:

如果我们需要将学号为 1002 的学生的姓名修改为 "Tom",可以使用以下 SQL 语句:

update student set name ='Tom' where id =1002;
表格查询:select

select column1, column2, ... from table where condition;
举例:

如果我们需要查询所有女生的学号和姓名,可以使用以下 SQL 语句:

select id, name from student where gender ='Female';
什么是多表联查,应该怎么进行
多表联查(或多表查询、关联查询)是在关系型数据库中,通过将多个数据表连接起来,实现跨表查询的一种操作。通过多表联查,可以在多个表中进行复杂的数据过滤与处理,获取到需要的数据结果。

多表联查的 SQL 语句可以使用 JOIN 关键字来实现。其基本语法形式如下:

select column_name(s)
from table_name1
join table_name2
in table_name1.column_name = table_name2.column_name;
ps:column_name(s) 表示要查询的列名,table_name1 和 table_name2 分别表示要进行联查的两个表,而 ON 子句则表示两个表之间进行关联时的条件。

多表联查可以分为三种主要类型:

内连接(Inner Join):它返回两个表中列名相同的行,即只返回满足关联条件的数据。

select column_name(s)
from table_name1
join table_name2
on table_name1.column_name = table_name2.column_name
where condition;
左连接(Left Join):它返回左表中所有的行以及右表中与左表匹配的行,如果右表中没有匹配的行,则返回 NULL 值。

select column_name(s)
from table_name1
left join  table_name2
on table_name1.column_name = table_name2.column_name
where condition;
右连接(Right Join):它返回右表中所有的行以及左表中与右表匹配的行,如果左表中没有匹配的行,则返回 NULL 值。

select column_name(s)
from table_name1
right join table_name2
on table_name1.column_name = table_name2.column_name
where condition;
其中,condition 表示对所查询的结果进行限制的条件。

进行多表联查时,应该注意什么
进行多表联查时,需要注意以下几点:

确认连接字段:多表联查需要通过共同的字段将多张表进行关联,因此需要确认连接字段以确保联查的正确性。

确认联查方式:联查方式包括 INNER JOIN、LEFT JOIN、RIGHT JOIN 等,不同的联查方式会产生不同的结果。需要根据具体情况选择适合的联查方式。

避免重复数据:多表联查可能会导致数据重复,需要使用 DISTINCT 关键字或者 GROUP BY 子句进行去重处理。

表别名的使用:在多表联查时,表名可能相同或者过长,可以使用表别名简化 SQL 语句,提高代码可读性。

确认查询结果:在进行多表联查时,需要确认查询结果是否符合要求,可以通过 LIMIT 等方式限制查询结果,以便查看是否正确。

SQL的表连接方式有哪些?
SQL的表连接方式有以下几种:

内连接(INNER JOIN):使用连接运算符匹配两个表共有的列,返回两个表中均满足连接条件的记录。内连接只会返回已经匹配的行。

外连接(OUTER JOIN):包括三种,分别是左外连接(LEFT JOIN)、右外连接(RIGHT JOIN)和全外连接(FULL OUTER JOIN)。在左、右外连接中都会以一种表为基表,基表的所有行、列都会显示,而外表如果和条件不匹配则所有的外表列值都会为 NULL。全外连接则所有表的行、列都会显示,条件不匹配的值皆为NULL。

交叉连接(CROSS JOIN):返回两个表的笛卡尔积,即将第一个表的每一条记录和第二个表的每一条记录配对组合得到的结果。

下面举例说明如何使用:

内连接(INNER JOIN):

假设有两张表 user_info 和 user_order,其中 user_info 表中存储用户的基本信息,user_order 表中存储用户的订单信息。现在需要查询所有有订单的用户及其订单信息,可以使用 INNER JOIN 连接这两张表:

select ui.*, uo.*
from user_info as ui
inner join  user_order as uo
on ui.user_id = uo.user_id;
外连接(OUTER JOIN):

2.1 左外连接(LEFT JOIN):

继续以上例子,如果需要查询所有用户信息及其订单信息(包括没有订单的用户),可以使用 LEFT JOIN 连接这两张表:

select ui.*, uo.*
from user_info as ui
left join user_order as uo
on ui.user_id = uo.user_id;
2.2 右外连接(RIGHT JOIN):

同理,如果需要查询所有订单信息及其所属用户信息(包括没有用户的订单),可以使用 RIGHT JOIN 连接这两张表:

select ui.*, uo.*
from user_info as ui
right join  user_order as uo
on ui.user_id = uo.user_id;
2.3 全外连接(FULL OUTER JOIN):

如果需要查询所有用户和订单信息(包括没有关联的记录),可以使用 FULL OUTER JOIN 连接这两张表:

select ui.*, uo.*
from user_info as ui
full outer join  user_order as uo
on ui.user_id = uo.user_id;
交叉连接(CROSS JOIN):

交叉连接(CROSS JOIN)比较少用到,下面是一个简单的例子,假设有两张表 table1 和 table2,它们的列一样,现在需要查询这两个表的笛卡尔积:

select * 
from table1
cross join  table2;
SQL的select语句完整的执行顺序?
SQL的select语句的执行顺序可以分为以下几个步骤:

from子句:指定要查询的表格,以及它们之间的关系。

join 子句:连接两个或多个表格。

where 子句:对查询的结果进行筛选,只返回满足条件的数据行。

group by 子句:将查询结果按照指定列或列组进行分组。

having 子句:对分组后的结果进行筛选,只返回满足条件的分组。

select子句:选择要查询的列,并对这些列进行计算、重命名等操作。

distinct 关键字:去除结果集中的重复行。

order by 子句:对结果集按照指定的列进行排序。

limit 子句:控制结果集的返回行数,限制只返回指定的行数。

下面是一个简单的示例,根据数据库中的表格"students"和"departments"来查询所有Java课程的成绩并按照成绩从高到低排序:

select students.name, students.score 
from students
join departments on students.department_id = departments.id
where departments.name = '计算机科学' and students.course = 'Java'ORDERBY students.score desc;
在以上的示例中,先从"students"表格中选出需要的内容,并通过"JOIN"连接另外一个表格"departments"。然后,在"WHERE"子句中对查询结果进行筛选,只保留"departments.name"为'计算机科学'并且"students.course"为'Java'的数据行。接着,在"SELECT"子句中选择要查询的列,并在"ORDER BY"子句中按照"students.score"从高到低排序。最后,通过"LIMIT"子句限制查询结果最多返回10行。

Mysql数据库中怎么实现分页?
Mysql数据库中实现分页可以通过LIMIT和OFFSET关键字来完成,具体操作如下:

假设需要查找表中的第11-20条记录:

select * from table_name limit 10 offset  10;
其中LIMIT后面的数字表示每页显示的记录数,OFFSET后面的数字表示跳过的记录数,也就是从第11条记录开始取,取10条记录作为本次查询结果。

如果将上述语句中OFFSET的值设为0,则查询出的是前10条记录。

提取数据库中倒数10条数据
可以使用MySQL中的LIMIT来提取数据库中倒数10条数据,具体语句如下:

select  * from table_name order by  id desc limit  10;
其中,table_name是需要查询的表名,id是表中的某一列作为排序依据,DESC表示倒序排列,LIMIT 10 表示返回倒数10条数据。

Mysql开启General-log日志
要在MySQL中开启General log日志,可以按照以下步骤进行:

登录到 MySQL 数据库。

执行以下 SQL 查询语句,开启 general log:

SET GLOBAL general_log = 'ON';
检查是否开启成功。可以执行以下SQL语句查询是否已经开启:

SHOW VARIABLES LIKE 'general_log%';
如果查询结果中的 "Value" 为 "ON",则表示已经开启了 General log。

查看 General log 日志文件。在 MySQL 数据库的 data 目录下,会生成一个名为 "hostname.log" 的查询日志文件。可以使用以下命令查看该文件中的日志内容:

sudo tail -f /var/log/mysql/hostname.log
其中, "hostname" 是运行 MySQL 数据库的主机名。

请注意,开启 General log 可能会对系统性能造成一定影响,因此在使用完毕后应及时关闭 General log,以免影响数据库系统的性能。

看下表回答问题

d(用户id)

user(用户名)

post(贴子数)

hits(点击数)

data(日期)

1

小赵

90

980

2022-8-27

2

小钱

120

245

2022-9-25

3

小孙

990

105

2023-3-26

4

小李

790

980

2023-3-27

5

小周

340

235

2023-4-

请用一条SQL语句查询出发帖数大于5点击数由高到低排序

用一条SQL语句将"日期"为11日的记录贴子数全部设置为0

用一条SQL筛选出2023年的记录且post大约500的数据,终其hits减少50

答案如下:

请用一条SQL语句查询出发帖数大于5点击数由高到低排序

select * from table_name 
where post > 5 
order by  hits desc;
ps:table_name为查询的表名,post > 5 表示发帖数大于5, ORDER BY hits DESC 表示按照点击数降序排列,即点击数由高到低排序。

用一条SQL语句将"日期"为11日的记录贴子数全部设置为0

update table_name 
set post = 0 
where day(data) = 11;
ps:table_name为更新的表名,DAY(data) 函数用于返回日期中的天数,它会将日期格式的data字段中的天数提取出来,然后和数字11进行比较,如果相等,则将该行数据中的 post 字段设置为0。

用一条SQL筛选出2023年的记录且post大约500的数据,终其hits减少50?

update table_name 
set hits = hits - 50 
where year (data) =2023 and post >=500;
p:table_name为更新的表名。

创建一张学生表,包含以下信息,学号,姓名,年龄,性别,家庭住址,联系电话
create table  student (
    id int primary  KEY, 
    name varchar (50) NOTNULL, 
    age int not null, 
    gender char(1) not null,
    address varchar(100) not null,
    phone varchar(20) not null);
以上 SQL 语句中,"student" 是表名,"id" 是学号,"name" 是姓名,"age" 是年龄,"gender" 是性别,"address" 是家庭住址,"phone" 是联系电话。其中,"INT" 表示整数类型,"VARCHAR" 表示字符类型,括号内的数字表示字符长度。"PRIMARY KEY" 表示主键,"NOT NULL" 表示非空。执行以上 SQL 语句后,就可以创建一个名为 "student" 的学生表,包含所需的各项信息。

修改学生表的结构,添加1列信息,学历
alter table  student 
add column  education varchar(20);
使用 ALTER TABLE 语句修改学生表结构,该语句将在 "student" 表中添加一个名为 "education" 的新列,数据类型为 varchar(20)

修改学生表结构,删除一列信息,家庭住址
alter table student 
drop column address;
使用 ALTER TABLE 语句修改学生表结构,该语句将在 "student" 表中删除一个名为 "address" 的列。

向学生表添加如下信息:学号、 姓名 、年龄 、性别 、联系电话 、学历
1,小赵,22, 男,123,小学;

2,小钱,21,男,119,中学;

3,小孙,23 ,男,110,高中;

4,小李,18,女,114,大学;

insert into  学生表 (学号, 姓名, 年龄, 性别, 联系电话, 学历)
values
('1', '小赵', '22', '男', '123', '小学'),
('2', '小钱', '21', '男', '119', '中学'),
('3', '小孙', '23', '男', '110', '高中'),
('4', '小李', '18', '女', '114', '大学');
ps:insert into插入新纪录,学生表指存储学生信息的数据库表名,学号、姓名、年龄、性别、联系电话、学历分别对应着表中的列名。

修改学生表的数据,将电话号码以11开头的学员的学历改为“大专“
update 学生表 
set 学历 ='大专'
where 联系电话 like'11%';
ps:学生表指要修改的数据库表名,联系电话是学生表中存储电话号码的列名。以上SQL语句会将所有电话号码以11开头的学生的学历修改为“大专”。

在 SQL 语句中,常用到的通配符有 % 和 _。其中,% 表示匹配任意个字符(包括 0 个字符),_ 则表示匹配一个任意字符。

删除学生表的数据,姓名以C开头,性别为"男"的记录删除
delete from Student
where name like 'C%' and gender ='男';
ps:DELETE 用来删除表中数据的关键字,from Student 指明要删除的是学生表中的数据。where子句限定了删除的条件,name like'C%' 表示名字以“C”开头(%表示任意字符),gender = '男' 表示性别为“男”。

查询学生表的数据,将所有年龄小于22岁的,学历为"大专"的,学生的姓名和学号查找出来
select 姓名, 学号 
from Student 
where 年龄 <22 and 学历 ='大专'
ps:"select"表示要选择的列,"from "表示选择的表,"where"表示筛选条件。

多表联查1:Student-Sourse-SC-Teacher
表关系如下:

Student(sid,Sname,Sage,Ssex)学生表

Course(cid,Cname,tid)课程表

SC(sid,cid,score)成绩表

Teacher(tid,Tname)教师表

写出sql语句:

查询课程"001"课程比"002"课程成绩高的所有学生的学号

修改学号为20131201的语文成绩为100

插入一条名为"李四"的教师记录

删除学习"叶平"老师课程的sc表记录

答案如下:

查询课程"001"课程比"002"课程成绩高的所有学生的学号

select distinct  s.sid 
from Student s, Course c, SC sc1, SC sc2
where s.sid = sc1.sid and sc1.cid = c.cid and c.cname = "001"and s.sid = sc2.sid and sc2.cid = c.cid and c.cname = "002" and sc1.score > sc2.score;
ps:首先通过 from关键字将四个表连接起来,其中 Student s 表示给学生表取别名为 s,主要是方便后面的 SQL 语句的书写。使用 distinct 关键字去重,最后的结果只返回学号。通过and 连接多个条件,分别限定了学生表、课程表和成绩表,进而筛选出该课程成绩高于另一门课程的学生。

修改学号为20131201的语文成绩为100

update SC set score = 100 
where sid = "20131201" and cid in
(select cid from Course where Cname = "语文");
ps:使用 update关键字更新该学号为 20131201 的学生语文成绩,where子句中限定了学号和课程名称。因为一个学生可能会修多门课程,所以需要通过 in 子句将课程名称和课程表中的记录进行匹配,从而确定要修改成绩的课程。

插入一条名为"李四"的教师记录

insert into  Teacher (tid, Tname) 
values  ('0004', '李四');
ps:使用insert into 关键字向教师表中插入一条新的记录,该记录中包含一个教师编号(tid)和教师姓名(Tname)。

删除学习"叶平"老师课程的sc表记录

delect from SC where cid in 
(select cid from Course where tid = 
(select tid from Teacher where Tname = "叶平"));
ps:使用 DELETE FROM 关键字删除 SC 表中满足条件的记录。使用 IN 和 SELECT 子句分别获得教师叶平的教授课程和课程表中的相关记录,然后通过 WHERE 关键字进行条件筛选,最终确定要删除的记录。

多表联查2:员工信息A-员工亲属信息表B
表关系如下:

员工信息表A:员工标号(codecode PK),员工姓名(codename),员工性别(codesex),联系电话(codetel),备注(remarks)

员工亲属信息表B:员工编码(codecode),亲属编码(recoddecode,PK),亲属姓名(recodename),

联系电话(recodetel),备注(remarks)

写出sql语句:

向员工信息表中插入一条数据:(001,张三,男,010-62570007,北京市海淀区)

查询出亲属数量大于1的员工编码,员工姓名,员工亲属数量有部分员工亲属信息重复录入(亲属编码不

同,其他相同),出现这种情况的员工编码,重复的亲属编码,亲属姓名查询出来。

答案如下:

向员工信息表中插入一条数据:(001,张三,男,010-62570007,北京市海淀区)

insert into  A (codecode, codename, codesex, codetel, remarks) 
values('001', '张三', '男', '010-62570007', '北京市海淀区');
查询出亲属数量大于1的员工编码,员工姓名,员工亲属数量有部分员工亲属信息重复录入(亲属编码不

同,其他相同),出现这种情况的员工编码,重复的亲属编码,亲属姓名查询出来。

select A.codecode, A.codename, B1.recoddecode, B1.recodename
from A INNERJOIN B as B1 on A.codecode = B1.codecode
inner join  B as B2 on B1.recodename = B2.recodename and B1.recodetel = B2.recodetel and B1.remarks = B2.remarks and B1.recoddecode <> B2.recoddecode
group by  A.codecode, A.codename, B1.recodename, B1.recodetel, B1.remarks, B1.recoddecode
having count (*) >1;
ps:使用inner join将员工信息表 A 和员工亲属信息表 B 进行连接,然后使用 group by 按照员工编号、员工姓名、亲属编号、亲属姓名、联系电话和备注分组。接着使用 having关键字过滤结果,只返回亲属数量大于 1 的记录,并且条件为亲属姓名、联系电话和备注相同,但亲属编号不同。最后返回符合条件的员工编码、员工姓名、重复的亲属编码和亲属姓名。

多表联查3:部门表dept-雇员表emp
表关系如下:

部门表dept:部门标号(DEPTNO),部门名称(DNAME),所在位置(LOC)

雇员表emp:员工标号(Empno),员工名称(Emname),员工工位Job)经理(Mgr),雇佣日期(Hiredate),薪水(Sal),部门编号(Deptno)

写出sql语句:

找出部门名称为ACCOUNTING的部门下的所有员工名称?

找出部门名称为SALES的部门下每月需要发出的薪水总额?

找出部门名称为SALES的部门的部门经理?

找出部门名称为RESEARCH的部门下厢佣日期为1980-12-17的员工?

答案如下:

找出部门名称为ACCOUNTING的部门下的所有员工名称?

select Emname from emp where Deptno in (select DEPTNO from dept where DNAME ='ACCOUNTING');
ps:首先使用子查询查找部门表中名称为 ACCOUNTING 的部门的部门标号,然后在雇员表中查询部门标号等于该部门标号的所有员工的姓名。

找出部门名称为SALES的部门下每月需要发出的薪水总额

select sum(Sal) as TotalSalary from emp where Deptno in (select DEPTNO from dept where DNAME ='SALES');
ps:首先使用子查询查找部门表中名称为 SALES 的部门的部门标号,然后在雇员表中查询部门标号等于该部门标号的所有员工的薪水,最后将薪水求和得到每月需要发出的薪水总额。

找出部门名称为SALES的部门的部门经理?

select Emname from emp where Job='经理'and Deptno in (select DEPTNO from dept where DNAME ='SALES');
ps:首先使用子查询查找部门表中名称为 SALES 的部门的部门标号,然后在雇员表中查询部门标号等于该部门标号的所有员工中职位为“经理”的员工的姓名。

找出部门名称为RESEARCH的部门下厢佣日期为1980-12-17的员工?

select Emname from emp where Deptno in (select DEPTNO from dept where DNAME ='RESEARCH') and Hiredate ='1980-12-17';
p:首先使用子查询查找部门表中名称为 RESEARCH 的部门的部门标号,然后在雇员表中查询部门标号等于该部门标号且雇佣日期为 1980-12-17 的所有员工的姓名。

多表联查4:Student-coures-Studentcourse
表关系如下:

student(sno,sname,age,sdept)学生表

course(cno,cname,teacher)课程表

Studentcourse(sno,cno,grade)选课表

写出sql语句:

查询所有课程都及格的学生号和姓名

查询平均分不及格的课程号和平均成绩

找出各门课程的平均成绩,输出课程号和平均成绩

找出没有选择c2课程的学生信息

答案如下:

查询所有课程都及格的学生号和姓名

select s.sno, s.sname from student s 
where not exists (select*from course c WHERENOTEXISTS 
                  (select*from studentcourse sc where s.sno = sc.sno and c.cno = sc.cno and grade >=60));
ps:首先使用子查询查找所有成绩不及格的课程,然后在学生选课表中查询没有选修这些课程的学生,最后返回这些学生的学号和姓名。

查询平均分不及格的课程号和平均成绩

select c.cno, avg(sc.grade) ad avg_grade from course c, studentcourse sc
where c.cno = sc.cno
group by c.cno
having avg(sc.grade) <60;
ps:先使用内连接将课程表与学生选课表连结起来,然后按照课程编号进行分组,计算每门课程的平均成绩,最后筛选出平均成绩不及格的课程,返回课程编号和平均成绩。

找出各门课程的平均成绩,输出课程号和平均成绩

select c.cno, avg(sc.grade) as avg_grade from course c, studentcourse sc
where c.cno = sc.cno
group by c.cno;
ps:使用内连接将课程表与学生选课表连结起来,然后按照课程编号进行分组,计算每门课程的平均成绩,最后返回课程编号和平均成绩。

找出没有选择c2课程的学生信息

select s.*from student s WHERENOTEXISTS 
    (select*from studentcourse sc where s.sno = sc.sno and sc.cno ='c2');
ps:首先使用子查询查询所有选了 c2 课程的学生,然后在学生表中查询没有选修 c2 课程的学生,最终返回这些学生的所有信息。

多表联查5:学生表(t_student)-课程分数表(t_score)
表关系如下:

学生表(t_student):NAME

课程分数表(t_score):COURSE,SCORE

写出sql语句

查出班级中所有重名的学生

按照课程总分数排名,找出排名前十的学生

按照课程总分数排名, 找出排名前十的学生(考虑总分相同属于同一名次)

答案如下:

查出班级中所有重名的学生

select t_student.NAME, count(t_student.NAME) as count_name
from t_student
group by  t_student.NAME
having count_name >1;
ps:"t_student"是学生表,"NAME"是学生姓名字段,通过group by对姓名进行分组,having表达式指定了出现了多少次相同的姓名(大于1),表示这个姓名出现了重复。count函数计算每个分组(即每个姓名)出现的次数。

按照课程总分数排名, 找出排名前十的学生:

写法1:

select s.NAME, sum(sc.SCORE) as total_score
from t_student s
join t_score sc on s.ID = sc.STUDENT_ID
group by s.NAME
order by  total_score desc
limit  10;
ps:"t_student"是学生表,"t_score"是课程分数表,"NAME"是学生姓名字段,"SCORE"是分数字段,通过JOIN将两个表关联,分组后使用SUM函数求出每个学生的总分数,按照总分数倒序排序并选取前10名。LIMIT限制结果集的大小。

按照课程总分数排名, 找出排名前十的学生(考虑总分相同属于同一名次)

使用关联子查询和变量

set @rank=0;
select  t.NAME, t.total_score, (@rank:=@rank+1) as rank
from (
    select s.NAME, sum(sc.SCORE) as total_score
    from  t_student s
    join t_score sc on s.ID = sc.STUDENT_ID
    group by  s.NAME
    order by  total_score desc) t
group by  t.total_score
having rank <=10;
其中"t_student"是学生表,"t_score"是课程分数表,"NAME"是学生姓名字段,"SCORE"是分数字段。子查询选择每个学生的总分数,并按照总分数倒序排序。在主查询中,使用一个变量@rank来记录排名,group by 对总分分组,having过滤出前十名。

注意:如果存在多个相同的总分数,则会给所有这些学生分配同一名次,导致实际结果可能不是完全按照排名顺序显示。

MySQL查询某一个表的前10行记录
使用 limit 子句。语法如下:

select * from table_name limit 10;
上述语句表示查询 table_name 表中前10条记录。

使用 where 子句和子查询。语法如下:

select * from table_name where id <= 10;
上述语句使用 id 字段进行筛选,只取值小于等于10的记录,实现查询前10条记录的功能。

注意,在使用第二种方式时,需要保证表中有自增主键或者其他能够实现排序的字段,否则可能会有不确定的结果。

如何对查询结果进行条件映射归集
条件映射归集是一种 SQL 查询技术,它可以根据某个字段的值定义一系列分支条件,并将其归集到不同的结果集中。

条件映射归集通常使用 case when then 语句实现,它的基本语法格式如下:

select case  column_name
        when condition1 then  result1
        when condition2 then result2
        ...
        else resultN
    end as  new_column_name
from
    table_name;
以上示例中,column_name 是需要进行条件映射的字段名,condition 和 result 分别为条件和对应的结果。ELSE 子句用于指定所有未匹配任何条件的记录的默认值。

例如,在查询学生成绩表格时,可以使用条件映射归集来统计不同等级的成绩人数。首先将成绩按照优、良、中、差四个等级进行映射,然后再通过 GROUP BY 分组语句统计每个等级的出现次数,最终得到一个以成绩等级为分组分类,以人数为值的统计结果集。

以下是一个示例 SQL 查询语句:

select
    case
        when score >= 90 then '优'
        when score >= 80 then '良'
        when score >= 70 then '中'
        else '差'
    end as grade,
    count(*) as count
from score
group by  grade;
ps:score 表中的成绩按照优、良、中、差四个等级进行映射,并统计每个等级出现的次数。注意,这里用到了 GROUP BY 子句对结果进行分组统计。

对某个表的值进行按天统计总条数、总金额数量
可以使用 SQL 中的 group by 和聚合函数来实现对某个表的值进行按天统计总条数和总金额数量。

首先需要明确需要进行统计的表和字段名。以下示例中,假设要对表 orders 中的数据按照订单日期(order_date)进行按天统计,并分别统计每天的订单总数和订单总金额。

select date (order_date) as day,
    count (*) as total_orders,
    sum(amount) as total_amount
from orders
group day(order_date)
order by day (order_date) asc;
以上 SQL 语句中,通过 SELECT 关键字选择要查询的列,其中:

使用 DATE 函数将订单日期转化为日期类型;

使用 COUNT 聚合函数统计每天订单数量;

使用 SUM 聚合函数统计每天订单总金额。

通过 FROM 关键字指定要查询的表名(这里是 orders)。通过 GROUP BY 关键字将所选列按照订单日期进行分组,以便能够在每个分组上执行聚合函数。最后,通过 ORDER BY 关键字按照日期升序排列结果。

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值