Union的用法

Union   联合   union all  不去重复

作用: 把2次 或者多次的查询结果合并起来

SELECT * FROM `iwebshop`.`iwebshop_goods`  where sell_price >5000  union  SELECT * FROM `iwebshop`.`iwebshop_goods`  where sell_price <20
要求  两次查询列 一致
Select user_name,user_email,msg_content from feedback where msg_status =1 union  select user_name,email,content from  comment where status = 1;

如果 有order by  那么  2个sql语句 要 加()放到所有子句后面


连接查询

SELECT sky_shop_class.name FROM sky_goods  left join sky_shop_class on  sky_goods.cid = sky_shop_class.cid

关系型数据库 cid=cid 其实也可以不用=的 只要有关系


左连接

null 补齐 如果有多行匹配 那么 多行都出来 所以说 查询出来的行数 是大于或者等于左表的行数


A站在B的左边 ===  B站在A的右边

A Left join  b  ===== b right join a

Inner join  查询2个表的交际数据 取消掉两边不匹配的 

能否查询出左右连接的并集呢 就是显示左右不相等的 

不可以的 mysql 现在还不支持 outer join 连接 但是可以用union 两次sql 来达到目的


Left  join  on  如果同时join两次一样的表 也要去别名 因为你到底是在第一次的表里取 还是在第二次的表里取

Select hid,t1.tname as hname ,mres, gid, t2.tname as gname , matime 
From 
M left join t as t1
On m.hid  = t1.tid 
Left join t as t2 
On m.gid = t2.tid  
Where  matime between  '2006' and '2008'

上面的sql语句 查询出2个球队 06--08年的比赛结果



表管理之表结构增删改查

Create   table   表名 (
列名称  列类型  【列属性】【默认值】,
列名称  列类型
列名称 列类型
)  
表引擎
表编码
增加列
Alter  table  表名 add  列名称 列类型 列属性   ->
after 列名 (放在哪个列后面)
First     (放在第一个)
Alter table  a  add  bb char(3) not null default '';


修改列

Alter table 表名 change  被改变的列名称  新的列声明

Demo:

Alter table a change oo oo int ;

删除列

Alter  table 表名  drop   列名


视图  view 

查询每个栏目最贵的商品

Select goods_id,goods_name,shop_price from good order by cid_id asc,shop_price desc;

查询这个结果,当成一张表

如果某个查询结果出现的非常频繁,也就是拿这个查询结果来子查询非常频繁

视图定义:

视图就是把查询结果当成了一张虚拟的表

SELECT goods_id,goods_name,cat_id,shop_price FROM `ecshop`.`goods` where shop_price > 2000
Create  view 视图名 as   select 语句

Create view guei  as select goods_id,goods_name,cat_id,shop_price from goods where shop_price >2000;

这样就创建了一个视图


删除视图 

Drop   view  视图名


视图还可以进行一些权限控制


把表的权限封锁 只开放视图的权限 这样就达到了控制权限的目的


3. 大数据 分表时候 可以用到

比如说一张表 有200W数据 可以分成4张表  

然后对id进行模运算  id%4+1(1,2,3,4)

也可以用视图  来搞  把4张真实的表 做成一个视图  先把4个表 union起来  然后 as 成一个视图


视图修改 

  一般建议删了重建

Alter view  oo  as select ..........


视图和表的关系

视图是表结果的产物,自然表改变了 视图也跟着动态改变

视图改了 表也会跟着改  但是有些是数据的合集就不能改了


如果视图和表结果一一对应 那么就能改了 

对于视图 insert 必须包含所有表中没有默认值的列

因为如果是表来插入的话  会显示 null  但是如果是视图来插入的话  那表不知道该如何处理


视图的算法 algorithm

Algorithm = merge / temptable /undefined

Merge  引用视图的时候 引用语句和定义语句合并

Temptable 当引用视图的时候 根据视图的创建语句建立一个临时表

Undefined  自动 系统帮你选


Merge  意味着 视图只是一个语句规则  当查询的时候  会将查询语句和创建视图语句 合并分析  最终形成的还是一条sql语句 

所以他会和查询视图的语句 和创建视图的语句合并 有些情况 就不灵了

select goods_name,cat_id,shop_price from goods  group by cat_id  order by  cat_id asc,shop_price desc 

这样子就不灵了

因为要先order by 筛选出来 然后用group 分组  但是 group要写在order by 前面

2

Temptable 是把创建视图的语句 瞬间在引用的时候创建一张临时表(真实表) 查询视图的语句 会查询这个临时表查询



字符集

服务器字符集

数据库字符集

表字符集

列字符集

某一个没指定 就继承上一级

如果表声明是utf8  那么表里面的字符集肯定是utf8

在黑窗口 设置字符集是gbk  在表里面设置的utf8  这也不要紧的  因为你设置的字符集  然后他知道你是什么字符集了 他有个中间的转换器  转换成utf8  然后自己存储进去


客户端gbk ---->中间转换器 成utf8---------->服务器接收utf8 ok!

告诉服务器我给你发了什么编码set charsacter_set_client = gbk;

告诉转换器什么编码 set character_set_clien_connection=gbk;

告诉服务器你给我什么编码 set character_set_results = gbk;

Set names gbk  是上面3句话的简写

转换器的编码 和服务器的编码 要大于客户点的编码 要不然 就会出现编码丢失


校队集就是规则 一个字符集有多种校对集

一般 默认是用 urtf8_general_ci 通用的 不区分大小写

声明 create table (...) charset utf8 collate  utf8_general_ci  校对集必须合法