SQL基础之数据的查询

一、数据查询的一般格式:

  SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>] …
  [INTO 新表名]
  FROM <表名或视图名>[, <表名或视图名> ] …
  [ WHERE <条件表达式> ]
  [ GROUP BY <列名1> [ HAVING <条件表达式> ] ]
  [ ORDER BY <列名2> [ ASC|DESC ] ];

二、单表查询

  1. 查询指定列与计算的值

    (1) 查询指定列:只需在SELECT子句中加入要查询指定列字段即可,有时会根据题意要求去从,那么得在字段前添加DISTINCT关键字。

SELECT DISTINCT  Sno
FROM SC; 

    (2) 查询经过计算的值:在SELECT子句中的目标列表达式可以为如下:

  •  算术表达式
  • 字符串常量
  • 函数
  • 列的别名
SELECT Sname,2009-Sage  --查询算术表达式结果
FROM Student;

SELECT Sname,‘Year of Birth:‘    --查询字符串常量
FROM Student;

SELECT Sname,LOWER(Sdept)    --查询经过函数处理的字段信息结果
FROM Student;

--查询结果为列的信息,不过视图上列名为别名
SELECT Sname AS NAME,’Year of Birth: ’ AS BIRTH
FROM Student;

  2. 查询满足条件的元组

    (1) 比较大小

    查询谓词:=,>,<,>=,<=,!=,<>,!>,!<;NOT+上述比较运算符

SELECT COUNT(Jno) AS ‘项目总数‘ FROM SPJ WHERE Sno = ‘S1‘;

    (2) 确认范围:

    查询谓词:BETWEEN AND,NOT BETWEEN AND

SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23;

    (3) 确认集合:

    查询谓词:IN ,  NOT IN

SELECT Sname,Ssex
FROM  Student
WHERE Sdept IN ( ‘IS‘,‘MA‘,‘CS‘ );

    (4) 字符匹配

    查询谓词:[NOT] LIKE ‘<匹配串>’ [ESCAPE ‘ <换码字符>’]

    匹配串为含通配符的字符串
    %:代表任意长度(长度可以为0)的字符串
    _:代表单个字符

--查询所有姓刘学生的姓名、学号和性别。
SELECT Sname,Sno,Ssex
FROM Student
WHERE  Sname LIKE ‘刘%‘;
--查询姓"欧阳"且全名为三个汉字的学生的姓名。
SELECT Sname
FROM   Student
WHERE  Sname LIKE ‘欧阳_‘;

    使用换码字符ESCAPE将通配符转义为普通字符

--查询以"DB_"开头,且倒数第3个字符为 i的课程的详细情况。
SELECT  *
FROM   Course
WHERE  Cname LIKE  ‘DB\_%i_ _‘
ESCAPE ‘ \ ‘;

    (5) 空值查询

    查询谓词:IS NULL 或 IS NOT NULL

SELECT Sno,Cno
FROM  SC
WHERE  Grade IS NULL;

    (6) 多重条件查询

    查询谓词:AND和OR来联结多个查询条件,其中查询条件又可包含上述的查询条件。

SELECT Sname
FROM  Student
WHERE Sdept= ‘CS‘ AND Sage<20;

  3. ORDER BY ... DESC/ASC (缺省值为升序)

    表示对查询结果的升降序显示,ASC为升序,DESC为降序。

SELECT Sno,Grade
FROM  SC
WHERE  Cno= ‘ 3 ‘
ORDER BY Grade DESC;

    注意:

      当排序列含空值时,ASC:排序列为空值的元组最后显示,DESC:排序列为空值的元组最先显示。

      ORDER BY 不能在子查询中使用,由于ORDER BY是对查询结果的排序。

  4. GROUP BY ... HAVING ...    

    其作用对象是查询的中间结果表,最终结果表为按指定条件对查询结果的分组结果。

    GROUP BY后为分组依据(字段名),被指定的一列或多列值分组,值相等的为一组;HAVING后多为聚合函数满足条件,聚合函数将会分别作用于前面根据分组依据分完组的每个组。

