一、笛卡尔集:
? ? ? ? ? ? ? ? ? ? ? ? ? 1、笛卡尔集会在下面条件下产生: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? – 省略连接条件 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? – 连接条件无效 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? – 所有表中的所有行互相连接 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 为了避免笛卡尔集, 可以在 WHERE 加入有 效的连接条件。
二、等值/连接连接 :
1、使用连接在多个表中查询数据 : ? 在 WHERE 子句中写入连接条件。? ? 在表中有相同列时,在列名之前加上表名前缀
2、区分重复的列名: ? ?? ? 在不同表中具有相同列名的列可以用表的别名加以区分。 ? 如果使用了表别名,则在select语句中需要使用表别名代替表名 ?? 表别名最多支持32个字符长度,但建议越少越好 ? ? ? ? ? ? ?3、表的别名: ? 使用别名可以简化查询。 ?? 使用表名前缀可以提高执行效率。 ?4、连接多个表 : ?? 连接 n个表,至少需要 n-1个连接条件。 例如:连接三个表,至少需要两个连接条件。 5、连接查询案例 :
含义:又称多表查询,当查询的字段来自于多个表时,就会用到连接查询. 笛卡尔乘积现象:表1 有m行,表2有n行,结果=m*n行.
发生原因:没有有效的连接条件. 如何避免:添加有效的连接条件.
分类: 按年代分类: sql92标准:仅仅支持内连接 sql99标准【推荐】:支持内连接+外连接(左外和右外)+交叉连接
?分类: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 按年代分类: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? sql92标准:仅仅支持内连接 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? sql99标准【推荐】:支持内连接+外连接(左外和右外)+交叉连接 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 按功能分类: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?内连接: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?等值连接 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?非等值连接 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?自连接 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?外连接: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?左外连接 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?右外连接 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?全外连接 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?交叉文件 ?
? ? 5.1、等值连接: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??① 多表等值连接的结果为多表的交集部分 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??②n表连接,至少需要n-1个连接条件 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ③ 多表的顺序没有要求 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ④一般需要为表起别名 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ⑤可以搭配前面介绍的所有子句使用,比如排序、分组、筛选
#案例1:查询女生名和对应的男生名
SELECT NAME,boyName
FROM boys,beauty
WHERE beauty.boyfriend_id= boys.id;
5.2、非等值连接:?
#案例1:查询员工的工资和工资级别
SELECT salary,grade_level
FROM t_mysql_employees e,t_mysql_job_grades g
WHERE salary BETWEEN g.`lowest_sal` AND g.`highest_sal`
AND g.`grade_level`='A';
??5.3、自连接:
#案例:查询 员工名和上级的名称
SELECT e.employee_id,e.last_name,m.employee_id,m.last_name
FROM t_mysql_employees e,t_mysql_employees m
WHERE e.`manager_id`=m.`employee_id`;
三、join连接:?
? 内连接 [inner] join on ? ? ? ? ? ? ? ? ? ? ? ? 外连接 ? ? ? ? ? ? ? ? ? ? ? ? 左外连接 left [outer] join on ? ? ? ? ? ? ? ? ? ? ? ? 右外连接 right [outer] join on
1、使用ON 子句创建连接 : ? ? ? ? ? ? ? ? ? ? ?自然连接中是以具有相同名字的列为连接条件的。 ? ? ? ? ? ? ? ? ? ? ?可以使用 ON 子句指定额外的连接条件。 ? ? ? ? ? ? ? ? ? ? ?这个连接条件是与其它条件分开的。 ? ? ? ? ? ? ? ? ? ? ?ON 子句使语句具有更高的易读性。 2、join案例 : ? ?? 2.1语法: ? ? ? ? ?select 查询列表 from 表1 别名 【连接类型】 join 表2 别名 on 连接条件 ? ? ? ? ? ? ? ? ? 【where 筛选条件】 ? ? ? ? ? ? ? ? ? 【group by 分组】 ? ? ? ? ? ? ? ? ? 【having 筛选条件】 ? ? ? ? ? ? ? ? ? 【order by 排序列表】?
?2.1.1内连接 ,左外连接,右外连接:
– 内连接 [inner] join on
– 外连接
? 左外连接 left [outer] join on
? 右外连接 right [outer] join on
常见函数
1、字符函数
作用 | 函数 | 结果 |
---|
转小写 | LOWER('SQL Course') | sql course | 转大写 | UPPER('SQL Course') | SQL COURSE | 拼接 | CONCAT('Hello', 'World') | HelloWorld | 截取 | SUBSTR('HelloWorld',1,5) | Hello | 长度 | LENGTH('HelloWorld') | 10 | 字符出现索引值 | INSTR('HelloWorld', 'W') | 6 | 字符截取后半段 | TRIM('H' FROM 'HelloWorld') | elloWorld | 字符替换 | REPLACE('abcd','b','m') | amcd |
?2、数字函数
作用 | 函数 | 结果 |
---|
四舍五入 | ROUND(45.926, 2) | 45.93 | 截断 | TRUNC(45.926, 2) | 45.92 | 求余 | MOD(1600, 300) | 100 |
?3、日期函数?:
?
作用 | 函数 | 结果 |
---|
获取当前日期 | now() | | 将日期格式的字符转换成指定格式的日期 | STR_TO_DATE('9-13-1999','%m-%d-%Y') | 1999-09-13 | 将日期转换成字符 | DATE_FORMAT(‘2018/6/6’,‘%Y年%m月%d日’) | 2018年06月06日 |
五、聚合函数(SUM/COUNT/AVG/MAX/MIN)
? ?1) SUM():求和。常与GROUP BY一起使用,也可单独使用, ? ?2) AVG():求平均值。常与GROUP BY一起使用,也可单独使用 ? ?3) MAX():求最大值。常与GROUP BY一起使用,也可单独使用 ? ?4) MIN():求最小值。常与GROUP BY一起使用,也可单独使用 ? ?5) COUNT():统计记录的条数。常与GROUP BY一起使用,也可单独使用如果有筛选的条件加关键字having ?
|