一、SQL99是如何使用连接的,与SQL92的区别是什么?
交叉连接:实际就是笛卡尔乘积,我们采用CROSS JOIN。
得到player和team两张表的笛卡尔积:
SELECT * FROM player CROSS JOIN team
多表交叉连接:
SELECT * FROM table1 CROSS JOIN table2 CROSS JOIN table3
自然连接:自动查询两张连接表中所有相同的字段,然后进行等值连接。
SELECT colName1, colName2 FROM player NATURAL JOIN team
ON连接:用来指定我们想要的连接条件。
SELECT 列列表 FROM 表1 JOIN 表2 ON 连接条件
USING连接:可以指定数据表里的同名字段进行等值连接。
SELECT 列列表 FROM 表1 JOIN 表2 USING (共同列)
外连接:一般省略OUTER不写。
左外连接:LEFT JOIN或LEFT OUTER JOIN
SELECT * FROM player LEFT JOIN team ON player.team_id = team.team_id
右外连接:RIGHT JOIN或RIGHT OUTER JOIN
SELECT * FROM player RIGHT JOIN team ON player.team_id = team.team_id
全外连接:FULL JOIN或FULL OUTER JOIN
SELECT * FROM player FULL JOIN team ON player.team_id = team.team_id
ps:MySQL不支持全外连接。全外连接的结果=左右表匹配的数据+左表没有匹配到的数据+右表没有匹配到的数据。
自连接:将一个表看作两个不同实例,从而进行更复杂的数据分析或查询。
SELECT 列列表 FROM 表别名1, 表别名2 WHERE 连接条件
名称 | 作用 |
---|---|
内连接 | 多个表之间满足连接条件的数据行查询出来。包括:等值连接、非等值连接、自连接。 |
外连接 | 返回一个表中的所有记录,以及另一个表中匹配的行。包括:左外连接、右外连接、全连接。 |
交叉连接 | 返回左表中每一行与右表中每一行的组合。 |
二、试图在SQL中的作用是什么,它是怎样工作的?
视图:虚拟表,本身不具有数据。视图一方面可以帮我们使用表的一部分而不是所有的表,另一方面也可以针对不同的用户制定不同的查询视图。
视图作为一张虚拟表,封装了底层和数据表的接口,相当于一张或多张表的数据结果集。
创建视图:
CREATE VIEW view_name AS
SELECT colName1, colName2
FROM table
WHERE condition
嵌套视图:
CREATE VIEW player_above_above_avg_height AS
SELECT player_id, height
FROM player
WHERE height > (SELECT AVG(height) FROM player_above_avg_height)
修改视图:
ALTER VIEW view_name AS
SELECT colName1, colName2
FROM table
WHERE condition
删除视图:
DROP VIEW view_name
使用视图简化SQL操作:
- 完成复杂的连接
- 对数据进行格式化
- 使用视图与计算字段
三、什么是存储过程,在实际项目中用得多么?
视图时虚拟表,通常不对底层数据表直接操作,而存储过程时程序化的SQL,可以直接操作底层数据表。存储过程可以说是SQL语句和流控制语句构成的语句集合。
定义一个存储过程:
CREATE PROCEDURE 存储过程名称([参数列表])
BEGIN
需要执行的语句
END
删除存储过程:DRPO PROCEDURE 存储过程名称
更新存储过程:ALTER PROCEDURE 存储过程名称
参数类型 | 是否返回 | 作用 |
---|---|---|
IN | 否 | 向存储过程传入参数,存储过程中修改该参数的值,不能被返回。 |
OUT | 是 | 把存储过程计算的结果放到该参数中,调用者可以得到返回值。 |
INOUT | 是 | IN和OUT的结合,既用于存储过程的传入参数,同时又可以把计算结果放到参数中,调用者可以得到返回值。 |