/*查询供应了3个以上项目的供应商代码和供应的项目总数。*/
SELECT Sno, COUNT(DISTINCT Jno) AS ‘项目总数‘
FROM SPJ
GROUP BY Sno
HAVING COUNT(DISTINCT Jno) > 3;

    注意:

     使用Group By子句后,Select子句的字段列表达式只能是分组依据和聚集函数

    HAVING短语与WHERE子句的主要区别是作用对象不同,其中WHERE子句作用于基表或视图,从中选择满足条件的元组,而HAVING短语作用于组,从中选择满足条件的组

  5. 聚合函数

  计数:
  COUNT([DISTINCT|ALL] *)
  COUNT([DISTINCT|ALL] <列名>)
  计算总和:
  SUM([DISTINCT|ALL] <列名>)
  计算平均值:
  AVG([DISTINCT|ALL] <列名>)
  最大最小值:
  MAX([DISTINCT|ALL] <列名>)
  MIN([DISTINCT|ALL] <列名>)

SELECT COUNT(Jno) AS ‘项目总数‘
FROM SPJ
WHERE Sno = ‘S1‘;

  注意:只能在SELECT子句中或HAVING后使用。

三、连接查询

  连接查询为多表查询,即把要查询的记录在两个表中,那么就要连接两表来查询。其中包含连接谓词:用来连接两个表的条件,必须要求连接字段数据类型是可比的,

  例如:SELECT SUM(Ccredit) FROM SC, Course WHERE Sno=‘200215122‘ AND SC.Cno=Course.Cno。

  3种类型的连接查询执行过程:

    嵌套循环法(NESTED-LOOP)

    排序合并法(SORT-MERGE)

    常用于=连接索引连接(INDEX-JOIN)

  1. 等值与非等值查询

  等值连接运算符:=

  非等值连接运算符:!=

SELECT  *
FROM     Student,SC
WHERE  Student.Sno = SC.Sno;
SELECT  *
FROM     Student,SC
WHERE  Student.Sno != SC.Sno;

  自然连接则为在等值连接的基础上消除重复的列

SELECT  Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM     Student,SC
WHERE  Student.Sno = SC.Sno;
SELECT  Student.Sno,sc.sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM     Student,SC
WHERE  Student.Sno != SC.Sno;

  2. 自身连接

  一个表和其自身表连接,注意必须给表起别名加以区分不同表的属性,否则sql引擎识别不出你要指定的属性,会报错。

--查询每门课程的有先修课程的课程名
SELECT  FIRST.Cno,SECOND.Cpno
FROM  Course  FIRST,Course  SECOND
WHERE FIRST.Cpno = SECOND.Cno;

  3. 外连接

  这里根据内连接与外连接的区别来讲解外连接:

  (1) 内联接:(典型的联接运算,使用像 =  或 <> 之类的比较运算符)。包括相等联接和自然联接。     
    内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如,检索 students和courses表中学生标识号相同的所有行。   
  (2) 外联接:外联接可以是左向外联接、右向外联接或完整外部联接。     
    在 FROM子句中指定外联接时,可以由下列几组关键字中的一组指定:     
    1)LEFT  JOIN或LEFT OUTER JOIN     
    左向外联接的结果集包括  LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。       
    2)RIGHT  JOIN 或 RIGHT  OUTER  JOIN     
    右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。       
    3)FULL  JOIN 或 FULL OUTER JOIN
    完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

/*查询每个学生及其选修课程的情况*/
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM  Student  INNER JOIN SC
ON   Student.Sno=SC.Sno;
--结果集合种不包括未选修课的学生

/*查询所有学生的选修课程的情况*/
SELECT Student.Sno, Sname, Ssex, Sage, Sdept, Cno, Grade
FROM  Student LEFT OUTER  JOIN SC
ON Student.Sno=SC.Sno;
--结果集种没有选课的学生也包含在内,Cno和Grade字段显示为null

  4. 多表查询

/*查询每个学生的学号、姓名、选修的课程名及成绩*/
SELECT Student.Sno,Sname,Cname,Grade
FROM  Student,SC,Course
WHERE Student.Sno = SC.Sno
AND SC.Cno = Course.Cno;

四、嵌套查询

原文地址:https://www.cnblogs.com/chenloveslife/p/9001822.html

时间: 2024-10-17 21:54:25

SQL基础之数据的查询的相关文章

sql Server 重复数据的查询,删除

