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 altorethm=temptable 视图名 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 校对集必须合法