数据库-测试面试题

INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
DELETE FROM 表名称 WHERE 列名称 = 值
 
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
LEFT JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName
 
 
ORDER BY Company 降序DESC, id升序 ASC
order by 默认按照 ASC 升序排列
max(id),最小 min(id)

(一)为什么要使用数据库?

1)数据永久保存

2)使用SQL语句,查询方便效率高。

3)管理数据方便

(二)什么是SQL?

结构化查询语言(Structured Query Language)简称SQL,是一种数据库查询语言。

作用:用于存取数据、查询、更新和管理关系数据库系统。

(三)什么是死锁?怎么解决?

死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方的资源,从而导致恶性循环的现象。

常见的解决死锁的方法

1、如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表,可以大大降低死锁机会。

2、在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率;

3、对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率;

如果业务处理不好可以用分布式事务锁或者使用乐观锁

(四)什么是游标?

游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果,每个游标区都有一个名字。用户可以通过游标逐一获取记录并赋给主变量,交由主语言进一步处理。

(五)改

        修改t_sales表中id值为3的记录,将asales改为6900

UPDATE t_sales SET asales = 6900 WHERE id = 3;

(六)删

        删除表中id为5的数据

DELETE FROM t_sales WHERE id = 5;

 (七)查

        查询student表的第2条到4条记录

SELECT * FROM student LIMIT 1,3

        计算并查询出表score中计算机的平均分数

select AVG(grade) from score where c_name="计算机"

        计算并查询出表score中计算机的最低/最高分数

select MIN(grade) from score where c_name="计算机"
select max(grade) from score where c_name="计算机"

         查询出表score中计算机的信息按照分数倒序排列(desc是逆序排序,asc是正序排序,asc可省略不写)

select * from score where c_name="计算机" order by grade desc

        查询李四的考试科目(c_name)和考试成绩(grade)

SELECT c_name, grade FROM score WHERE stu_id = (SELECT id FROM student WHERE name= '李四' );

        查询计算机成绩低于95的学生信息

SELECT * FROM student WHERE id IN (SELECT stu_id FROM score WHERE c_name="计算机" and grade<95);

(八)group by 和order by的区别 

        order by用于排序,一般和升序/降序一起使用。

        group by用于分类汇总,一般和汇集函数sum,max,min等一起使用。

        一起使用的时候,group by要在order by前面

(九)group by 

GROUP BY 是 SQL 中的一个非常重要的子句,它通常与聚合函数(如 SUM(), AVG(), MAX(), MIN(), COUNT() 等)一起使用,用于将来自表中的多行数据组合成较小的汇总行。简而言之,GROUP BY 子句允许你根据一个或多个列对结果集进行分组,并对每个分组执行聚合操作。

基本用法
假设有一个名为 sales 的表,它记录了销唀数据,包括 date(销售日期)、product_id(产品ID)和 amount(销售额)等字段。

如果你想计算每个产品的总销售额,你可以使用 GROUP BY 子句结合 SUM() 函数来实现:

sql
SELECT product_id, SUM(amount) AS total_sales  
FROM sales  
GROUP BY product_id;
这个查询会按照 product_id 对销售记录进行分组,并计算每个产品的总销售额(amount 的总和)。

多列分组
你也可以根据多个列来分组数据。比如,如果你想按产品和销售年份来计算总销售额,可以这样做:

sql
SELECT YEAR(date) AS sale_year, product_id, SUM(amount) AS total_sales  
FROM sales  
GROUP BY YEAR(date), product_id;
这里,我们首先使用 YEAR(date) 函数从 date 字段中提取年份,然后按年份和产品ID对销售记录进行分组。

注意事项
当使用 GROUP BY 时,SELECT 列表中未包含在聚合函数中的每个列都必须包含在 GROUP BY 子句中。
如果你在 SELECT 列表中使用了聚合函数,但 GROUP BY 子句为空或未包含所有非聚合列,SQL 可能会返回错误或不确定的结果,具体取决于数据库系统。
不同的数据库系统(如 MySQL、PostgreSQL、SQL Server 等)在处理 GROUP BY 和非聚合列时可能有细微的差别。
示例
假设 sales 表有以下数据:

date        | product_id | amount  
------------|------------|--------  
2023-01-01  | 1          | 100  
2023-01-02  | 1          | 150  
2023-01-01  | 2          | 75  
2023-01-02  | 2          | 125
执行上面的第一个查询后,你可能会得到如下结果:

product_id | total_sales  
-----------|------------  
1          | 250  
2          | 200
这表明产品 1 的总销售额为 250,产品 2 的总销售额为 200。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秦朝胖子得加钱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值