业务需求 最近给公司做一个小工具,把某个数据库(数据源)的数据导进另一个数据(目标数据库).要求导入目标数据库的数据不能出现重复.但情况是数据源本身就有重复的数据.所以要先清除数据源数据. 于是就把关于重复数据的查询和处理总结一下.这里只可虑基于数据库解决方案.不考虑程序的实现. 环境为:SQL Server 2005和SQL Server 2005 基于数据库的解决方案 数据库测试表dbo.Member 一,带有having条件的分组查询方法 (1)查询某一列重复记录 语句: SELECT N

SQL 基础之使用子查询检索数据(二十二)

多列子查询 where (manager_id, department_id) in 子查询 100 90 102 60 124 50 主查询的每行都与多行和多列的子查询进行比较 列的比较 多列的比较,包含子查询可以是: 不成对比较 成对比较 成对比较子查询1.显示与员工名为"John"同部门且同一个经理的其它员工信息 select employee_id, manager_id, department_id from empl_demo where (manager_id, depa

SQL 基础之多表查询(十)

JOINS 类型和它的语法 Natural joins(自然连接): – NATURAL JOIN 子句 – USING 子句 – ON 子句 自连接 非等值连接 Outer joins(外连接): – LEFT OUTER JOIN(左外连接) – RIGHT OUTER JOIN(右外连接) – FULL OUTER JOIN(全外连接) 笛卡尔积 – Cross join(交叉连接) 语法: select table1.column, table2.column from table1 [

SQL基础:数据表的创建

1. 先选择创建表所在的数据库 2. 创建表 3. 查看表是否创建成功 4. 主键:要求主键列的数据唯一,且不允许为空.主键能够唯一的标识表中的每一条记录,可以结合外键来定义不同数据表之间的关系,并且可以加快数据库查询的速度. 主键分为:单字段主键和多字段联合主键. 4.1 单字段主键 4.1.1 定义方式一:在定义列的同时指定主键 4.1.2 定义方式二:在定义完所有的列之后指定主键 4.2 多字段联合主键 5. 使用外键约束 外键用来在两个表之间建立连接,可以是一列或多列.一个表的外键可以是

1、SQL基础整理(基本查询)

分离.附加.备份.还原 --去重 select distinct 列名from表名 --更新 update fenshu set name = ‘李四’where code = 9 --更改表名 sp_rename 表名 drop database 数据库名(删除数据库)drop table 表名 Delete from table where 列 表达式 值 select *from xinxi where fenshu between 80 and 100(两数必需前小后大) select

SQL基础:数据表的查看及修改

1. 查看表基本结构 可简写 DESC 表名: Null:是否可用存储Null值 Key:该列是否已编制索引.PRI表示该列是表主键的一部分:UNI表示该列是UNIQUE索引的一部分:MUL表示在列中某个给定值允许出现多次 Default:该列是否有默认值,为多少 Extra:获取与给定列有关的附件信息,如:属性值自增 2. 查看表详细结构 ------------------------------------------------- 1.修改表名 alter table (旧表名) ren

SQL基础知识--多行查询结果拼接

今天在工作中遇到如下这个问题,需要将如下的查询结果,拼接成一行! 1 select PERSON_NAME from S_PROJECT_MEMBER where PROJECT_ID = '2c9081473e2f8bda013e3028e4700049'; 先直接上代码吧!-------------------------有问题的,麻烦指出-------------------------------------------------------- select CAST(stuff((

7、SQL基础整理(子查询)

子查询 (用来进行两表等之间的查询) ***括号里面的查询只能显示一个列的信息 select *from haha where age in ( select MAX(age) from haha where bumen = '销售部' )and bumen in ( select bumen from haha group by bumen having COUNT(*)>5 ) --练习:按年龄从小到大排序后第..人的信息 select top 3 *from haha where code

[SQL] SQL 基础知识梳理(二) - 查询基础

SELECT 语句基础 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5904824.html 序 目录 一.SELECT 语句基础 1.查询指定列:SELECT 关键字 --语法: --SELECT <列名>, ... -- 希望查询列的名称 --FROM <表名> -- 指定选取数据的表 -- 从 Shohin 中取 3 列 SELECT shohin_id, shohin_mei, hanbai_tanka -- 列的顺序可以任