Mysql数据库面试题大全(常用SQL语句) 您所在的位置:网站首页 常见眼形大全 Mysql数据库面试题大全(常用SQL语句)

Mysql数据库面试题大全(常用SQL语句)

2023-06-15 19:29| 来源: 网络整理| 查看: 265

什么是数据库?

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

什么是关系型数据库,主键,外键,索引分别是什么?

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

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

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

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

Mysql数据库的操作

数据库创建与删除:

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

create database db_name;

删除数据库的语法格式为

drop datebase db_name;

数据表创建与删除:

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

create table table_name ( column1 datatype, column2 datatype, ... );

其中,column1、column2为表的列名,datatype为列的数据类型。

删除数据表的语法格式为

drop table table_name;

数据的增、删、改、查:

增加记录的语法格式为

insert into table_name (column1, column2, column3, ...) values (value1, value2, value3, ...);

其中,column1、column2为表的列名,value1、value2为对应的值。

删除记录的语法格式为

delect from table_name where some_column = some_value;

其中,some_column和some_value表示要删除记录的条件。

更新记录的语法格式为

update table_name set column1 = value1, column2 = value2, ... where some_column = some_value;

其中,some_column和some_value表示要更新记录的条件。

查询记录的语法格式为

select column1, column2, ... from table_name where some_column = some_value;

其中,column1、column2为表的列名,some_column和some_value表示要查询记录的条件。

数据库备份与还原:

备份数据库的语法格式为

mysqldump -u username -p databasename > backup_file.sql

其中,username是数据库的用户名,databasename是要备份的数据库名,backup_file.sql表示备份文件的名称。

还原数据库的语法格式为

mysql -u username -p databasename < backup_file.sql

其中,username是数据库的用户名,databasename是要恢复的数据库名,backup_file.sql表示备份文件的名称。

写出表的增删改查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 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 年龄 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) 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 = 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 关键字按照日期升序排列结果。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有