简单介绍一下连接方式:
1.1.使用无连接规则连接两表
无限规则 也就简单的 select * from tableA , tableB 即得到一个笛卡尔积。 什么是 笛卡尔积 在 我的 另外一篇文章中
1.2 .使用有连接规则连接两表
也就是在 上边的基础上 加上 条件 select * from tableA , tableB where tableA .colom1 = tableB .colom
1.3. 使用多表连接查询数据
相对于上边的1.2来说 select * from tableA , tableB,tableC where tableA .colom1 = tableB .colom and tableA.pid = tableC.id
二 高级连接查询
2.1 . inner join 下边是 连接语法
SELECT *FROM 表名1INNER JOIN 表名2ON 连接规则1INNER JOIN 表名3ON 连接规则 2
2.2自链接查询:
SELECT a.* FROM `users` as a INNER JOIN `users` as b WHERE a.user_id = b.user_id
2.3 外连接
2.3.1 ?外连接 右外连接 这里只写 一个 右外连接 ?的同理 【左外连接就是 包含 左边表的所有内容和右边的需要相关联的内容】
SELECT *FROM STU_INFORIGHT OUTER JOIN SCOREON STU_INFO.SNO=SCORE.SNO
2.4全外连接
SELECT *FROM STU_INFOFULL OUTER JOIN SCOREON STU_INFO.SNO=SCORE.SNO
2.5 组合查询
这个不多做赘述 主要是因为怕解释不到位 以 union 链接 函数为例子‘
首先简单介绍下 union 的使用方法 详情介绍的看
SELECT 列名称 FROM 表名称 UNION SELECT 列名称 FROM 表名称 ORDER BY 列名称;SELECT 列名称 FROM 表名称 UNION ALL SELECT 列名称 FROM 表名称 ORDER BY 列名称;
SELECT *FROM STU_INFOWHERE DEPART=’外语系’UNIONSELECT *FROM STU_INFOWHERE YEAR>21 ## 这个是为了 查询出来 学科为去往 外语系 的 所有 stu—info 的表的数据 并且 从 stuinfo 表中 找到年龄大于21 岁 的 由于用的 是 union 所以说 取 交集
2.6 列子查询
简单介绍 什么是列子查询 列子查询的常见使用 操作符
列子查询中使用 IN、ANY、SOME 和 ALL 操作符
由于列子查询返回的结果集是 N 行一列,因此不能直接使用 = > < >= <= <> 这些比较标量结果的操作符。在列子查询中可以使用 IN、ANY、SOME 和 ALL 操作符:
- IN:在指定项内,同 IN(项1,项2,…)。
- ANY:与比较操作符联合使用,表示与子查询返回的任何值比较为 TRUE ,则返回 TRUE 。
- SOME:ANY 的别名,较少使用。
- ALL:与比较操作符联合使用,表示与子查询返回的所有值比较都为 TRUE ,则返回 TRUE
-
SELECT s1 FROM table1 WHERE s1 > ANY (SELECT s2 FROM table2)
上边就是一个简单的例子 用的是 any ;
注意 :NOT IN 是 <> ALL 的别名,二者相同。
2.7 行子查询行子查询是指子查询返回的结果集是一行 N 列,该子查询的结果通常是对表的某行数据进行查询而返回的结果集。
SELECT * FROM article WHERE (title,content,uid) = (SELECT title,content,uid FROM blog WHERE bid=2)
2.8 表子查询
下边仅仅是个例子 ; 不是现实环境 ;{不会有设计表的 一边算年龄 一边算出生日期 的 }
大致的目的就是 从表中查询出的数据 作为另一个 查询的对象
select a.* ,b.userPwd , b. date_format(user.birthday, '%Y-%m-%d %H:%i:%s')from ( select tea.id, tea.name ,users.userCZ as '成绩',user.userID ,tclass.className from teacher as tea ,user, tclass where tea.id = user.tid and tclass.id = user.cid and user.age>20 and user.userType = '先锋班级' and tclass.classcode < 2018) as a inner join user as bwhere a.userID = b.userIDand YEAR(Now()) - YEAR(birthday()) <50