数据查询操作:SELECT
查询是数据库中的核心部分,对数据库中的数据的使用必定离不开数据库的操作,该语句的功能丰富,使用也是比较方便的。
查询包括:无条件查询,有条件查询,分组查询,排序查询,多关系连接查询,嵌套查询,含有子查询的数据更新。
无条件查询:
语句基本格式:
SELECT [DISTINCT/ALL]<目标列表达式AS【别名】清单>
FROM<关系名>
默认情况是all
1)查询关系中的所有信息:
SELECT *
FROM STUDENT;
SELECT NAME,AGE,SEX
FROM STUDENT;
2)指定查询的列:
SELECT NAME
FROM STUDENT;
SELECT DISTINCT HEIGHT
FROM STUDENT;
当对查询出的结果进行一个计算的时候,基本语法格式是
SELECT <目标列表达式>AS[别名]
FROM STUDENT;
这里的目标表达式可以是属性名,计算表达式,常量,还可以是集函数,不同的RDBMS有不同的集函数,但是都有以下几种:
COUNT(ALL/DISTINCT*)统计结果中原组的个数
COUNT(DISTINCT/ALL<列名>)统计结果中国列的个数
MAX(<列名>)计算列中的最大值
MIN(<列名>)计算列中的最小值
SUM([DISTINCT/ALL]<>)计算列中数值的总和
AVG([DISTINCT/ALL]<>)计算列中数值的平均数
代码实例:
计算学生平均年龄和学生年龄的总和
SELECT AVG(AGE)AS AVGAGE
FROM STUDENT;
SELECT SUM(AGE)AS SUMAGE
FROM STUDENT;
带条件的单关系查询
语句的基本格式
SELECT <[DISTINCT/ALL]<目标表达式>AS[别名]>
FROM<关系/列名>
WHERE<条件>
WHERE <查询表达式>中不能用集函数作为条件表达式根据查询条件的不同又可以将单表条件查询分为以下几种:
1.使用比较运算符:
比较操作符有:> ,<, =, >=,<=,<>最后一个代表的是不等于,代码实例:
SELECT NAME
FROM STUDENT
WHERE AGE >20;
找到年龄大于20岁的学生姓名
2.使用特殊运算符号
特殊运算符号:
IN ,NOT IN 检测属性值是否属于集合之一
BETWEEN ....AND...,NOT BETWEEN...AND..检测属性值是否在两个值之间
IS NULL ,IS NOT NULL 检测属性值是否为空
LIKE ,NOT LIKE 字符串匹配
代码实例
SELECT NAME
FROM STUDENT
WHERE AGE BETWEEN 20 AND 23;查询年龄在20和23之间的学生姓名
SELECT NAME
FROM STUDENT
WHERE AGE IN (18,22);查询年龄为18或者22的学生姓名
SELECT NAME
FROM STUDENT
WHERE NAME LIKE '李%';查询姓李的学生
对于字符串的匹配问题,有两个符号一个是%一个是_%表示多个字符,而_表示只有一个字符,通过这两个特殊符号和所要匹配的字符串之间的顺序搭配就可以很好的找到符合条件的语句。
3)多条件单关系查询
基本语法表达形式
WHERE <条件1>AND|OR|NOT<条件2>
当我们在查询的时候需要多个条件,这个时候我们就需要通过AND,OR,NOT,这三个连接词进行连接。
代码实例:
SELECT NAME
FROM STUDENT
WHERE AGE<20 AND SEX = 'MAN';
分组查询
分组查询就是将SELECT 语句和GROUP BY语句进行了一汇总
语句基本格式
SELECT [DISTINCT/ALL]<[别名]>
FROM <关系名/列名>
WHERE<查询条件表达式><p style="font-size:18px;">GROUP BY <列名></p>HAVING <条件表达式>;
代码实例:我们从Student中选择年龄大于20岁的学生然后按着男生女生进行平均分组
SELECT SEX,AVG(HEIGHT)AS AVGHEIGHT
FROM STUDENT
WHERE AGE >20
GROUP BY SEX;
排序查询
排序查询就是在查询的后面添加上了升序或者降序的排序,升序DESC降序ASC,默认是降序排列;
代码实例
SELECT NAME, CNUM,AGE
FROM STUDENT
WHERE SEX = 'MAN'
GROUP BY CNUM DESC,ASE;
从学生表中选择出来男同学,先按班级号进行排序,然后按着年龄进行排序,这里的一个疑问就是select语句后面如果没有标明的,在后面的过程中能否将其作为一个分组条件来使用呢,比如这里的ASE ,
多关系连接查询
多关系连接查询就是要用到的表不止一个了,它是将融合各个表进行查询操作,连接类型分为以下几种,交叉连接,内部连接,外部连接,自身连接
1)交叉连接
基本语法格式
SELECT [DISTINCT/ALL]<列属性清单>
FROM <关系名清单>
SELECT S.NAME, S.SNO,C.SNO.,C.CNUM
FROM STUDENT S,CLASS C;
通过这个我们可以将学生表和班级表进行了一个连接,但是这种连接在现实中是没有多大意义的。
2)内连接
基本语法格式
SELECT [DISTINCT/ALL]<目标列表达式>
FROM <关系名> INNER JOIN <关系名>
ON<连接条件表达式>
SELECT [DISTINCT/ALL]<目标列表达式>
FROM <关系名>
WHERE<连接条件表达式>
代码实例,将上面的交叉连接做了一个区分,通过这个可以挑选出在class表中的学号和Student表中一样的数据,而不是全部的数据,又有一个疑问就是上面的叉连接的时候,两张表中的数据是怎么进行排列,是将前一个表的每一条记录对应后一张表的所有记录。现在我们通过对其学号的判断,这样使之与之前的表所对应的就是满足学号相同的条件的时候才可以。
SELECT S.NAME, S.SNO,C.SNO.,C.CNUM
FROM STUDENT S,CLASS C;
WHERE S.SNO = C.SNO;
3)外连接
外连接又分为做外连接和右外连接,还有全外连接,左外连接就是在右表中将左表中不匹配的数据用null值来进行替代。
代码实例:
SELECT S.NAME,S.SNO,C.SNO,C.CNUM
FROM STUDENT S,CLASS C;
WHERE S.SNO* = C.SNO;
SELECT S.NAME ,S.SNO,C.SNO,C.NUM
FROM CLASS C LEFT JOIN STUDENT S
ON C.SNO = S.SNO;
在学生表中将班级表中没有匹配的学生学号在学生表中用null值来进行替代。
4)自身连接
当我们自身的一个属性和自身的一个属性之间存在关系,我们需要的就是将自身做成两个表,然后把它当做一个内连接就好了,类似情况出现在所有员工的信息表中,员工存在着被管理的属性,被管理的属性记录的是管理者的ID,同时管理者又有自己的ID,所以说将两个表连接起来就是需要我们将信息表延伸成为两张表,然后将其进行内连接,就可以找到管理所属者了。
代码实例:
SELECT EMP1.ENO,EMP1.NAME,EMP2.EMGR,EMP2.NAME
FROM EMPLOYEE EMP1,EMPLOYEE EMP2
WHERE EMP1.ENO = EMP2.EMGR;
通过这个,我们就会找到每一个人直接被管理人的信息。
嵌套查询
嵌套查询在这又分为了四类
1)使用in嵌套查询
2)使用比较运算符的查询
3)使用between的嵌套查询
4)相关子查询
前三种嵌套查询都是子查询和父查询没有任何关系,没有任何关联,子查询的结果作为父查询的结果,但是第四种其父查询和子查询之间是存在关联的,下面通过代码实例来展示着三种嵌套查询方式:
IN嵌套查询
SELECT NAME
FROM STUDENT
WHERE SNO IN (
SELECT SNO
FROM CLASS
WHERE CNAME = '1'
);
选出Student表中一班的学生,同时可以通过NOT IN 来选择不是一班的学生
使用比较运算符查询
SELECT NAME
FROM STUDENT
WHERE AGE>
(SELECT AVG(AGE)
FROM STUDENT);
选出年龄大于所有学生平均年龄的学生
使用BETWEEN嵌套查询
SELECT NAME
FROM STUDENT
WHERE AGE BETWEEN
(SELECT AVG(AGE)
FROM STUDENT) AND 25;
选择年龄大于平均年龄小于25岁的学生
相关子查询
SELECT NAME
FROM STUDENT S1
WHERE AGE BETWEEN
(SELECT AVG(AGE)
FROM STUDENT S2
WHERE S1.CNUM = S2.CNUM)
AND 25;
这个我们选择的是年龄在本班级的平均年龄和25岁之间的学生,之前选择的是全部学生的,所以第二次的这个在进行查询的时候就需要用到父查询的信息。
多个SELECT语句的集合操作
SELECT操作查询语句得到的是一个集合,所以可以进行集合的一些操作,例如交操作,并操作,和差操作
在对select集合进行集合运算的时候,前提条件是结果集必须具有相同的列数和数据类型,同时集合的运算会在缺省的条件下自动消重。
含有子查询的数据更新
与之前对数据的操作,这里多的是将以前的条件语句中加入了查询的语句,通过这个查询语句,来完成对于数据的操作。对于插入操作,通过select可以实现同时插入多行数据。