单表查询

mac2026-08-05  19

单表查询

对于SQL语句,SELECT 和 FROM 子句是必须的,其他是可选的,其基本语法为:

SELECT A1,A2....,An FROM R1,R2,...,Rn WHERE P

SELECT子句:用于指定查询结果中需要的属性或表达式。 FROM子句:用来给出查询所涉及的表,表可以是基本表,视图或查询表。 WHERE子句:用来指定查询结果元组所需要满足的条件。

- 查询指定列

SELECT studentNo,studentNname FROM student

- 查询所有列

SELECT * FROM student

- 消除重复元组

SQL查询默认不消除重复元组,需要消除重复元组,可以使用关键字 DISTINCT

查询学生中存在的所有民族。

/* 不消除重复元组查询 查询出来的学生民族将存在重复的现象 */ SELECT nation FROM student /* 消除重复元组 */ SELECT DISTINCT nation FROM student

- 条件查询

WHERE子句可以实现关系代数中的选择运算,用于查询满足选择条件的元组。 WHERE子句中常用的查询条件运算符如下:

比较运算:>,>=,<,<=,=,<>(或!=);范围查询:BETWEEN···AND;集合查询:IN;空值查询 :IS null;字符匹配查询:LIKE;逻辑查询:AND,OR,NOT;

比较运算:

查询所有汉族学生的学号,姓名:

SELECT studentNo,studentNname FROM student WHERE nation = '汉族'

范围查询:BETWEEN···AND

BETWEEN … AND 用于查询介于两个值之间的数据范围的元组,NOT BETWEEN … AND用于查询不在两个值之间的数据范围的元组。这些值可以是数值、文本或者日期。

查询年龄18~20岁之间学生的学号,姓名

SELECT studentNo,studentNname FROM student WHERE age BETWEEN 18 AND 20 //查询不在范围之中,使用 NOT BETWEEN 18 AND 20

集合查询:IN

IN用于查询属性值在某个集合中的元组,NOT IN用于查询属性值在某个集合中的元组。

查询 汉族,藏族或回族学生的学号,姓名

SELECT studentNo,studentNname FROM student WHERE nation IN('汉族','藏族','回族')

空值查询 :IS null

IS null 可用于查询属性值为空值,这里IS 不能用 “=” 代替。

查询民族为空值的学生信息

SELECT * FROM student WHERE nation IS null

字符匹配查询:LIKE

LIKE 可用于字符匹配查询。LIKE 的语法格式为: [NOT] LIKE <匹配字符串> [ESCAPE<换码字符>] 查询的含义:LIKE 前没有NOT ,则查询指定的属性列值于<匹配字符串>相匹配的元组,有NOT则是不匹配。<匹配字符串>可以是一个具体的字符串,也可以是字符串加通配符%和 _ 。其中: 通配符“%”表示任意长度的字符串,如“%华”,表示以“华”结尾的任意字符串,“刘%华”,表示以“刘”开头,“华”结尾的任意字符串。 通配符“ _ ”表示任意一个字符,如“刘德 _ ,表示以“刘德”开头的任意3个字符的字符串,如“ _ _刘德华”表示以“刘德华”结尾的任意5个字符的字符串。

/*查询所有姓刘的同学的学生信息*/ SELECT * FROM student WHERE studentName LIKE '刘%' /*查询所有姓王且名字为3个字的同学的学生信息*/ SELECT * FROM student WHERE studentName LIKE '王 _ _' /*查询所有姓名中不含有“杰”的同学的学生信息*/ SELECT * FROM student WHERE studentName NOT LIKE '%杰%' /*在班级Class表中查询班级名称中含有“16_”符号的班级名称*/ SELECT className FROM Class WHERE className LIKE '%16\_%' ESCAPE '\'

ESCAPE ‘’ 表示\为换码字符,这样紧跟在符号\后面的_不是通配符,而是普通的查询符号。

逻辑查询:AND,OR,NOT

使用AND、OR、NOT 分别实现逻辑与,逻辑或,逻辑非。

查询民族为汉族,性别为女并且年龄小于20岁的学生信息

SELECT * FROM student WHERE nation = '汉族' AND sex = '女' AND age<20

查询民族为汉族或藏族的学生信息

SELECT * FROM student WHERE nation = '汉族' or nation = '藏族'

排序运算

SQL排序运算是通过使用ORDER BY 子句实现,其语法为: ORDER BY <表达式1> [ASC|DESC] [,<表达式2>[ASC|DESC]···] 其中:<表达式>可以是属性、函数或表达式,默认按升序(ASC)排序,要按降序排序必须指明DESC选项。在查询结果中首先按<表达式1>的值排序,在<表达式1>相同时,再按<表达式2>排序,以此类推。

查询籍贯不是“汉族”的同学信息,并按籍贯降序,学号升序排序输出。

SELECT * FROM student WHERE nation != '汉族' ORDER BY nation DESC,studentNo

聚合查询

SQL查询提供的集合函数主要包括以下几个:

count( [DISTINCT|ALL] { * |<列名> } ):统计关系的元组个数或一列中值的个数sum( [DISTINCT|ALL] { <列名> } ):统计一列中值的总和(此列必须是数值型)avg( [DISTINCT|ALL] { <列名>}):统计一列中值的平均值(此列必须是数值型)max( [DISTINCT|ALL] { <列名> } ):统计一列中值的最大值min( [DISTINCT|ALL] { <列名> } ):统计一列中值的最小值 如果指定DISTINCT谓词,表示消除<列名>中的重复元组,然后再统计;如果指定ALL或没有DISTINCT谓词,则不消除。 查询学生总人数 SELECT count(*) FROM student 查询所有学生的民族个数 SELECT count(DISTINCT nation) FROM student WHERE nation = '汉族' 查询学生中的平均年龄 SELECT avg(age) FROM student

分组聚合

SQL语句中通过GROUP BY 和HAVING 子句实现分组运算,其中: GROUP BY 子句对查询结果按每一列或某几列进行分组,值相等的分为一组; HAVING 子句对分组的结果进行选择,仅输出满足条件的组,必须的GROUP BY子句配合使用。

查询民族人数在50以上的每个同学的民族,性别,年龄

SELECT nation, sex ,age FROM student GROUD BY nation HAVING count(nation)>=50

WHERE和HAVING的区别 WHERE是先在数据库中筛选了再通过SELECT查询数据,而HAVING是SELECT查询完数据过后,通过HAVING筛选后输出数据。

最新回复(0)