SQL语句之SELECT语句

打印 上一主题 下一主题

主题 753|帖子 753|积分 2259

一样平常格式
SELECT DISTINCT/ALL 目标列表达式   //要显示的属性列
FROM 表名/视图名   //查询的对象
WHERE 条件表达式   //查询条件
GROUP BY 列名 HAVING 条件表达式   //查询结果分组
ORDER BY 列名 序次;   //最终查询结果排序
  文章目次
一、根本查询
1、SELECT 目标列表达式
2、WHERE 条件表达式
3、GROUP BY 列名 HAVING 条件表达式
4、ORDER BY 序次
二、毗连查询
三、嵌套查询
1、IN-子查询
2、运算符-子查询
3、ANY/ALL-子查询
4、EXISTS-子查询
四、集合查询
1、UNION 并操纵
2、INTERSECT 交操纵
3、EXCEPT 差操纵
五、基于派生表的查询

一、根本查询

1、SELECT 目标列表达式

(1)查询指定列:SELECT 列名 1,列名 n
eg.查询 TAB 表的 X属性列和 Y属性列
  1. SELECT X, Y
  2. FROM TAB;
复制代码
(2)查询全部列:SELECT *
eg.查询 TAB 表的全部记载
  1. SELECT *
  2. FROM TAB;
复制代码
(3)查询盘算后的值:SELECT 表达式 //可以是算术表达式、字符串常量、函数等等
eg.查询 TAB 表(假定有一项属性 age 记载人们的年事)中人们的出生日期
  1. SELECT 2022-age
  2. FROM TAB;
复制代码
(4)改变查询结果的列标题:SELECT 列名 别名
eg.查询 TAB 表中的 X和Y属性列,并在结果中用别名 x1 和 y1 显示
  1. SELECT X x1, Y y1
  2. FROM TAB;
复制代码
(5)取消查询结果中的重复行:SELECT DISTINCT 列名
eg.查询 TAB 表中的X属性,并去掉结果中的重复列
  1. SELECT DISTINCT X, //如果没有用 DISTINCT,则默认为 ALL
  2. ​​​​​​​FROM TAB;
复制代码
(6)聚集函数
留意:当聚集函数遇到空值时,都跳过空值,只处理处罚非空值
聚集函数只能用于 SELECT 语句和 GROUP BY 中的 HAVING 子句(见后部分)
① 统计元组的个数
COUNT(*)//某个元组的一个或部分取空值时,不影响统计结果
eg.查询 Student 表中学生的总数
  1. SELECT COUNT(*)
  2. FROM SC;
复制代码
② 统计某一列值的个数
COUNT (DISTINCT/ALL 列名)
如果指定 DISTINCT,则表现盘算时要取消重复值。若不指定,则默以为 ALL,表现不取消重复值③ 盘算某一列值的均匀数(该列必须为数值型)
AVG (DISTINCT/ALL 列名)
eg 盘算 SC 表中的均匀结果(Grade)
  1. SELECT AVG(Grade)
  2. FROM SC;
复制代码
④ 盘算某一列值的总和(该列必须为数值型)
SUM(DISTINCT/ALL 列名)
⑤ 盘算某一列值的最大值/最小值
MAX/MIN (DISTINCT/ALL 列名)
2、WHERE 条件表达式

(1)比较大小
常用比较运算符: = > < >= <= !=(大概<>) !> !<
eg.查询 SC 表中全体盘算机学生的姓名
  1. SELECT Sname
  2. FROM SC
  3. WHERE Sdept='cs';
复制代码
eg.查询 TAB 表中X>20 的Y
  1. SELECT Y
  2. FROM TAB
  3. WHERE X>20;
复制代码
(2)确定范围
WHERE 列名 BETWEEN 最小值 AND 最大值;
eg.查询 TAB 表上 age 在 20 到 30 之间的人的 name 和 sex
  1. SELECT name, sex
  2. FROM TAB
  3. WHERE age BETWEEN 20 AND 30;
复制代码
WHERE 列名 NOT BETWEEN 最小值 AND 最大值;
eg.查询 TAB 表上 age 不在 20 到 30 之间的人的 name 和 sex
  1. SELECT name, sex
  2. FROM TAB
  3. WHERE age NOT BETWEEN 20 AND 30;
