1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > SQL yog (运营新手查询语句统计)

SQL yog (运营新手查询语句统计)

时间:2024-06-29 14:45:36

相关推荐

SQL yog (运营新手查询语句统计)

基础查询格式 SELECT * FROM 来源表SELECT<字段清单> FROM <表名>WHERE <条件表达式>这里条件表达式可以是关系表达式、逻辑表达式、特殊表达式。 NOT +函数指的是反义?

IN =包含条件(WHERE class IN(501,502)) 选取501.502班的同学

NOT IN=不包含条件(WHERE class NOTIN(501,502))选取不包含501.502班的同学

BETWEEN…AND=得出结果? WHERE ( year(getdate())-year(born_date)) BETWEEN 18 AND 20 入学年份-出生年份=学生岁数

AS 定义JJ=将某个字段定义为JJ SELECT student_name AS 姓名,address AS 家庭住址 FROM student_info输出姓名+地址

SUBSTRING=获取字段中某种信息 WHEREclass_no='501'ORSUBSTRING(tele_number,1,2)='87‘ (获取501班手机号为87开头的学生)substring(address,1,3)='武汉市'

AND =并列(存在A且存在B) OR=包含(满足A或者是B一个条件即可 例:501的同学或者是电话开头为13的)

LIKE=查询语句(where class like '%65%')班级包含了65两个则输出

ORDER BY=排列语句ORDERBY <子句表达式1> [ASC|DESC] ASC=升序 DESC=倒叙

GROUP BY=分组 HAVING=对GROUP BY输出的数据做2次筛选

MAX/MIN=获取最大或者是最小值 AVG=计算平均数 SUM=求和

COUNT=计算条件个数 DISTINCT=去重

多表链接查询

表A.列名

自然链接例子(在自然连接的条件表达式中,往往是将各表的主键和外键进行等值连接)

SELECT student_id, student_name,student_sex,born_date,student_info.class_no, tele_number,ru_date,address,comment,class_name,director,profession

FROM student_info, class_info

WHERE student_info.class_no=class_info.class_no

复合条件连接方法(查找选修了“汇编语言”课程且成绩在70分以上的学生学号、姓名、课程名及成绩。)

SELECTstudent_info.student_id,student_name,course_info.course_name,result_info.result

FROMstudent_info,course_info,result_info

WHEREstudent_info.student_id= result_info.student_id

ANDresult_info.course_no=course_info.course_no

AND course_info.course_name='汇编语言'

AND result_info.result>70

JOIN关键字指定的连接

T-SQL 扩展了以JOIN关键字连接的表示方式,使表的连接运算能力有了增强,可以将多个表连接起来,FOR关键字后面的连接格式为:

<first_table > <join_type> < second_table> ON<search_condition>|< first_table >CROSSJOIN < second_table >

其中first_table 、 second_table为需连接的表,join_type表示连接类型,ON用于指定连接条件

