尝试写一些sql看看chatgpt写的和自己写的哪里不一样,帮助我打开思路。
第一题
数据库中有个员工表emp,建表语句如下:
create table emp_his (emp_id number, emp_name varchar(50));
表中存在重复记录(根据emp_id来判断),用SQL如何查出存在重复的 emp_id?
我给出的sql如下
select emp_id, count(1) as cnt
from emp_his
group by emp_id
having count(1) >= 2;
将题目丢入chatgpt中给出的结果如下
SELECT emp_id
FROM emp_his
GROUP BY emp_id
HAVING COUNT(emp_id) > 1;
可以看出几乎是一样的,但是还是想问问它我的答案是否有优化的空间。
于是乎它说我的语句已经很不错了,再想优化就是添加索引了
第二题
有张student_scores表,存放每个学生,每门课程的分数,建表语句如下:
create table student_scores
(emp_id number
,course_name varchar(50)
,score number);
需要把每门课程按照学生分数降序排名并添加序号。
还是先把自己的写好的sql拿出来
尝试写一些sql看看chatgpt写的和自己写的哪里不一样,帮助我打开思路。
第一题
数据库中有个员工表emp,建表语句如下:
create table emp_his (emp_id number, emp_name varchar(50));
表中存在重复记录(根据emp_id来判断),用SQL如何查出存在重复的 emp_id?
我给出的sql如下
select emp_id, count(1) as cnt
from emp_his
group by emp_id
having count(1) >= 2;
将题目丢入chatgpt中给出的结果如下
SELECT emp_id
FROM emp_his
GROUP BY emp_id
HAVING COUNT(emp_id) > 1;
可以看出几乎是一样的,但是还是想问问它我的答案是否有优化的空间。
于是乎它说我的语句已经很不错了,再想优化就是添加索引了
第二题
有张student_scores表,存放每个学生,每门课程的分数,建表语句如下:
create table student_scores
(emp_id number
,course_name varchar(50)
,score number);
需要把每门课程按照学生分数降序排名并添加序号。
还是先把自己的写好的sql拿出来
select emp_id, course_name, score,
row_number() over(order by score desc) as row_num
from student_scores
order by score desc;
再看看chatgpt给出的结果
SELECT emp_id, course_name, score,
ROW_NUMBER() OVER (PARTITION BY course_name ORDER BY score DESC) AS ranking
FROM student_scores;
可以看出chatgpt忽略了题目中的“需要把每门课程按照学生分数降序排名并添加序号”要求的是每门成绩而不是各科成绩排序。
当我将我的答案输入进后,chatgpt立刻就做出了修改
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bBwZjNP6-1688713220935)(https:img-blog.csdnimg.cn/5a112e499d0944cb8dcf8724d890c273.png)]
尝试写一些sql看看chatgpt写的和自己写的哪里不一样,帮助我打开思路。
第一题
数据库中有个员工表emp,建表语句如下:
create table emp_his (emp_id number, emp_name varchar(50));
表中存在重复记录(根据emp_id来判断),用SQL如何查出存在重复的 emp_id?
我给出的sql如下
select emp_id, count(1) as cnt
from emp_his
group by emp_id
having count(1) >= 2;
将题目丢入chatgpt中给出的结果如下
SELECT emp_id
FROM emp_his
GROUP BY emp_id
HAVING COUNT(emp_id) > 1;
可以看出几乎是一样的,但是还是想问问它我的答案是否有优化的空间。
于是乎它说我的语句已经很不错了,再想优化就是添加索引了
第二题
有张student_scores表,存放每个学生,每门课程的分数,建表语句如下:
create table student_scores
(emp_id number
,course_name varchar(50)
,score number);
需要把每门课程按照学生分数降序排名并添加序号。
还是先把自己的写好的sql拿出来
select emp_id, course_name, score,
row_number() over(order by score desc) as row_num
from student_scores
order by score desc;
再看看chatgpt给出的结果
SELECT emp_id, course_name, score,
ROW_NUMBER() OVER (PARTITION BY course_name ORDER BY score DESC) AS ranking
FROM student_scores;
可以看出chatgpt忽略了题目中的“需要把每门课程按照学生分数降序排名并添加序号”要求的是每门成绩而不是各科成绩排序。
当我将我的答案输入进后,chatgpt立刻就做出了修改
() over(order by score desc) as row_num
from student_scores
order by score desc;
再看看chatgpt给出的结果
```sql
SELECT emp_id, course_name, score,
ROW_NUMBER() OVER (PARTITION BY course_name ORDER BY score DESC) AS ranking
FROM student_scores;
可以看出chatgpt忽略了题目中的“需要把每门课程按照学生分数降序排名并添加序号”要求的是每门成绩而不是各科成绩排序。
当我将我的答案输入进后,chatgpt立刻就做出了修改
第三题
有表emp_his,表emp_inc,表结构一样,关联条件是emp_id,建表语句如下:
create table emp_his
(emp_id number,emp_name varchar(50),age number);
create table emp_inc
(emp_id number,emp_name varchar(50),age number);
emp_his表存放历史数据,emp_inc表存放有变化,或者新增的数据,如果要一个最新的全量数据sql如何写?
还是先将自己写的放出来
select
case when inc.emp_id is not null then inc.emp_id else his.emp_id
,case when inc.emp_name is not null then inc.emp_name else his.emp_name
,case when inc.age is not null then inc.age else his.age
from emp_his his full outer join emp_inc inc ON his.emp_id = inc.emp_id;
chatgpt给出的结果如下
SELECT emp_id, emp_name, age
FROM emp_his
UNION ALL
SELECT emp_id, emp_name, age
FROM emp_inc;
看见union all的时候感觉好像是自己把问题想的复杂了,但是还是想让他帮我优化一下我写的sql。
优化原因以及结果如下
这道题确实可以用COALESCE()来做,看起来逻辑也会更加清晰。
总结:
chatgpt可以用来做一些基础的优化,但是也可能给出的结果是不正确的,正确合理的使用AI才能提升工作以及学习的效率。