急!关于用SQL语句表达数据库查询

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了急!关于用SQL语句表达数据库查询相关的知识,希望对你有一定的参考价值。

假设学生-课程数据库关系模式如下:
Student(Sno,Sname,Sage,Ssex)
Course(Cno,Cname,Teacher)
SC(Sno,Cno,Grade)
用SQL语句表达下列查询:
(1)找出刘老师所授课程的课程号和课程名
(2)找出年龄小于22岁女生的学号和姓名
(3)找出至少选修刘老师讲的一门课的学生姓名
(4)找出“程序设计”课成绩在90分以上的学生姓名
(5)找出不学C3课的学生姓名
(6)找出至少选修C1课和C2课的学生学号
只要这题有答案,能理解,就能掌控SQL查询了,谢谢

1、select Cno,Cname from Course where Teacher='刘老师';

2、select Sno,Sname from Student where Sage < 22;

3、select Sname from Student where Sno not in(
select Sno from sc inner join Course on sc.Cno=Course.Cno where Course.Teacher='刘老师');

4、select Sname from Student where Sno in(
select Sno from sc inner join Course on sc.Cno=Course.Cno where sc.Grade>90 and Course.Cname='程序设计');

5、select Sname from Student where Sno not in(
select Sno from sc inner join Course on sc.Cno=Course.Cno where Course.Cname='C3课');

6、select Sno from Student where Sno not in(
select Sno from sc inner join Course on sc.Cno=Course.Cno where Course.Cname='C1课' or Course.Cname='C2课')
group by Sno having count(*) >= 2;

---
以上,希望对你有所帮助。
参考技术A 1. select * from Course a where a.teacher = 'Liu';
2. select * from Student a where a.ssex = '女' and a.sage < 22;
3. select a.sname from student a, sc b, course c where a.sno = b.sno and b.cno = c.cno and c.teacher = 'Liu';
4. select a.sname from student a, sc b, course c where a.sno = b.sno and b.cno = c.cno and c.grade > 90 and b.cname = '程序设计';
5. select a.sname from student a, sc b, course c where a.sno = b.sno and b.cno = c.cno and b.cno != 'C3';
6. 这道题意思不明,C1 和 C2 是要同时满足吗?

现在要查询一个字段至少包括两个中文字,高分急求SQL语句,谢谢~~~

分数后来补充,只要能回答这个问题,我加70分,一共100分。谢谢!!重谢!!

select * from table where patindex('%[吖-座]%',字段) > 0

--[吖-座]是中文字符集第一个到最后一个的范围
这个是判断是否有中文追问

这边咋会报错啊。。PATINDEX invalid identifier 是不是函数名打错了。不会是你写的函数吧。。。

追答

patindex('%[吖-座]%',字段名)>0

SQL中 patindex函数的用法 2011-01-11 15:04:05| 分类: SQL语法 | 标签: |字号大中小 订阅 .

patindex函数的用法
语法格式:PATINDEX ( '%pattern%' , expression )
返回pattern字符串在表达式expression里第一次出现的位置,起始值从1开始算。

pattern字符串在expression表达式里没找就返回0,对所有有效的文本和字符串就是有效的数据类型。

描述一下此函数的具体用法:

貌似没错啊

追问

对了,大哥,我忘了说了,我有的是ORACLE,你用的数据库是?

追答

Oracle里面如何识别存储字段里面是否存在中文,方法有二:

1、使用length和lengthb,如果中文的话length是一个字符,但是lengthb是两个字节。但是这个方法不适合数据库字符集非gbk的情况。
select * from t where length(c1) != lengthb(c1);

2、使用asciistr函数得出是否字段里面包含“/”,因为当中文字符转换为ascii后,变成“/FFFD/FFFD”,但是需要注意一个特殊字符“/”,当它出现的时候转换后的码为“/005C”

SQL> select asciistr('//)(-=!@#$%^&*~中文字符') from dual;

ASCIISTR('//)(-=!@#$%^&*~中文字符')
-----------------------------------------------------------
//005C)(-=!@#$%^&*~/FFFD/FFFD/FFFD/FFFD/FFFD/FFFD/FFFD/FFFD

追问

这个页面我也在网上搜索到了,但是两种方法都不行。因为length != lengthb 不能说明这个字符就是汉字,也可能是全角符,也可能是日文,等等等。还是得按汉字编码来。。。patindex 这个函数ORACLE里确实没有,这是哪个数据库中的函数?SQL SERVER?

追答

sql 的 23.模糊子串的位置 --返回2,参数去掉中间%则返回7
S:select patindex('%d%q%','sdsfasdqe') value
O:oracle没发现,但是instr可以通过第四霾问刂瞥鱿执问?BR> select INSTR('sdsfasdqe','sd',1,2) value from dual 返回6

你看看这个行不

追问

这个不行,因为instr不能用这样的形式:[吖-座],只能给定子字符串然后到母字符串中去找,而不是匹配中文。很感谢您的耐心回答,真心的感谢。

追答

.....

参考技术A select * from biao where ziduan like '%汉字1%汉字2%' or ziduan like '%汉字2%汉字1%' ?追问

不是,只要这个字段里面有两个中文字就行,不管是什么中文字(当然不包括全角符)

追答

那就要写函数了,挺麻烦的

追问

悲剧了…… SQL里面能用正则表达式么?正则表达式能否实现这样的功能?(非常感谢您能耐心地回答我的问题,O(∩_∩)O~)

我开始是这样想的:
select length('my name is 我是一只鱼 fish') from dual; --计算得字符数为:21
select lengthb('my name is 我是一只鱼 fish') from dual; --计算得字节数为:26
相差5,正好就是中文字的个数,但是后来发现不行。。。中文的全角符也是两个字节。哎!!

以上是关于急!关于用SQL语句表达数据库查询的主要内容,如果未能解决你的问题,请参考以下文章

oracle sql语句的union效率问题【急】【急】【急】

急急急,Sql查询一个字段是不是存在某一个值,怎么写查询语句?

正则表达式替换(急在线等待)

oracle 查询的sql语句特别慢,是啥原因,是or特别慢吗,用啥优化,急急急!!!

怎么用sql语句返回1-10这10个整数?

【急】sql 语句查询字段A 根据分隔符截取字符串 得到一个新的字段S,然后修改另一个字段B,把S赋值给B