数据库数据查询
什么是查询呢?
查询是对已有表中的数据按照某种条件进⾏筛选,将满⾜条件的数据筛选出来形成⼀个新的记录集进⾏显⽰,也称为查询结果记录集,
这个记录集的结构与表的结构类似,由⾏和列组成,但它并不是真正存放在数据库中的表,⽽是⼀种存放在计算机内存中的虚拟表。
若省略查询条件,则返回数据源中的所有记录⾏。
查询是查和筛选功能的扩充,它不但能实现数据检索,⽽且可以在查询过程中进⾏计算、合并不同数据源的数据,甚⾄可以添加、更改或删除基本表中的数据。
查询的数据源
查询的数据源(也称为“记录源”,RecordSource)是存放在数据库中的基本表或已经创建好的视图,可以有⼀个或多个数据源。
若是多个数据源,则需指定这些数据源之间的关联关系,以保证查询结果的正确性
查询的结果
查询的结果只有在运⾏查询时才会产⽣,因此也称为动态结果记录集,这个结果集的显⽰可以通过前⾯我们所学过的视图来实现。
数据查询是数据库的核⼼操作。SELECT语句是SQL语⾔中功能最强⼤的语句。
语句格式
SELECT [ALL|DISTINCT] <⽬标列表达式> [,<⽬标列表达式>] ....
FROM <;表名或视图名>[,< 表名或视图名> ] .... (SELECT语句)[AS]<;别名>
[WHERE<;条件表达式>]
[GROUP BY<;列名1>[ HAVING<;条件表达式> ] ]
[ ORDER BY <;列名2> [ ASC|DESC ] ] ;
SELECT⼦句:指定要显⽰的属性列
FROM⼦句:指定查询对象(基本表或视图)
WHERE⼦句:指定查询条件
GROUP BY⼦句:对查询结果按指定列的值分组,该属性列值相等的元组为⼀个组。通常会在每组中作⽤聚集函数。HAVING短语:只有满⾜指定条件的组才予以输出
ORDER BY⼦句: 对查询结果表按指定列值的升序
单表查询
查询仅涉及⼀个表,是⼀种最简单的查询操作
1.选择表中的若⼲列(列查询)
2.选择表中的若⼲元组(⾏查询)
3.对查询结果排序
4.使⽤聚集函数
单表查询语句基本格式:
[USE 数据库名称]
select ⽬标列表达式 [......n]
from 表名
where 条件(表达式)
[ORDER BY排序条件]
列查询
1.查询指定列
例:查询全体学⽣的学号和姓名
select sno,sname
from student
2.查询全部列
例:查询全体学⽣的详细记录
select sno,sname,sgender,sage,sdept
from student
select*
from student
3.查询经过计算的值
SELECT⼦句的<⽬标列表达式>为表达式(算术表达式、字符串常量、函数、列别名)
例:查询全体学⽣的姓名、出⽣年份和所在系,要求⽤⼩写字母表⽰所有系名,并使⽤列别名改变查询结果的列标题select sname as'name',year(getdate())-year(cssj) as'年龄','Year of Birth:'as'Birth:',year(getdate())-sage as'BirthDay',lower(sdept) 'department' from student
选择表中的若⼲元组
1.取消取值重复的⾏
在SELECT⼦句中使⽤DISTINCT短语
select/*(默认 ALL)*/ sno
from sc
select distinct sno,cgrade
from sc
注意DISTINCT短语的作⽤范围是所有⽬标列
2.查询满⾜条件的元组
WHERE⼦句常⽤查询条件
查询条件谓词
⽐较=、>、<、>=、<=、!=、<>、!>、!<、NOT+其他⽐较运算符
确定范围、
确定集合IN、NOT IN
字符匹配LIKE、NOT LIKE
空值IS NULL、NOT IS NULL
多重条件AND、OR
(1)⽐较⼤⼩
(2)确定范围
(3)确定集合
例:查询系别为IS、MA、CS的学⽣信息
select*
from student
where sdept IN('IS','MA','CS')
(4)字符串匹配
[NOT] LIKE ‘< 匹配串>’ [ESCAPE ‘<;换码字符>’]
<;匹配串>:指定匹配模板
匹配模板:固定字符串或含通配符的字符串
当匹配模板为固定字符串时,
可以⽤ = 运算符取代 LIKE 谓词,⽤ != 或 <> 运算符取代 NOT LIKE 谓词
通配符
% (百分号)代表任意长度(长度可以为0)的字符串
例: a%b 表⽰以a开头,以b结尾的任意长度的字符串。如acb,addgb,ab等都满⾜该匹配串。
_( 下横线)代表任意单个字符
例: a_b表⽰以a开头,以b结尾的长度为3的任意字符串。如acb,afb等都满⾜该匹配串。
ESCAPE短语:
当⽤户要查询的字符串本⾝就含有 % 或 _ 时,要使⽤ESCAPE '<;换码字符>' 短语对通配符进⾏转义。
匹配模板为固定字符串
例:查询学号为95001的学⽣的详细情况
select*
from student
where sno like'95001'/*等价于where sno = '95001'*/
匹配模板为含通配符的字符串
例:查询名字中第2个字为‘阳’字的学⽣的详细信息
select*
from student
where sname like'_阳%'
使⽤换码字符将通配符转义为普通字符
例:查询以“DB_”开头,且倒数第三个字符为'i'的课程的详细情况
select*
from course
where cname like'DB\_%i__'
escape'\'
(5)涉及空表的查询
使⽤谓词IS NULL或IS NOT NULL ( “IS NULL”不能⽤“= NULL”代替 )
(6)多重条件查询
⽤逻辑运算符AND和OR来联结多个查询条件 ( AND的优先级⾼于OR,但可以⽤括号改变优先级 )
连接查询
连接查询是同时涉及多个表的查询
连接查询概念:
同时涉及多个表的查询称为连接查询
⽤来连接两个表的条件称为连接条件或连接谓词
连接谓词中的列名称为连接字段
注意:连接条件中的各字段类型必须是可⽐的,但字段名不必是相同的
连接查询的执⾏过程
⾸先在表1中到第⼀个元组,然后从头开始扫描表2,逐⼀查满⾜连接条件的元组,到后就将表1中的第⼀个元组与该元组拼接起来,形成结果表中⼀个元组。
表2全部查完后,再表1中第⼆个元组,然后再从头开始扫描表2,逐⼀查满⾜连接条件的元组,到后就将表1中的第⼆个元组与该元组拼接起来,形成结果表中⼀个元组。
重复上述操作,直到表1中的全部元组都处理完毕。
连接操作说明
SQL的连接操作是通过关联表间的⾏的匹配⽽产⽣的结果。
参与连接的表可以有多个,但连接操作在两个表之间进⾏,即两两连接。
join on是什么连接
连接查询的主要内容
SQL中连接查询的主要类型
1.⼴义笛卡尔积
不带连接谓词的连接,很少使⽤
2.等值连接查询
连接运算符为 ‘=’的连接操作注意事项:
[<;表名1>.]<;列名1> = [<;表名2>.]<;列名2>
任何⼦句中引⽤表1和表2中同名属性时,都必须加表名前缀。引⽤唯⼀属性名时可以加也可以省略表名前缀。
3.⾮等值连接查询
连接运算符不是‘=’的连接操作
SQL连接的类型
1.利⽤别名查询
2.内连接查询
3.外连接查询
4.⾃⾝连接查询
使⽤表别名进⾏查询
USE stu
select s.sno,s.sname,s.sdept
from student as s
内连接查询(INNER JOIN)
内连接时,如果两个表的相关字段满⾜连接条件,就从这两个表中提取数据并组合成新的记录。只有满⾜条件的记录才能出现在结果集中。根据⽐较⽅式,内连接分为三种:
1.等值连接
使⽤=运算符⽐较被连接列的列值。
2.⾮等值连接
使⽤>、>=、<、<=、!>、!<;和<>号进⾏⽐较运算的连接。
3.⾃然连接
等值连接的特殊情形,是去掉重复列的等值连接。
内连接查询中的各个表地位平等,⽆主从关系。
以下两种写法等同
USE stu
select s.sno,sname,sdept,cno,cgrade
from student as s inner join sc on s.sno=sc.sno
USE stu
select s.sno,sname,sdept,cno,cgrade
from student as s,sc