连接查询
1. 交叉连接(笛卡尔积)Cross Join
实例1.1:完成车辆表与线路表的交叉连接
代码如下:
-- 1.1实现线路表与车辆表笛卡尔积
SELECT * FROM line CROSS JOIN vehicle
运行效果:
语法:SELECT 字段列表 FROM 表名1 CROSS JOIN 表名2
交叉连接要点总结:使用select语句查询 通过from 表名1 CROSS JOIN 表名2 实现交叉连接(笛卡尔积)
缺点:如果不用on语句标识相同字段名,则会出现重复记录
2.内连接查询 INNER JOIN
实例2.1: 使用内连接获取车辆型号含有“DD”字样的车辆信息和司机信息,要求车辆信息为全部列,机信息中只需包含姓名和身份证
-- 2.1使用内连接获取车辆型号含有“DD”字样的车辆信息和司机信息,要求车辆信息为全部列,司机信息中只需包含姓名和身份证
SELECT name '姓名' , licenseNo '身份证',vehicleID '车辆ID',plateNo '车牌编号' , model '车辆型号',type '车辆种类' ,lineID '线路ID',driverID '司机ID'
FROM driver join vehicle on driver.driverID = vehicle.driverID
WHERE model LIKE 'DD%'
实例2.2: 使用内连接获取年龄大于 35 岁的司机信息和该司机所驾驶的车辆信息,要求车辆信息为全部列,司机信息中只需包含姓名、出生年月和电话
-- 2.2使用内连接获取年龄大于 35 岁的司机信息和该司机所驾驶的车辆信息,要求车辆信息为全部列,司机信息中只需包含姓名、出生年月和电话
SELECT name '姓名' , birthday '出生年月' , phone '电话',vehicleID '车辆ID',plateNo '车牌编号' , model '车辆型号',type '车辆种类' ,lineID '线路ID'
FROM driver JOIN vehicle on driver.driverID = vehicle.vehicleID
WHERE FLOOR(DATEDIFF(NOW(),birthday)/365) > 35
语法:SELECET 字段列表 FROM 表名1 [INNER(内连接)] JOIN 表名2 ON 表名1.字段名(与表名2字段名相同) = 表名2.字段名(与表名1字段相同) 【where 条件表达式】
内连接要点总结:
1.INNER 可以省略.
2.WHERE 看情况使用.
3.表名1和表名2的字段名连接条件一般为主键和外键关系.
4.On 表可以别名 如果使用了别名 那么只能用别名来标识
5.如果使用on标识相同字段那么这个字段无法被查询(实例1中如下的问题)
3. 自然连接 NATURAL JOIN
实例3.1: 使用自然连接获取车辆型号含有“DD”字样的车辆信息和司机信息,要求车辆信息为全部列,司机信息中只需包含姓名和身份证
-- 3.1使用自然连接获取车辆型号含有“DD”字样的车辆信息和司机信息,要求车辆信息为全部列,司机信息中只需包含姓名和身份证
SELECT lineID '线路ID',driverID '司机编号',name '姓名' , licenseNo '身份证',vehicleID '车辆ID',plateNo '车牌编号' , model '车辆型号',type '车辆种类'
FROM driver NATURAL JOIN vehicle
WHERE model LIKE 'DD%'
语法: SELCET 字段列表 FROM 表名1 NATURAL JOIN 表名2 【WHERE 条件表达式】
自然连接要点总结:
1.如果需要查询表中相同字段使用内连接on表名1.字段名 = 表名2.字段名 会报错,但自然连接可以避免这个问题
2.自然连接会自动排除重复字段记录
3.总的来说自然连接很方便
4.多表查询
实例4.1:获取所有非空调车的车牌号、型号和司机姓名、所属线路的线路号、起点站和终点站信息
--4.1获取所有非空调车的车牌号、型号和司机姓名、所属线路的线路号、起点站和终点站信息
SELECT name '姓名',type '车辆种类', model '车辆型号',lineNo '线路号' , from_station '起点站' ,end_station '终点站'
FROM driver JOIN vehicle ON driver.driverID = vehicle.driverID JOIN line ON vehicle.lineID = line.lineID
WHERE type ='非空调车'
实例4.2: 获取公交二公司所有司机信息。要求输出司机姓名、身份证、性别和电话
-- 4.2获取公交二公司所有司机信息。要求输出司机姓名、身份证、性别和电话
SELECT name '姓名',licenseNo '身份证',gender '性别',phone '电话'
FROM driver D JOIN vehicle V ON D.driverID = v.driverID JOIN line L ON V.lineID = L.lineID
WHERE company = '公交二公司'
语法:SELECT 字段列表 FROM 表名1 JOIN 表名2 ON 表名1.字段名1 = 表名2.字段名1 JOIN 表名3 ON 表名2.字段名2 = 表名3.字段名2
多表查询要点总结:
1.了解清楚表与表之间的关联(关系)
2.一般表与表之间的相同字段比较的都为主键和外键
3.多表查询一般为三表或以上连接查询的方法和三表连接查询的方法一样,都为两两相连的方式实现.
知识总结:
1.连接查询需要弄清表与表之间的关系,特别是多表查询需要在表与表之间有着清晰的关系认识,一般相同的字段都为主键和外键的关系。
2.可以给表起别名,但是上下语句之间要统一。
3.交叉连接和自然连接相比,个人认为自然连接很好用^ . ^.