Mysql之高级查询
一.MySQL外键设置及定义
定义:为了满足关系型数据库的第三范式,降低数据冗余,在表与表之间需要满足相应的约束关系,可以为表和表之间设置外键
设置外键语法 (表类型不能是myisam存储引擎)
foreign key(col_name) references f_table(col_name)
二.视图:
视图:VIEW
是一种虚表(存储下来的select语句),表结构为空。
创建视图:CREATE VIEW vtbl_name as select_statement;
受到母表控制,不用可以删除
也可以牵连母表(视图里面的数据发生变化,母表也会受到牵连)
视图不要随便变更里面数据,否则会破坏原有表的数据体系
三.DML语句之查询语句SELECT高级查询
SELECT语句的执行过程
过程详解: from clause ---> where clause ---> group by ---> having clause --->order by ---> select --->limit
写法顺序: select col1,col2... from clause ---> where clause ---> group by ---> having clause ---> order by ---> limit
SELECT语句默认查询后会被缓存,方便下次查询
SQL_CACHE:显示指定存储查询结果于缓存之中。
查询sql缓存是否开放 show global variables like ‘query%’;
(1):DISTINCT:数据去重
格式:select distinct col_name from tbl_name;
联合去重:
(2):SELECT支持算术操作以及调用函数
(3):where子句其他用法
比较操作符之IN:
IN (元素1,元素2.....)
(4):group子句之聚合运算
group:根据指定的条件把查询结果进行“分组” 目的 ----->以用于做聚合运算
avg(),平均数 max(), 最大值 min(),最小值 count(),做统计 sum(),和数
select avg(col_name) from tbl_name group by an_col_name;
查询年龄最大的那个班级,以及最大的年龄
having:对分组聚合后的结果做过滤
同时对分组聚合运算后的查询结果根据指定条件进行排序(order by),默认升序,降序使用desc。
另外最后也可以进行偏移限制查找 limit [m,[n
(5):SELECT语句之连表查询
为了在设计表时,为了符合范式方面的要求,很有可能要将一张表拆分成2张甚至多张的表。
将来在查询时,需要将2张表中的数据按照指定字段(或者某种模式)联合起来,然后显示其相应的结果。
多表查询的表连接方式
交叉连接:笛卡尔乘积(最耗资源,效率极其低)
连表查询:执行表连接操作是按照指定字段间的关系进行连接。
内连接:
等值连接:表的字段以等值建立连接关系,两个表中具有相同意义的字段(有关联意义的字段)以相等方式进行判断,进行连接, 左右表能相等的行直接构建成新行,不相等的排除在外。
自连接:自己跟自己字段建立等值连接(定义别名进行查询)
外连接:(也是基于等值连接,但是要考虑空的情况)
左外连接:FROM tb1 LEFT JOIN tb2 ON tb1.co1=tb2.col
右外连接:FROM tb1 RIGHT JOIN tb2 ON tb1.co1=tb2.col
子查询:在查询语句嵌套着查询语句(尤其在ORACLE里面用的非常广泛)
基于查询结果再次进行查询。
在where子句中 例子:select name,age from students where age>(select avg(age) from students);
在in中的子查询:例子:mysql> select age from students where age in (select age from teachers);
表联合查询:将多个表的查询结果进行联合在一起 select col_name from tb1_name union select col_name from tb2_name;
例如mysql> select name,age from students union select name,age from teachers;
套表查询:
将查询的结果做为表来嵌套查询
格式:select col1,col2…… from (select语句) as vtb_name where……