学习数据库笔记八

数据库------------------------
exists型子查询,其它的硬性查询是可以替代它的,并且它稍微不好理解






新手1+N模式查询




这两个没多大用,而且繁琐
—————————————————————




连接查询练习


1.取出所有商品的商品名,栏目名,价格
select goods_name,cat_name,shop_price from   #容易犯错的地方是,如果你这里要列出


cat_id,一定要写明是哪张表的cat_id,不然sql会报错,认为你的条件模糊
goods left join category          #这是决定两张表以什么方式连接
on 
goods.cat_id = category.cat_id;   #这是两张表连接的桥梁,是两张表共有的字段(名字也


许不一样,但描述的内容要一致)!




2.查询第4个栏目下的商品的商品名,栏目名,价格
select goods_name,goods.cat_name,shop_price 
from 
goods left join category
on
goods.cat_id = category.cat_id
where
goods.cat_id = 4;






union查询
union查询就是把2条或多条sql的查询结果,合并成一个结果集


sql1返回N行
sql2返回M行


sql1 union sql2 返回N+M行


场景:2条语句,各自的where条件非常复杂,可以简化成简单条件,再Union




求得的是一个并集,如下
select goods_id,cat_id,goods_name from goods where cat_id = 4 
union
select goods_id,cat_id,goods_name from goods where cat_id = 2;


这样得出了4号栏目和2号栏目的结果集


以上是一张表,如果两张表呢?接着如下
假如user是已经注册的用户表,temp是还未激活的用户表,想要用union查看一共多少用户
SELECT id,name from tmp
UNION
select uid,name from `user`












union的语句必须满足1个条件,各语句取出的列数相同,不然怎么合并显示,三轮车和汽车怎


么拼接,少一个轮。。列名称不一定要一致,但个数一定要一致。


使用union时,完全相等的行将会被合并。
两个表都有id=c  name=张三,那union后,这两条数据只会显示一条。
合并是比较耗时的操作,因为它会进行比较,一般不让union进行合并,使用"union all"可避


免合并,
也就是说我们平时用union时,要用union all。




union的子句中不用写order by
sql合并后得到的总结果,可以order by ,子句order by失去意义,
现在排序了,合并后还需要排序,所以失去意义

select id,name from user order by id   #这就是在子句中排序,完全没意义,也不会起作



union all
select uid,uname from temp    




如果真想排序,可以这样写
select * from a
union all
select * from b
order by num desc


【union就是把两个sql语句用union (union all) 连接,想排序要在两个结果合并后再排序
想要不把重复的合并掉,就用union all】


union面试题
两张表,把ID相同的num加起来
表如下
A表:
+------+------+
| id   | num  |
+------+------+
| a    |    5 |
| b    |   10 |
| c    |   15 |
| d    |   10 |
+------+------+


B表:
+------+------+
| id   | num  |
+------+------+
| b    |    5 |
| c    |   15 |
| d    |   20 |
| e    |   99 |
+------+------+




要求查询出以下效果:
+------+----------+
| id   |    num   |
+------+----------+
| a    |        5 |
| b    |       15 |
| c    |       30 |
| d    |       30 |
| e    |       99 |
+------+----------+



SELECT id,sum(num)
FROM


(SELECT * FROM a
union ALL
SELECT * FROM b)as temp


GROUP BY id;








索引概念
索引是一种高效组织的数据结构,能够加速你的查询


索引是数据的目录,能快速定位行数据在哪。增加了一行数据,同时也需要改索引


索引提高了查询速度,降低了增删改的速度,并非加的越多越好(有的情况会是一张表的索引


文件比那张表的大小还大,成了目录比书还厚)


一般在查询频繁的列上才加索引,而且要加在重复度低的字段加效果好
你给性别加索引意义不大,给身份证号加索引,身份证号不重复,这样就能迅速定义一个人
是给你想要迅速定位的字段加索引!!!性别加索引,一定位也只能定位50%




它的原理是各种查找方法,如二叉数


二叉树
每个节点最多有两个子树的结构,一个称作左子树,一个称作右子树


先从父节点比较,比父节点大的,去右子树找,比父节点小的到左子树找,到了下一层接着这


样比较下去,最终找到你要的数








索引类型


key普通索引,只提高查询速度
unique key唯一索引,不但提高速度,还约束数据,此数据是唯一的
primary key 主键索引
fulltext 全文索引




建表时建立索引
create table ttt(
name char(10),
email char(20),
key name(name),
unique key email(email)
);


desc可查看你的表的索引
KEY列MUL代表普通索引,UNI代表唯一索引




这个时候email被定义为唯一索引,此列下的内容也就被约束了,不可以重复
原来约束在数据库中就可以实现





insert into ttt values ('lisi','[email protected]');这条可以正常插入到ttt表中


你再写一条同样的
insert into ttt values ('lisi','[email protected]');这时再插入就会报错,因为唯一索引 
约束了email字段,不能重复。




在项目中一些字段不可重复,如用户名,email,你就可以给它们加止unique key
既能提高查询速度,也能避免重复






现在来说说主键primary key ,就是我们平时的主键,一张表只能有一个主键索引
原来我们的主键是索引。。。
写法:
create table ttt(
id int,
name char(10),
email char(20),
primary key(id),   #这不用另外声明名字,因为一张表就一个主键
key name(name),
unique key email(email)
);






fulltext全文索引(中文环境下全文索引无效,要分词+索引,一般用第三方解决方案,如


sphinx)
全文索引在中文环境下是无效的,因为是靠英文来检索的
 






查看一张表的索引:show index from 表名 或create table表名也能看到
删除索引:alter table 表名 drop index 索引名;或 drop index from 表名








SQL里面有基本查询、分组+统计函数查询、排序+limit、子查询(where\from\exists)、连接


查询(左连、右连)




启动数据库服务:右击我的电脑--管理--服务--找到MySQL,启动它


解决DOS命令窗口乱码:先看DOS用的什么编码,然后告诉服务器你的DOS数据库客户端用的什么


编码,set names gbk;




清除表的全部内容truncate+表名


给表改名字rename table 旧表名 to 新表名







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章