单表查询
对于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筛选后输出数据。