Join_type的格式为:[INNER|{ LEFT | RIGHT | FULL} [OUTER][<join_hint>] JOIN

其中INNER表示内连接,OUTER表示外连接,join_hint是连接提示。

CROSS JOIN表示交叉连接。因此,以JOIN关键字指定的连接有三种类型:

1、 内连接。内连接按照ON所指定的连接条件合并两个表,返回满足条件的行。

【例5-37】查找student数据库每个学生的基本情况以及班级情况。

SELECT*

FROMstudent_info INNER JOIN class_info

ONstudent_info.class_no= class_info.class_no

结果表将包含student_info表和class_info表的所有字段(重复字段为班级编号class_no),若要去除重复的班级编号,可将语句改为:

SELECT student_info.*,class_name,director,profession

FROM student_info INNER JOIN class_info

ON student_info.class_no=class_info.class_no

内连接是系统默认的,可以省略INNER关键字,使用内连接后仍可使用WHERE子句指定条件。

查找选修了课程编号为“2”的课程且

成绩在60分以上的学生姓名和成绩。

SELECT student_name,result FROMstudent_info JOIN result_info ON student_info.student_id=result_info.student_id WHERE result_info.course_no='2' AND result_info.result>60

查找选修了“汇编语言”课程且成绩在70分以上的学生学号、姓名、课程名及成绩。

SELECT student_info.student_id,student_name,course_info.course_name,result_info.result

FROM student_info JOIN result_info ONstudent_info.student_id= result_info.student_idJOINcourse_info

ONresult_info.course_no=course_info.course_no

WHEREcourse_info.course_name='汇编语言' AND result_info.result>70

外连接的结果表不但包含满足连接条件的行,还包括相应表中的所有行。外联接包括三种:

● 左向外联接(LEFT OUTER JOIN)或(LEFT JOIN)

结果表中除了满足连接条件的行,还包括左表中的所有行。包括第一个命名表(“左”表,出现在JOIN子句的最左边)中的所有行。不包括右表中的不匹配行。

● 右向外联接 (RIGHT OUTER JOIN) 或(RIGHT JOIN)

结果表中除了满足连接条件的行,还包括右表中的所有行。包括第二个命名表(“右”表,出现在JOIN子句的最右边)中的所有行。不包括左表中的不匹配行。

● 完整外部联接 (FULL OUTER JOIN)或(FULL JOIN)

结果表中除了满足连接条件的行,还包括两表中的所有行。若要通过在联接结果中包括不匹配的行保留不匹配信息,可以使用完整外部联接。

SQL Server 2000提供完整外部联接运算符FULL OUTER JOIN,不管另一个表是否有匹配的值,此运算符都包括两个表中的所有行。

采用左向外联接。查找200001班所有学生的学号、姓名及他们选修课程号,同时也列出该班没选课的学生的学号、姓名。

SELECT student_info.student_id, student_name,result_info.course_no

FROM student_info LEFT OUTER JOIN result_info ON student_info.student_id=result_info.student_id WHERE class_no='200001'

采用右向外联接。查找所有学生的学号、姓名及他们选修课程号,同时也列出没选课的学生的学号、姓名。将上面的示例中,将FROM子句中student_info表 和 result_info表交换一下位置,然后使用RIGHT OUTER JOIN:

SELECT student_info.student_id, student_name,result_info.course_no

FROM result_info RIGHT OUTER JOIN student_info

ON student_info.student_id=result_info.student_id

交叉联结

在这类联接的结果表内,是由第一个表的每行与第二个表的每行拼接后形成的表。交叉联接不使用WHERE子句。在数学上,就是表的笛卡儿积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。

【例5-43】 列出学生所有可能的选课情况。

SELECT student_id,student_name,course_no,course_name

FROM student_info CROSS JOIN course_info

子查询

子查询是一个SELECT查询,它返回单个值且嵌套在SELECT、INSERT、UPDATE、DELETE语句或其他子查询中。

任何允许使用表达式的地方都可以使用子查询。子查询也称为内部查询或内部选择,而包含子查询的语句也称为外部查询或外部选择。

子查询能够将比较复杂的查询分解为几个简单的查询,而且子查询可以嵌套,嵌套查询的过程是:首先执行内部查询,它查询出来的数据并不被显示出来,而是传递给外层语句,并作为外层语句的查询条件来使用。

使用子查询来查询学生“张小强”所在的班级。

SELECT class_name FROM class_info

WHERE class_no = (SELECT class_no FROM student_info WHERE student_name='张小强')

使用下面的连接方式也能完成此功能:

SELECT class_name FROM class_info JOIN student_info

ON (class_info.class_no = student_info.class_no)

WHERE student_name='张小强'

连接和子查询可能都要涉及两个或多个表,要注意连接与子查询的区别:连接可以合并两个或多个表中数据,而带子查询的SELECT语句的结果只能来自一个表,子查询的结果是用来作为选择结果数据时进行参照的。

有的查询既可以使用子查询来表达,也可以使用连接表达,例如上面的例子。通常使用子查询表示时可以将一个复杂的查询分解为一系列的逻辑步骤,条理清晰,而使用连接表示有执行速度快的优点。具体使用哪一种要根据具体情况而定。

可以在许多地方指定子查询。例如:

● 使用别名时。

● 使用IN或NOT IN时。

● 在UPDATE、DELETE和INSERT语句中。

● 使用比较运算符时。

● 使用ANY、SOME或ALL时。

● 使用EXISTS或NOT EXISTS时。

● 在有表达式的地方。

使用IN或NOT IN的子查询

IN 子查询用于进行一个给定值是否在子查询结果集中的判断,格式为:

表达式 [NOT] IN (子查询)

当表达式与子查询的结果表中的某个值相等时,IN谓词返回TRUE,否则返回FALSE,若使用了NOT,则返回

的值刚好相反。

【例5-45】查找选修了课程号为13的课程的学生情况。

SELECT * FROM student_info

WHERE student_idIN(SELECT student_id FROM result_infoWHERE course_no='13')

查找200001班没选修课程号为13的课程的学生情况。

SELECT * FROM student_info

WHERE class_no='200001' AND student_id NOT IN(SELECT student_id FROM result_info WHERE course_no='13')

使用多层嵌套子查询来查找选修了“数据库原理”课程的学生名单。

SELECT student_name FROM student_info

WHERE student_id IN (SELECT student_id FROM result_info WHERE course_no=

(SELECT course_no FROM course_infoWHERE course_name='数据库原理'))

查找没选修“数据库原理”课程的学生情况。

SELECT * FROM student_info

WHERE student_id NOT IN (SELECT student_id FROM result_info

WHERE course_no IN (SELECT course_no FROM course_info WHERE course_name='数据库原理'))

INSERT、DELETE和UPDATE语句中的子查询

子查询可以嵌套在UPDATE、DELETE和INSERT语句以及SELECT语句中。

1、插入子查询结果

前面介绍的插入操作,一次只能插入一条记录,其实,INSERT语句和SELECT语句结合起来,就可以插入批量的记录了。

基本格式:

INSERT INTO <表名> [( <字段1> [,<字段2>…] )]

SELECT [( <字段A>[,<字段B>…] )]

FROM <表名>

[WHERE <条件表达式> ]

创建一个新学生表stu,要求:包含4个字段 “学号”、“姓名”、“性别”和“家庭住址”,

然后将学生信息表中相应字段信息全部插入到新学生表中,最后显示插入的记录。

CREATE TABLE stu(学号 int NOT NULL PRIMARY KEY,

姓名 char(10),性别 char(2),家庭住址 char(50))

go

INSERT INTO stu (学号,姓名,性别,家庭住址)

SELECT student_id,student_name,student_sex,address

FROM student_info

go

SELECT * FROM stu

Go

需要注意的问题是:

● 新学生表stu的字段名可以与学生信息表不同。例如,stu的第1个字段名是“学号”,而不是原来的student_id。

● 新学生表的列数也不一定与原表的相同。但是要求对应列的类型必须保持一致因为不能把字符型拷贝成数值型。

2、带子查询的修改语句

与INSERT相同,在SQL中,子查询也可以嵌套。在UPDATE语句中,用来指定修改的条件。

【例5-50】将200001班的全体学生的成绩加10分。

UPDATE result_info SET result=result+10

WHERE student_id IN (SELECT student_id FROM student_info WHERE class_no='200001')

3、带子查询的删除语句

在SQL 中,同样子查询也可以嵌套在【DELETE】语句中,用来指定删除的条件。

【例5-51】删除没选修任何一门课的学生信息。

DELETE student_info

WHERE student_id IN (SELECT DISTINCT student_id FROM result_info)

使用比较运算符的子查询子查询可由一个比较运算符(=、<>、>、>=、<、!>,!<或<=)引入。这种子查询可以认为是IN子查询的扩展,它使表达式的值与子查询的结果进行比较运算,格式为:

表达式 {< | <= | = | > | >= | != | <> | !< | !> } { ALL | ANY } (子查询)

其中ALL和ANY说明对比较运算符的限制。

ALL指定表达式要与子查询的结果集中的每个值都进行比较,当表达式与每个值都满足比较的关系时,才返回TRUE,否则返回FALSE。

ANY表示表达式只要与子查询结果集中的某个值满足比较的关系时,就返回TRUE,否则返回FALSE。

例如,>ALL(1,2,3)表示表达式的值要大于3,才返回TRUE。>ANY(1,2,3)表示表达式至少大于一个值,

也就是表达式只要大于1或2或3,就返回TRUE。因此,要使带有>ALL的子查询中的某行满足外部查询中指定的条件,引入子查询的列中的值必须大于由子查询返回的值的列表中每个值。

同样,>ANY表示要使某一行满足外部查询中指定的条件,引入子查询的列中的值必须至少大于由子查询返回的值的列表中的一个值。

查找比所有200002班的学生年龄都大的学生。

SELECT student_id, student_name,class_no

FROM student_info

WHERE born_date < ALL

(SELECT born_date FROM student_info WHERE class_no='200002') AND class_no<>'200002'

查找比200002班某个学生年龄大的学生。

SELECT student_id, student_name,class_no

FROM student_info

WHERE born_date < ANY

(SELECT born_date FROM student_info WHERE class_no='200002')

AND class_no<>'200002'

查找课程号为13且成绩不低于课程号为14的最低成绩的学生的学号。

SELECT student_id FROM result_info

WHERE course_no='13' AND result !<ANY(SELECT result FROM result_info WHERE course_no='14')

使用EXISTS的子查询

使用EXISTS用于测试子查询的结果是否为空表。若子查询的结果集不为空,则EXISTS返回TRUE,否则返

回FALSE。EXISTS还可与NOT结合使用,即NOT EXISTS,其返回值与EXISTS刚好相反。格式为:[NOT] EXISTS (子查询)

【例5-56】查找选修了13号课程的学生名单。

SELECT student_name FROM student_info

WHERE EXISTS

(SELECT * FROM result_info WHERE course_no='13'AND student_id=student_info.student_id)

查找选修了全部课程的学生名单。

SELECT student_name FROM student_info

WHERE NOT EXISTS

(SELECT * FROM course_info WHERE NOT EXISTS

(SELECT * FROM result_info WHERE student_id=student_info.student_id AND course_no=course_info.course_no) )

相关子查询

如果子查询的WHERE子句引用外部查询表,则该查询称为相关子查询,也称为重复查询。

例如,在【例5-56】查找选修了13号课程的学生名单的例题即为相关子查询。该例在子查询的条件中使用了限定形式的列名引用

“student_info.student_id”,表示这里的学号列出自表student_info,与前面的子查询不同的是:前面的子查询内层查询只处理一次,得到一个结果集,再依次处理外层查询;而该例的内层查询要处理多次,因为内层查询与“student_info.student_id”有关,外层查询中student_info表的不同行有不同的学号值。

对于相关子查询,子查询的条件依赖于外层查询中的某些值,其执行过程如下:

(1)子查询为外部查询的每一行执行一次,即外部查询将相关的列值传给内部查询。

(2)如果子查询的任何行与其匹配,外部查询就返回结果行。

(3)再回到第一步,直到处理完外部表的所有行。

查找“计算机应用001班”的学生名单。

SELECT student_name FROM student_info

WHERE '计算机应用001班' IN(SELECT class_name FROM class_info WHERE class_no=student_info.class_no)

使用UNION运算符组合多个结果

使用UNION运算符可以将两个或多个SELECT语句的结果组合成—个结果集。使用UNION组合的结果集都必须具有相同的结构。而且它们的列数必须相同,并且相应的结果集列的数据类型必须兼容。

【例5-59】显示“200001班”以及“200002班”的学生编号和

学生姓名。

SELECT student_id,student_name FROM student_info WHERE class_no='200001'

UNION

SELECT student_id,student_name FROM student_info WHERE class_no='200002'

在查询的基础上创建新表

在SQL Server中,提供了INTO子句,使用INTO关键字可以创建新表并将结果行从查询插入新表中,新表可

以是一个永久或临时表。

基本格式:

SELECT <字段>

[INTO <新建表名> ]

FROM <表名>

[WHERE<过滤条例表达式>]

说明:

● 这是一种常用的创建临时表的方式,临时表以在表名前加(#或##)表示。

● 新创建表的结构由SELECT列表本身定义,新表的列顺序与SELECT列表中的顺序也相同,列名及数据类型也由SELECT列表确定。

将查询得到的学生名和班级名,插入到新建的表student_class中。

SELECT student_name,class_name INTO student_class

FROM student_info,class_info

WHERE student_info.class_no=class_info.class_no

创建“200001班”的学生表“student01”。

SELECT * INTO student01 FROM student_info WHERE class_no='200001'

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。