今天阿猪带领大家正式进入第四步的学习
查询处理和表数据编辑
一、查询数据
1.简单查询
2.统计
3.连接查询
4.子查询
5.联合查询
二、表数据编辑
1.插入数据
2.修改数据
3.删除数据
查询处理和表数据编辑
一、查询数据
1.简单查询
语法
SELECT 目标表达式
FROM 表名
(1)查询指定列
SELECT 姓名
FROM 项目表
(2)查询所有列
注意:用*表示所有列,把表中所有列按照表中的顺序全部输出
SELECT *
FROM 项目表
(3)查询计算列
可以将查询出来的属性经过一定计算后列出结果
SELECT 姓名,累计学分,累计学分-累计学分*0.1
FROM 学生表
(4)为列起别名
1.用AS关键字
2.用=来连接
SELECT 姓名 AS name,累计学分 AS Ogpa,Ngpa=累计学分-累计学分*0.1
FROM 学生表
注意:当列的别名有空格时要用单引号括起来
SELECT 姓名 AS '学生表 NAME'
FROM 学生表
(5)使用DISTINCT关键字消除重复元组
SELECT DISTINCT 所在院系,专业
FROM 学生表
注意:这样就删除重复的
DISTINCT关键字的作用范围他是整个查询列表
2.查询满足条件的元组
用WHERE查询
查询条件返回TRUE(真),FALSE(假),UNKNOWN(未知)
NOT ,AND,OR三表逻辑运算
NOT | 结果 |
T | F |
F | T |
U | U |
AND | T | F | U |
T | T | F | U |
F | F | F | F |
U | U | F | U |
OR | T | F | U |
T | T | T | T |
F | T | F | U |
U | T | U | U |
常见查询条件
查询条件 | 运算符(0) | 条件(逻辑表达式)格式 | 备注 |
比较大小 | =,>,<,>=,<=,!=,,!>,!< | op1op 2 | 双目运算 |
确定范围 | [NOT] BETWEEN AND | 0p1 [NOT] BETWEEN op2 AND op 3 | 三目运算 |
确定集合 | [NOT]IN | op 1[NOT] IN op 2 | 双目运算 |
字符串匹配 | [NOT] LIKE | op 1[NOT] LIKE op 2 | 双目运算 |
空值 | IS[NOT] NULL | op IS[NOT]NULL | 单目运算 |
多重条件 | NOT, AND, OR, () | NO op, op1 AND op 2, opi1OR op 2 | NOT是单目运算, 其余是双目运算,括号用于改变运算优先级 |
比较大小
(1)查询所有来自杭州的学生
SELECT *
FROM 学生表
WHERE 籍贯='杭州'
(2)查询累计学分在160以下的学生姓名和累计学分
SELECT 姓名,累计学分
FROM 学生表
WHERE 累计学分<160
确定范围
定义
op1 [NOT] BETWEEN op2 AND op3
含义:若op1不在op2和op3之间则条件为真否则为假
查询累计学分在150和159之间的学生姓名和累计学分
SELECT 学号,姓名
FROM 学生表
WHERE 累计学分 BETWEEN 150 AND 159
确定集合
语法 IN
查询(不是 )来自杭州,大同,太原的学生学号和姓名
SELECT 学号,姓名
FROM 学生表
WHERE 籍贯 (NOT) IN (‘杭州’,‘大同’,‘太原’)
查询学号后两位是09,或者等于学号前两位或者中间两位得学生学号和姓名
SELECT 学号,姓名
FROM 学生表
WHERE SUMBSTRING (学号,6,2)IN (‘09’,SUMBSTRING(学号,2,2),SUMBSTRING(学号,4,2))
注意:SUMBSTRING(s,p,c)的含义是返回字符串s中从第p个字符串开始,长度为c的子串
字符串匹配
语法LIKE
特殊字符:
% | 匹配任意长度的字符串(长度可以为0) |
_ | 匹配任意一个字符 |
[c1c2…cn] | 匹配字符c1,c2…cn,中的一个。当c1,c2,… cn,连续时可简化为[c1-cn] |
[ ^ c1c2….cn ] | 匹配除c1,c2…cn,外的一个字符。当c1,c2,…cn,连续时可简化为[ ^ c1-cn] |
例题
查询姓名中第二个字为“鹏”的学生学号和姓名
SELECT 学号,姓名
FROM 学生表
WHERE 姓名LIKE ‘_鹏%’
查询学号长度不等于7,或者学号后六位含有非数字字符的学生学号和姓名
SELECT 学号,姓名
FROM 学生表
WHERE 学号NOT LINK'S[0-9][0-9][0-9][0-9][0-9][0-9]'
查询学号最后一位既不是1也不是3也不是9的学生学号和姓名
SELECT 学号,姓名
FROM 学生表
WHERE 学号 LINK '%[^139]'
要查询课程名以“DB_”开头的课程信息注意其中的_只是普通的,此刻要用ESCAPE
select*
from 课程表
where课名 LINK'DB\_%' ESCAPE '\'
ESCAPE ''短语表示‘'为换码字符,这样模式串中紧跟在‘\’后面的字符‘’不在具有通配符的含义,而被转义成普通的‘’字符
涉及空值的查询
语法IS NOT NULL
查询有成绩的学号和开课号
SELECT 学号,开课号
FROM 选课表
WHERE 成绩 IS NOT NULL
注意:IS 不能用=代替,IS NOT 不能用!=和<>代替
多重条件查询
OR AND NOT优先级从大到小OR AND NOT
查询这样的男生,他的电话号码前三位是‘130’他来自杭州或宁碧他既不主修电子商务,也不主修信息管理专业
SELECT*
FROM 学生表
WHERE 性别=‘男’AND SUBSTRING(移动电话,1,3)=‘130’AND(籍贯=‘杭州’ OR 籍贯=‘宁波’)AND NOT 专业 IN (‘电子商务’,‘信息管理’)
3.对查询结果排序
语法:OEDER BY
SELECT 学号
FROM 选课表
WHERE 开课号=‘000100’
ORDER BY 成绩 DESE,成绩+10
查询选修了开课编号为‘000100’的课程的学生学号、成绩,以及成绩+10分后的新成绩,查询结果按原来成绩降序,按新成绩升序
注意:DESE为降序,不写莫仍为升序
2.统计
1.常用的统计函数
函数格式 | 函数功能 |
COUNT([DISTINCT]*) | 统计元组个数 |
COUNT([DISTINCT]<列表达式>) | 统计列值个数 |
SUM | 计算数值型列表达式的总和 |
AVG | 计算数值型列表达式的平均值 |
MAX | 求列表达式的最大值 |
MIN | 求列表达式的最小值 |
查询所有课本的总价格和平均价格,以及打七折后的总价格和平均价格
SELECT SUM(定价) AS 原总价,AVG(定价),SUM(定价*0.7)折扣总价,折扣均价=AVG(定价*0.7)
FROM (课程表)
COUNT(*)用来统计满足条件的元组个数
查询课程编号前两位数字是“02”的课程总数
SELECT COUNT (*)
FROM 课程表
WHERE 课号 LINK 'C02%'
2.分组查询
(1)GROUP BY子句进行分组
SELECT 开课号,COUNT (学号)
FROM 选课表
GROUP BY 开课号
具有相同开课号的元组被分为一组
(2)HAVING短语来帅选
3.连接查询
在列名前+<.表名>作为限定
查询学生表的基本信息及选课信息
SELECT 学生表.*,开课号,成绩
FROM 学生表 AS A,选课表AS B
WHERE 学生表.学号=选课表.学号
使用JOIN ON 关键字
JOIN 用于连接两张表,ON给出两张表的连接条件
查询至少选修了学号为‘S060110’的学生所选一门课程的学生学号和姓名
SELECT DISTINCT Z.学号, 姓名
FROM 选课表 X JOIN 选课表 Y ON Y.学号!=X.学号 AND Y.开课号=x.开课号
JOIN 学生表Z ON Y.学号=Z.学号
WHEREx.学号='S060110'
外连接
左外连接:将左边关系中未用到的列加到结果集把=改为"*=”,或者JOIN 改为LEFT OUTER JOIN
右外连接:将右边关系中未用到的列加到结果集把=改为"=*”,或者JOIN 改为RIGHT OUTER JOIN
全外连接:将左右关系全部连接,将JOIN改为FULL OUTER JOIN
查询学生的学号、姓名、籍贯信息及选课信息
(1)左外连接
SELECT学生表.学号, 姓名,籍贯,开课号,成绩
FROM学生表, 选课表
WHERE 学生表.学号*=选课表.学号
(2)右外连接
SELECT学生表.学号, 姓名, 籍贯, 开课号, 成绩
FROM 学生表 RIGHT OUTER JOIN 选课表 ON 学生表.学号=选课表.学号
(3)全外连接
SELECT 学生表.学号, 姓名, 籍贯, 开课号, 成绩
FROM 学生表 FULL OUTER JOIN 选课表 ON 学生表.学号=选课表.学号
4.子查询
嵌套SELECT语句叫子查询,一个 SELECT 语句的查询结果能够作为另一个语句的输入值。
子查询不但能够出现在Where子句中,也能够出现在from子句中,作为一个临时表使用,也能够出现在select list中,作为一个字段值来返回。
1、单行子查询 :单行子查询是指子查询的返回结果只有一行数据。当主查询语句的条件语句中引用子查询结果时可用单行比较符号(=, >, <, >=, <=, <>)来进行比较。
例:
select ename,deptno,sal
from emp
where deptno=(select deptno from dept where loc='NEW YORK');
2、多行子查询:多行子查询即是子查询的返回结果是多行数据。当主查询语句的条件语句中引用子查询结果时必须用多行比较符号(IN,ALL,ANY)来进行比较。
IN的含义是匹配子查询结果中的任一个值即可(“IN” 操作符,能够测试某个值是否在一个列表中),ALL则必须要符合子查询的所有值才可,ANY要符合子查询结果的任何一个值即可
注意ALL 和ANY 操作符不能单独使用,而只能与单行比较符(=、>、< 、>= 、<= 、<>)结合使用。
例:1、单行子查询
select ename,deptno,sal
from emp
where deptno=(select deptno
from dept
where loc='NEW YORK');
2、多行子查询
SELECT ename,job,sal
FROM EMP
WHERE deptno in ( SELECT deptno
FROM dept
WHERE dname LIKE 'A%');
3、多列子查询
SELECT deptno,ename,job,sal
FROM EMP
WHERE (deptno,sal) IN (SELECT deptno,MAX(sal) FROM EMP GROUP BY deptno);
5.联合查询
UNION将多个查询结果合并起来,个结果表的列数相同
查询计算机专业和信息管理专业的学生信息。
SELECT*
FROM 学生表
WHERE 专业='计算机'
UNION
SELECT
FROM 学生表
WHERE 专业='信息管理'
二、表数据编辑
插入数据
1.插入单个元组
2.插入子查询结果
3.使用SELECT …INTO语句进行数据插入
修改数据
语法
UPDATE <表名>
SET<列名>=<表达式>[,....n]
UPDATE语句用来修改指定表中满足WHERE条件的元组,用SET子句中的值取代响应的值
修改表中所有行
将学生的累计学分增加3分
UPDATE 学生表
SET 累计学分=累计学分+3
修改某些行
将计算机专业所有女上的籍贯改为“杭州”,累计学分+3
UPDATE 学生表
SET 累计学分=累计学分+3,籍贯='杭州'
WHERE 专业='计算机'AND 性别=‘女;’
删除数据
语法
DELETE [FROM] <目标表名>
[FROM <表名>[,...n]]
[WHERE <条件>]
DELETE用来删除满足WHERE条件的元组
从学生表中删除计算机专业所有女生信息
DELETE FROM 学生表
WHERE 专业=‘计算机’AND性别=‘女’
将学生表清空
DELECT FROM 学生表
TRUNCATE TABLE <目标表名>
比较快不记录日志的操作,删除的数据无法恢复