MYSQL 查询语句(No.10)

本文深入探讨了SQL查询的基础知识,通过25个具体案例展示了如何高效地进行数据检索、筛选与聚合,涵盖从基本查询到复杂条件组合的全过程。

--1:查询全体学生的学号和姓名

select sno, sname from student;

--2:查询全体学生的姓名、学号和所在系

select sno, sname,sdept from student;

--3: 查询全体学生的详细记录

select * from student

--4: 查询全体学生的姓名及其出生年份

select sname, 2011-sage as 出生年份 from student;

--5:查询全体学生姓名、出生年份和所在系,要求用小写字母表示所有系名

select sname, 2011-sage as 出生年份,lower(sdept) from student;

--6:查询选修了课程的学生学号

select distinct sno from sc;

--7:查询计算机系(IS)所有学生的名单

select sname from student where sdept = "is";

--8:查询所有年龄在20以下学生的姓名和年龄

select sname ,sage from student where sage <20;

--9: 查询考试成绩有不及格的学生的学号

select distinct sno from sc where grade < 60;

--10: 查询年龄在20-23 (包括20和23)之间的学生的姓名、系别和年龄

select sname,sdept,sage from student where sage>=20 and sage<=23;

--11: 查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别

select sname ,ssex from student where sdept = 'is' or sdept='ma' or sdept = 'CS';或

select sname,ssex from student where sdept in("is","ma","cs");

--12: 查询学号为95001的学生的详细情况

select * from student where sno = 95001;

--13: 查询所有姓林的学生的姓名、学号和性别

select sname,sno,ssex from student where sname like "林%";

--14: 查询姓“欧阳”且全名为三个汉字的学生的姓名

select sname from student where sname like "欧阳_";

--15:查询名字中第二个字为“燕”字的学生姓名和学号

select sname,sno from student where sname like "_燕%";

--16:查询所有不姓“刘”的学生的姓名

select sname from student where sname not like "^刘%";

--17:查询课程名为“DB_DESIGN”的课程号的学分

select ccredit from course where cname = "db_design";

--18:查询缺少成绩的学生的学号和相应的课程号(成绩字段值为Null)

select sno,cno from sc where grade<=>null;

--19: 查询所有有成绩的学生的学号和课程号

select sno ,cno from sc ;

--20: 查询所有计算机系年龄在20以下的学生姓名

select sname from student where sage<20 and sdept="cs";

--21: 查询选修了3号课程的学生的学号和成绩,查询结果按分数降序排列

select sno,grade from sc where cno =3 order by grade desc;

--22: 查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列

select * from student order by sdept,sage desc;

--23: 查询学生总人数

select count(sno) from student;

--24: 查询选修了课程的学生人数

select count(distinct sno) from sc;

--25: 计算1号课程的学生的平均成绩

select avg(grade) from sc where cno = 1;

--26: 计算1号课程的学生的最高成绩分数

select max(grade) from sc where cno =1;

--27:求各个课程号及相应的选课人数

select distinct cno,count(sno) from sc group by cno;

-- 查询每个学生选修的的课程数

select sno,count(sno) from sc group by sno;

--28: 查询选修了三门以上课程的学生学号

select sno from sc group by sno having count(sno)>3;

select sno,count(cno) as kcnum from sc group by sno having kcnum>3;

--29:查询每个学生及其选修课情况

select sno,sname,sage ,sdept ,grade from student left join sc on student.sno=sc.sno;

--30:查询每一门课的间接先行课

select cno, (select c2.cpno from course as c2 where c2.cno=c1.cpno ) as 间接先修课程 from course as c1;

--31:选修2号课程且成绩在90以上的学生的学号和姓名

select student.sno,sname from student,sc where student.sno = sc.sno and cno=2 and grade>=90;

//join连接 select s.sno,sname from student as s join sc on s.sno =sc.sno where cno=2 and grade>=90;

--32:查询每个学生的学号、姓名、选修的课程名及成绩

select sno,sc.cno,cname from sc join course using(cno);

select s.sno,sname,sage,cname,grade from student as s left join(select sno,sc.cno,cname from sc join course using(cno))as t on s.sno=t.sno;

--33:查询与’林燕芳’在同一个系学习的学生姓名

select sname from student where sdept=(select sdept from student where sname="林燕芳") and sname !="林燕芳";

--34: 查询其他系中比信息系某一学生小的学生姓名和年龄

select sname,sage from student where sage<any(select sage from student where sdept="is") and sdept!="is";

--35:查询所有选修了1号课程的学生的学生姓名

select student.sname from student,sc where student.sno=sc.sno and sc.cno=1;

