- SELECT: 选择
- INSERT: 插入
- UPDATE: 更新
- DELETE: 删除(只删除内容,不删除定义)
- DROP: 删除(既删除内容,也删除定义)
- DISTINC: 消除重复
1.数据操作顺序
SELECT *| 列名
FROM 表名
WHERE 条件
GROUP BY 属性(列名) 按属性分组
HAVING 过滤分组
ORDER BY 排序 (ASC 升序 DESC 降序)
先查询 -> 再分组 -> 聚集函数 -> HAVING 筛选分组 -> 排序
2. WHERE(行选择)
模式匹配的例子:
SELECT fName,adress
FROM PrivateOwner
WHERE adress LIKE ‘%Glasgow%’
此查询语句可以找出查询地址中包括字符串Glasgow的所有业主
3. 聚集函数
- COUNT:返回行数,可对任意字段使用
- SUM:返回总和,只对数值字段使用
- AVG:求平均值,只对数值字段使用
- MIN:求最小值,可对任意字段使用
- MAX:求最大值,可对任意字段使用
ps:除了COUNT,每个函数在计算前要去掉空值,计算非空值
COUNT(DISTINCT)消除重复
先查询才能用聚集函数,而且聚集函数只能用在SELECT 和 HAVING 中
如果SELECT中运用了聚集函数,且接下来没有用GROUP BY,那么SELECT中不能有单独的列名存在,如果有列名,则要写在GROUP。
例如:
错误:staff 是单独的列名
SELECT stafffNo COUNT(salary)
FROM Staff
正确
SELECT stafffNo COUNT(salary)
FROM Staff
GROUP BY stafffNo
ORDER BY stafffNo
4. GROUP BY
5. having
分组约束,顾名思义就是过滤分组的,看例子
SELECT branchNo COUNT(stafffNo )
FROM Staff
GROUP BY branchNo
HAVING (stafffNo ) > 1 //员工数>1
ORDER BY branchNo
6. ANY / ALL
表示存在一个或者多个 / 所有都要满足 才能真
7. 连接
从多个表中得到结果,可用子查询也可以用连接。但当最终表要有多个表中数据只能用连接
7.1 简单连接
SELECT s.branchNo stafffNo
FROM Staff s, Branch b, PropertyForRent p
WHERE s.branchNo = b.branchNo AND s.staffNo= p.staffNo
(ps : 三表连接 用AND 连接)
另外三种方式:
FROM Staff s JOIN Branch b ON s.branchNo = b.branchNo (产生两个branchNo列)
FROM Staff s, Branch b USING branchNo (产生一个branchNo列)
FROM Staff NATURAL JOIN Branch (产生一个branchNo列)
7.3 笛卡尔乘积 CROSS JOIN
SELECT s.branchNo stafffNo
FROM Staff s CROSS JOIN Branch b
7. 4 外连接
- 左外连接: …LEFT JOIN…ON…(保留左边不匹配的行,用NULL填充右边)
- 右外连接: …RIGHTJOIN…ON…(保留右边不匹配的行,用NULL填充右边)
- 全外连接: …FULL JOIN…ON…(保留两个表中所有不匹配的行)
例子:
SELECT p.* , b.*
FROM PropertyForRent p LEFT JOIN Branch b ON b.bCity = p.pCity
7.5 EXISTS / NOT EXISTS
存在一个即为真
在子查询中,我们可以对查询的结果表进行再操作,但是并不能把多个表的数据放到我们需要的最终表中,连接可以是最终表拥有多个表的信息,但是他是对原始表进行操作,那么如果我要中间产生的结果表出现在最终表中怎么办呢?是的,大家肯定都知道,我们直接合并结果不就好了!(.= =)
7.5 合并结果表
可以用交并差来合并两个结果表
- UNION (并)
- INTERSECT(交)
- EXCEPT(差)
以上都是从表中获取我们需要的信息,那么如果表要更新,获取出错了要进行修改我们该如何做呢?(永运不变的是需求的变化。莫名的想起了课上老师说的 = =)
7.6 增删改查
增删改查:INSERT, DELETE, UPDATE, SELECT
看例子:
- 增加(添加)
INSERT INTO Staff (staffNo, salary)
VLUES(‘SG16’, 81000);
PS:
一是如果按照建表的顺序插入数据,INSERT一行括号内可以不指定列名
二是除了数值数据,其余都要加单引号
-
删
(1)
DELETE FROM Staff
WHERE staffNo = ‘SG16’; //删除指定行
(2)
DELETE FROM Staff; //删除所有行 -
改
UPDATE Staff
SET salary=9000; //删除指定行
今天天气很好,加油!