复制代码
(3)确定集合
WHERE 列名 IN('列名 1,'列名 n');
eg.在SC表的 Sdept列中査找属于盘算机专业(CS)、数学专业(MA)、信息专业(IS)的学生姓名(S name)
  1. SELECT Sname
  2. FROM SC
  3. WHERE Sdept IN ('CS', 'MA', 'IS’);
复制代码
WHERE 列名 NOT IN('列名 1','列名 n');
eg.在 SC表的 Sdept列中查找既不是盘算机专业(CS)也不是数学专业(MA)的学生姓名(Sname)
  1. SELECT S name
  2. FROM SC
  3. WHERE Sdept NOT IN ('CS', 'MA');
复制代码
(4)字符匹配
通配符:写在字符串当中,用来求一些有特殊条件的字符串
   %  表现任意长度(可以为 0)的字符串。如 a%b,表现以a开头,b结尾的任意长度字符串
_   表现单个字符。如 a_b,表现以a开头b结尾的长度为3的字符串
  留意:在 ASCII 码表中,一个汉字的长度为 2
转义字符:字符串中紧跟在转义字符后的字符"%"或"_"不再具有通配符的寄义
设置转义字符的语句为 ESCAPE"符号",该符号可以自己设置,一样平常接纳'\'
例如需要查找的字符串为"50%',那么应写"50\%',否则会査找以 50 开头的不定长字符串
WHERE 列名 LIKE '字符串' ESCAPE '\';
eg.在 Student 表中查找所有姓刘且全名为3个汉字的学生的 Sname、Sno 和 Ssex
  1. SELECT Sname, Sno, Ssex
  2. FROM Student
  3. WHERE Sname LIKE '刘_ _ _';
复制代码
eg.在 SC表中查找课程名(Cname)为 DB Design 的课程号(Cno)
  1. SELECT CnO
  2. FROM SC
  3. WHERE Cname LIKE 'DB\ Design' ESCAPE '\';
复制代码
WHERE 列名 NOT LIKE '字符串' ESCAPE '\';
eg.在 Student 表中查找所有不姓刘的学生的 Sname
  1. SELECT Sname
  2. FROM Student
  3. WHERE Sname NOT LIKE '刘%';
复制代码
(5)空值查询
WHERE 列名 IS NULL;
eg.在 SC表中查询缺少结果(Grade)的学生的姓名(Sname)
  1. SELECT Sname
  2. FROM SC
  3. WHERE Grade IS NULL;
复制代码
WHERE 列名 IS NOT NULL;
eg.查询全部有结果(Grade)的学生的姓名(Sname)
  1. SELECT Sname
  2. FROM SC
  3. WHERE Grade IS NOT NULL;
复制代码
(6)多重条件查询
WHERE 条件表达式 AND 条件表达式:
WHERE 条件表达式 OR 条件表达式;
可以用 AND 大概 OR将上述各类条件表达式组合在一起。其中,AND 的优先级大于 OR
3、GROUP BY 列名 HAVING 条件表达式

用于将查询结果按某一列或多列的值分组,值相等的为一组目的是细化聚集函数的作用对象,分组后聚集函数将作用于每一个组,每一组都有一个函数值
(1)GROUP BY 列名
eg.求 SC 表中,各个课程号(Cno)下相应的选课人数(Sno)
  1. SELECT Cno, COUNT(Sno)
  2. FROM SC
  3. GROUP BY Cno; //表示具有相同 Cno 值的元组为一组,对每一组用 COUNT 进行计算,求得该组的人数
复制代码
(2)GROUP BY 列名 HAVING 筛选条件
与 WHERE 的区别:
HAVING 用于从组中选择满意条件的组
WHERE用于从根本表或视图中选择满意条件的元组(留意:WHERE 子句不可以接聚集函数)
eg.在 SC表中查询均匀结果(Grade)大于等于 90的学生学号(Sno)和均匀结果(Grade)
  1. SELECT Sno, Grade
  2. ​​​​​​​FROM SC
  3. GROUP BY Sno
  4. HAVING AVG(Grade)>=90;
复制代码
4、ORDER BY 序次

ORDER BY 列名 1 列名n ASC
对查询结果按照一个或多个属性列的升序排列(若不表明序次,默以为升序)
ORDER BY 列名 1 列名n DESC
对查询结果按照一个或多个属性列的降序排列
eg.查序 SC 表中 Cno 为3的学生的 Sno 和 Grade,结果按照 Grade 的降序排列
  1. SELECT Sno, Grade
  2. FROM SC
  3. WHERE Cno='3'
  4. ORDER BY Grade DESC;
复制代码
二、毗连查询

1、两表毗连查询
WHERE 表名 1.列名1 比较运算符 表名 2.列名 2; //当列名在到场毗连的各表中唯一时,可省去表名前缀
eg.查询 Student 表中学生的情况以及 SC表中他们对应的选课情况,要求在一个查询结果中展示
  1. SELECT Student.*,Sc.* //若两个表中有相同名的属性列,自然连接
  2. FROM Student, Sc
  3. WHERE Student.Sno=Sc.Sno; //用 Sno 作为连接字段,将两个表连接在一起
复制代码
/*若想得到自然毗连,则枚举全部属性列,并去掉一个雷同的属性列即可。可以将上述 SELECT 语句改写如下*/
SELECT Student.Sno, Sname, Ssex, Sage, Sdept, Cno, Grade
eg.在 Student表和 SC表中,查询选修了2号课程(Cno='2”)且结果(Grade)在90 分以上的学生学号(Sno)和姓名(Sname)
  1. SELECT Student.Sno, Sname
  2. FROM Student, SC
  3. WHERE Student.Sno=SC.Sno AND SC.Cno='2' AND SC.Grade>90; // AND 用作多重条件
复制代码
2、单表毗连查询
eg.在 Course 表中查询先修课的先修课(即间接先修课),其中课程号为 Cno,先修课程号为 Cpno
  1. SELECT FIRST.CNO, SECOND.Cpno//利用下述别名进行选择
  2. FROM Course FIRST, Course SECOND//为这个表取两个别名
  3. WHERE FIRST.CpnO=SECOND.Cno;
复制代码
3、外毗连查询
将悬浮元组保留在结果关系中,没有属性值的位置填上 NULL
(1)左外毗连查询
FROM 表名1LEFT OUTER JOIN 表名2 ON(毗连条件); //也可以将 ON 换成 USING,去掉结果中的重复值
(2)右外毗连查询
FROM 表名1 RIGHT OUTER JOIN 表名 2 ON(毗连条件);
eg.以 Student表为主体列,排出每个学生的根本情况和选课情况(SC 表中),没选课的学生仍旧保留在结果中
  1. SELECT Student.Sno, Sname, Ssex, Sage, Sdept, Cno, Grade
  2. FROM Student LEFT OUTER JOIN SC ON (Student.Sno=Sc.Sno); //左外连接
复制代码
4、多表毗连查询
WHERE 表名 1.列名 1=表名 2.列名 2 AND 表名 2.列名 2=表名 3.列名 3
多表毗连一样平常是先进行两个表的毗连操纵,再将其毗连结果与第三个表执行毗连
eg.从 Student表、SC表、Course 表中查询每个学生的学号(Sno)、姓名(Sname)、课程(Cname)和结果(Grade)
  1. SELECT Student.Sno, Sname, Cname, GradeFROM Student, SC, Course
  2. WHERE Student.Sno=Sc.Sno AND SC.Cno=Course.Cno;
复制代码
三、嵌套查询

查询块:SELECT-FROM-WHERE
嵌套査询:将一个查询块嵌套在另一个查询块的 WHERE 子句大概 HAVING 子句其中,上层的查询块称为外层查询/父查询;下层的查询块称为内层查询/子查询
留意:子査询的 SELECT 语句中不能使用 ORDER BY 子句,ORDER BY 子句只能对最终查询结果排序
1、IN-子查询

父查询与子查询之间用 IN 毗连
WHERE 列名 IN(子查询);
eg.查找与刘晨同一个专业的同砚
  1. SELECT Sdept
  2. FROM Student
  3. WHERE Sname='刘晨;
复制代码
查找结果为刘晨在 CS 专业,之后再査找 CS 专业的学生
  1. SELECT Sno, Sname, Sdept
  2. FROM Student
  3. WHERE Sdept='Cs';
复制代码
  1. SELECT Sno, Sname, Sdept
  2. FROM Student
  3. WHERE Sdept IN
  4.     (SELECT Sdept
  5.      FROM Student
  6.      WHERE Sname='刘晨”);//本例的子查询条件不依赖于父査询,这类子査询称为不相关子查询比较
复制代码
2、运算符-子查询

父查询与子查询之间用比较运算符毗连
WHERE 列名 比较运算符(子查询);//当用户能确切知道内层査询返回的是单个值时,可用比较运算符毗连
eg.在 SC表中,找出每个学生(Sno)超过他自己选修课程均匀结果(Grade)的课程号(Cno)
  1. SELECT Sno, Cno
  2. FROM SC x //x 是表 SC 的别名,又称为元组变量,可以用来表示 SC 的一个元组
  3. WHERE Grade >=
  4.         (SELECT AVG(Grade)
  5.          FROM SC y
  6.          WHERE y.Sno=x.Sno);/*本例的子查询条件依赖于父查询,这类子查询称为相关子查询,整个查询称为相关嵌套查询*/
复制代码
3、ANY/ALL-子查询

WHERE 列名 比较运算符 ANY/ALL (子查询); //有的体系中 ANY用 SOME 取代 

eg.在 Student表中,查询不是 CS 专业的学生中,比 CS 专业任意一个学生年纪小的学生姓名和年事
  1. SELECT Sname, Sage
  2. FROM Student
  3. WHERE Sage<ANY
  4.     (SELECT Sage
  5.      FROM Student
  6.      WHERE Sdept='CS')
  7. AND Sdept<>'CS://注意这是父查询块中的条件
复制代码
4、EXISTS-子查询

EXISTS 代表存在量词(与之对应的为 NOT EXISTS)
EXISTS 谓词的子查询不返回任何数据,只产生逻辑真值'true"或逻辑假值'false
逻辑蕴涵表达:
eg1.在 SC表中查询至少选修了1号学生选修的全部课程(Cno)的学生的学号(Sno)
  1. SELECT DISTINCT SnO
  2. FROM SC SCX
  3. WEHRE NOT EXISTS
  4.     (SELECT *    //由 EXISTS 引出的子查询,其目标列表达式通常都用*
  5.      FROM SC SCY
  6.      WHERE SCY.SnO='1' AND NOT EXISTS
  7.         (SELECT *
  8.          FROM SC SCZ
  9.      WHERE SCZ.Sno=SCX.Sno AND SCZ.Cno=SCY.Cno)
  10.     );
复制代码
eg2.基于 SC表,查询选修了全部课程(Course 表)的学生姓名(Student 表)
  1. SELECT SnameFROM Student
  2. WHERE NOT EXISTS
  3.     (SELECT *
  4.      FROM Course
  5.      WHERE NOT EXISTS
  6.         (SELECT *
  7.          FROM SC
  8.          WHERE Sno=Student.Sno AND Cno=Course.Cno)
  9.     );
复制代码
四、集合查询

多个 SELECT 语句的结果可以进行集合的并(UNION)、交(INTERSECT)、差(EXCEPT)操纵
留意:参加集合操纵的各查询结果的列数必须雷同;对应项的数据范例也必须雷同
SELECT 语句1 UNION/INTERSECT/EXCEPT SELECT 语句 2
1、UNION 并操纵

UNION 合并查询结果时,体系会自动去掉重复元组,若需保留,则接纳 UNION ALL
eg1.在 Student 表中查询 CS 专业的学生和年事不大于 19 岁的学生
  1. SELECT *
  2. FROM Student
  3. WHERE Sdept='CS
  4. UNION
  5. SELECT *
  6. FROM Student
  7. WEHRE Sage<=19;
复制代码
eg2.在 SC 表中查询选修了课程1大概课程2的学生
  1. SELECT SnO
  2. FROM SC
  3. WHERE CnO='1'
  4. UNION
  5. SELECT SnO
  6. FROM SC
  7. WEHRE Cno='2';
复制代码
2、INTERSECT 交操纵

eg.查询既选修了课程1又选修了课程2的学生
  1. SELECT SnO
  2. FROM SC
  3. WHERE Cno='1’
  4. INTERSECT
  5. SELECT SnO
  6. FROM SC
  7. WEHRE Cno='2';
复制代码
3、EXCEPT 差操纵

eg.查询 CS 专业的学生与年事不大于 19 岁的学生的差集
  1. SELECT *
  2. FROM Student
  3. WHERE Sdept='CS'
  4. EXCEPT
  5. SELECT *
  6. FROM Student
  7. WEHRE Sage<=19;
复制代码
五、基于派生表的查询

子查询出现在 FROM 子句时,子查询将生成暂时的派生表,成为主查询的查询对象。
FROM (子查询 ) AS 别名(属性列名 1,属性列名 n);
//如果子査询中没有聚集函数,派生表可以不指定属性列,子査询 SELECT 子句后面的列名为其默认属性
//AS 可以省略,但必须为派生表关系指定一个别名;
eg1.找出每个学生超过他自己选修课程均匀结果的课程号
  1. SELECT Sno, Cno
  2. FROM SC, (SELECT SnO, Avg(Grade) FROM SC GROUP BY Sno) AS Avg_sc(avg_sno, avg_grade)
  3. WHERE SC.Sno = Avg_sc.avg_sno AND SC.Grade>=Avg_sc.avg_grade;
复制代码
eg2.查询所有选修了1号课程的学生姓名
  1. SELECT Sname
  2. FROM Student, (SECLECT SnO FROM SC WHERE CnO='1') AS SC1
  3. WHERE Student.Sno=Sc1.Sno;
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

天津储鑫盛钢材现货供应商

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表