//select sname from student where sno in (select sno from sc where cno=1);

--36:查询选修了全部课程的学生姓名

select sname from student where sno in(select sno from sc group by sno having count(cno)=(select count(*) from course));

<think>嗯,用户这次问的是MySQL中拼接两个字段的查询语句。这个问题其实很基础,但用户特意引用了四个站内资料,看起来可能之前接触过相关资料但仍有困惑。 用户提供的四个引用里,引用[1]讲得最全面,列出了CONCAT、CONCAT_WS、GROUP_CONCAT三种函数,还给了示例;引用[2]展示的是子查询拼接,属于高级用法;引用[3]重点在表连接时的字段拼接注意事项;引用[4]则涉及分组统计时的字段合并。用户可能被这么多信息搞糊涂了,需要我帮ta梳理核心用法。 从用户提问方式看,ta应该刚接触MySQL,最需要的可能是基础拼接操作。我应该优先演示最简单的CONCAT函数,这是最常用的场景。另外用户没说明拼接用途,但考虑到实际开发中,拼接字段常用于生成完整地址、组合姓名或创建唯一标识符(如示例中的stock_code_market组合),这些都可以作为补充说明。 注意到用户上次关于快速排序的对话里,我给出了代码示例和相关问题,这次也应该保持类似结构。特别是要提醒NULL值处理的坑&mdash;&mdash;这是新手最容易忽略的问题,当某个字段为NULL时整个拼接结果都会变成NULL。 要不要提性能优化呢?暂时不用,这种基础函数开销很小。但GROUP_CONCAT的默认长度限制(1024字符)值得提醒,很多人在处理长文本时会踩这个坑。 最后,用户引用里提到的子查询拼接和表连接拼接虽然存在,但实际业务中远不如直接拼接字段常用。这部分放在进阶说明里比较合适,避免信息过载。 </think>在MySQL中拼接两个字段的查询语句,主要通过以下函数实现,结合您的引用内容说明如下: --- ### 一、核心拼接函数 1. **`CONCAT(str1, str2, ...)`** 📌 将多个字段/字符串直接拼接,**无分隔符** ```sql SELECT CONCAT(first_name, last_name) AS full_name FROM users; ``` *结果示例*:`张三丰` → `"张三" + "丰" = "张三丰"` 2. **`CONCAT_WS(separator, str1, str2, ...)`** 📌 用指定分隔符拼接字段,**避免NULL值污染**(引用[1]) ```sql -- 拼接股票代码与市场,用下划线分隔 SELECT CONCAT_WS('_', stock_code, market) AS stock_id FROM t_stockcode; ``` *结果示例*:`"600000_SH"` 3. **`GROUP_CONCAT(expr)`** 📌 将多行数据合并为单个字符串(引用[1][4]) ```sql SELECT dept, GROUP_CONCAT(username) AS employees FROM employees GROUP BY dept; ``` *结果示例*:`研发部 → "张三,李四,王五"` --- ### 二、进阶用法 #### ▶ 子查询拼接(引用[2]) ```sql SELECT product_id, (SELECT CONCAT_WS('-', brand, name) FROM product_detail WHERE detail.product_id = main.product_id) AS product_info FROM orders_main WHERE order_id > 100; ``` #### ▶ JOIN查询拼接(引用[3]修正) ```sql SELECT CONCAT(u.address, '-', o.order_no) AS delivery_info FROM orders o LEFT JOIN users u ON o.user_id = u.id; -- 必须指定连接条件! ``` --- ### 三、关键注意事项 1. **NULL值处理** ⚠️ `CONCAT('A', NULL, 'B')` → `NULL` ✅ 解决方案: ```sql SELECT CONCAT(IFNULL(field1, ''), IFNULL(field2, '')) ``` 2. **GROUP_CONCAT长度限制** 默认结果截断长度1024字符,需调整参数: ```sql SET SESSION group_concat_max_len = 1000000; ``` --- ### 四、实际应用场景 | 场景 | 推荐函数 | 示例 | |---------------------|------------------|--------------------------| | 生成唯一标识符 | `CONCAT_WS` | `CONCAT_WS('_', id, type)` | | 组合地址信息 | `CONCAT` | `CONCAT(province, city, district)` | | 聚合多行文本 | `GROUP_CONCAT` | 用户标签合并、订单商品列表 | | 动态生成查询条件 | 拼接后作为条件 | `WHERE CONCAT(year, month) > '202405'` | > 示例根据引用[1][2]优化: > ```sql > -- 股票代码与市场拼接(去重) > SELECT DISTINCT CONCAT(stock_code, '_', market) AS stock_market > FROM t_stockcode; [^1] > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值