回顾:
时间函数 (今天 昨天 本周 上周 本月上月 本季度 上季度 本年 去年)
1.年月日Date_format 提取 %d %m %y
2. 周 YEARWEEK 季度QUARTER
3.偏移 todays 计算两个日子之差
+
DATE_SUB
4.写法不唯一
内容一: 系统函数(最后函数)
需求1: 电脑多个mysql 查看mysql安装位置以及数据位置
show VARIABLES like '%datadir%'; #模糊查询 %0或者多个字符 |
需求2: 安装版本
select version(); |
需求3: 当前连接用户的信息(运维)
show Full PROCESSLIST; |
需求4: 当前数据库
select database(); |
需求5: 当前使用字符集
select collation("jw222test222_new"); |
恭喜: Mysql所有函数结束-
以上单表查询
分类:
- 表连接查询
- 子查询
概念:
1.横向连接 ----内连接 (取两张表之间交集)
2.外连接(左右连接 保障左表或者右表中数据也能完全显示
全连接 两两相交 ---所有数据都显示)
表合并(表连接):原则 字段相加 记录相乘操作
2 纵向连接---union
内容二: 多表连接查询----内连接(inner join...on )
内连接的语法:
方式1: 使用inner join
a表 inner join b表 inner join c表 on 等值过滤条件1 and or 条件2
说明: inner 单词可以省略 join
方式2: 使用,逗号
a表 , b表 ,c表 where 等值过滤条件
等值连接查询====》表进行合并查询
需求: 例子查询jw_user 表jw_course (用户的选课信息),发现查询的条件涉及到了两张表连接查询
解决:内连接查询
例子1:
select * from jw_user INNER JOIN jw_course
on jw_user.user_id=jw_course.user_id;
select * from jw_user , jw_course
WHERE jw_user.user_id=jw_course.user_id ;
#对表名字 别名
select * from jw_user as j INNER JOIN jw_course as w
on j.user_id=w.user_id;
例子2:
例子查询 用户 7天内和14天内订单数量 (内连接查询)
select DISTINCT * from
jw05_user12 as u
INNER JOIN
jw05_order12 as o
on u.userid=o.userid;
select DISTINCT * from
jw05_user12 as u
,
jw05_order12 as o
where u.userid=o.userid;
内容三:左(left join)右(right join)连接
需求:在表连接的时候 确保某张表的数据,要全部显示,而不是被过滤掉!
解决:左右连接
例子2 查询课程表中全部显示,不管学生是否选课
jw_course 右表# right JOIN确保右表数据 全部存在
select * from jw_user right JOIN jw_course
on jw_user.user_id=jw_course.user_id;
扩展---了解 左右自然连接
(不写过滤条件也能过滤 缺点 过滤表两个过滤字段 必须一致)
select * from jw_user natural left JOIN jw_course;
select * from jw_user natural right JOIN jw_course;
例子: 查询---用户 7天和14天订单数量(不管是否有订单 显示全部用户信息)
select DISTINCT * from
jw05_user12 as u
left JOIN
jw05_order12 as o
on u.userid=o.userid;
例子:保留所有的订单
select DISTINCT * from
jw05_user12 as u
Right JOIN
jw05_order12 as o
on u.userid=o.userid;
内容四 全连接----full join(Mysql 不支持full join 使用union 来进行代替)
例子: 用户表+ 订单表都保留
select DISTINCT * from
jw05_user12 as u
left JOIN
jw05_order12 as o
on u.userid=o.userid
UNION
select DISTINCT * from
jw05_user12 as u
right JOIN
jw05_order12 as o
on u.userid=o.userid;
注意:
1.Union (自带了合并后去重的效果) 和union all (不会去重)
例子 jw_user 用户和jw_course 课程表 id号和姓名
例子 jw_user 用户和jw_course 课程表 id号(所有人的id)
select user_id from jw_user
UNION
select user_id from jw_course;
select user_id from jw_user
UNION all
select user_id from jw_course;
- Union(两张表中列的数量是一致就可以合并) 和order by 在一起使用(注意点--面试点)
- 例子 第一条sql 用户表中姓名和年龄 按照年龄降序排序
合并
第二条 sql 查询课程 用户id和课程名字
-- 例子 第一条sql 用户表中姓名和年龄 按照年龄降序排序
-- 合并
-- sql 查询课程 用户id和课程名字
说明 union和order by一起 order by 会失效
解决: 配合 limit
(select name,age from jw_user order by age desc limit 4 )
union
select user_id,cname from jw_course;