更新时间2016年7月26日23:26:48
>把2次或者多次查询结果合成一张表,要求其列数要一致
可以来源于多张表,可以进行多次sql语句查询,取出的列名可以不一致,此时以第一个sql的列名为准
1)如果不同的语句中取出的行,有完全相同(每个列的值都相同),
那么相同的行将会合并(去重复)
SELECTS * FROM ta
UNION
SELECT * FROM tb;
2)如果不去掉重复项,可以通过加all来搞定
SELECTS * FROM ta
UNION ALL
SELECT * FROM tb;
3)如果语句中有oder by,limit(在子句中order by配合limit才有意义,否则语法分析器,会在分析语法的时候,把order by去掉)
则需要将每个查询子句都包起来(但平日多用在总的结果后 排序)
//取第三个栏目前三高、第四个栏目前两高的商品,用union实现
(SELECT goods_id,cat_id,goods_name,shop_price
FROM goods
WHERE cat_id = 3
ORDER BY shop_price desc
LIMIT 3)
UNION
(SELECT goods_id,cat_id,goods_name,shop_price
FROM goods
WHERE cat_id =4
ORDER BY shop_price desc
LIMIT 2);
1) 左连接【这里以tb为基准 [意指它每项得应完全对齐] :交集部分先拿出来。另外,若自己有没对齐的行,则把这些行的数据也拿出来。因为没对齐,所以这几行只有自身的数据,其他数据为NULL】
SELECT tb.level,tb.assignment,ta.name
FROM tb
LEFT JOIN ta
ON ta.level=tb.level
2) 右连接【这里以ta为基准,逻辑过程与左联接同理】
SELECT tb.level,tb.assignment,ta.name
FROM tb
RIGHT JOIN ta
ON ta.level=tb.level
3)内连接【查询左右表都有的数据,即左右链接的交集】
SELECT tb.level,tb.assignment,ta.name
FROM tb
INNER JOIN ta
ON ta.level=tb.level
//查出左右连接的并集,可以用UNION
//查出下面2016-08-08之后的所有比赛,并以形如下面的方式输出:
重庆力帆 0:0 上海申花 2016-08-09
SELECT a.matchResult,a.matchTime ,b.teamName as hName,c.teamName as gName
FROM `match` as a
LEFT JOIN `team` as b
On b.teamID=a.hostTeamID
LEFT JOIN `team` as c
On c.teamID=a.guestTeamID
WHERE a.matchTime>'2016-08-08'
更新时间2016年7月28日 10:27:44
>视图是由查询结果形成的一张虚拟表
视图的用处
>简化查询
>把表的权限封闭,但开放相应的视图权限,视图里只开放部分数据
>大数据分表可以用到.
视图的创建
create view 视图名 as select语句
视图的删除
drop view 视图名
视图的修改
Alter view as select xxx;
视图与表的关系
视图是表的查询结果,自然表的数据改变了,会影响视图的结果
视图改变了呢?
1:视图增删改也会影响表的吗
>视图的数据与表的数据 一一对应时,可以修改
2:视图总能增删改吗
>对于视图的insert还应该注意,视图必须包含表中没有默认值的列
大数据分表查询
当表超过200万行的时候,查询速度就会变慢,这时候可以通过分表查询的方法
[示例] 现在我把表通过 模4 的方法,把表分成4张视图
CREATE view g1 as select * from goods where goods_id % 4=0;
CREATE view g2 as select * from goods where goods_id % 4=1;
CREATE view g3 as select * from goods where goods_id % 4=2;
CREATE view g4 as select * from goods where goods_id % 4=3
以PHP查询为例
$tableFlag=$_GET['id']%4;
$tablename="g".$tableFlag;
$result=$pdo->("select * from $tablename");
此外,我们可以把多张表通过union合成一张新的视图
CREATE newTable as select * from t1 unionselect * from t2 ....;
视图的Algorithm
algorithm = merge / Temptable / undefined
Merge当引用视图的时候,视图语句与定义视图的语句合并只是为了形成一条select语句
Temptable 当引用视图时,根据视图的创建语句建立一个临时表多用于做子查询的结果,出现非常频繁的时候
Undefined未定义,让系统帮你选
而temptable是根据创建语句瞬间创建一张临时表,
然后查询视图的语句从该临时表查数据
create algorithm=Temptable view g2 as
select goods_id,cat_id,goods_name,shop_price from goods order by cat_idasc,shop_price desc;
查询语句为
select * from g2 group by cat_id; //最后执行的这个查询语句
然后取出结果,并放在临时表上
>数据库默认字符集
>表默认字符集
>列字符集
>如果某一个级别没有指定字符集,则继承上一级
>最上一级是服务器,它是一定有字符集定义的(因为要负责页面的输出),
1.告诉服务器,我给你发送的数据是什么编码 Character_set_client
[示例]set character_set_client=utf8;
2.告诉转换器,转换成什么编码?Character_set_connection
[示例]set character_set_connection=utf8;
3.查询的结果是什么编码?Character_set_results
[示例]set character_set_results=utf8;
若三者统一编码,则可写为set names 字符集名
[示例]set names utf8;
>值字符集的排序规则[一个字符集可以有多种排序规则,如图所示]
>常用字符集为utf8_general_ci
声明校对规则
[示例]create table(xxxxx) Charset utf8 collate utf8_general_ci;
评论列表点此评论