首先基于三个表:
自连接:指在同一张表中连接查询。
子查询:指嵌入在其他sql语句中的select语句,也叫嵌套查询
单行子查询:指子查询只返回单列,单行数据
多行子查询:指返回单列多行数据,都是针对单列而言的,
1.返回多行记录的子查询,使用关键字in.
2.在多行子查询中使用any
多列子查询:指查询返回多个列数据的子查询语句。
在from子句中使用子查询
子查询语句出现在from子句中。这里要用到数据查询的技巧,把一个子查询当做一个临时表使用。
自我复制(蠕虫复制)
合并查询
在实际应用中,为了合并多个select的执行结果,可以使用集合操作符 union,union all
1.union
该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。
2.union all
该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行。
外键
外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当
定义外键后,要求外键列数据必须在主表的主键列存在或为null。
表的内连和外连
内连接:内连接实际上就是利用where子句对两种表形成的笛卡尔积进行筛选。
select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件;
笛卡尔积:不加过滤条件,得到的结果称为笛卡尔积。
外连接
外连接的分类:
分为左外连接和右外连接
左外连接:如果联合查询,左侧的表完全显示我们就说是左外连接。
select 字段名 from 表名1 left join 表名2 on 连接条件
右外连接:如果联合查询,右侧的表完全显示我们就说是右外连接。
select 字段 from 表名1 right join 表名2 on 连接条件。
索引
索引,提高数据库性能,不用加内存,不用改程序,不用调sql,只要执行正确的'create index',查询速度就可能提高成百上千倍。但是查询速度的提高是以插入,更新,删除的速度为代价的,这些操作,增加了大量的IO。所以他的价值,在于提高一个海量数据的检索速度。
索引的分类:主键索引,唯一索引,普通索引,全文索引 (解决中子文索引问题)
索引的说明:
1.占用磁盘空间
2.当添加一条记录,除了添加到表中,还要维护二叉树,速度有影响,但不大。
3.当我们添加一个索引,不能够解决所有查询问题,需要分别给字段建立索引
4.索引是以空间换时间
。唯一索引
特点:
1.一个表中,可以有多个唯一索引
2.查询效率高
3.如果在某一列建立唯一索引,必须保证这列不能有重复数据
4.如果一个唯一索引上指定not null,等价于主键索引
。普通索引
特点:
1.一个表中可以有多个普通索引,普通索引在实际开发中用的比较多
2.如果牟烈需要创建索引,但是该列有重复的值,那么我们就应该使用普通索引
。全文索引
当对文章字段或有大量文字的子墩进行紧缩时,会使用到全文检索。MySQL提供全文检索机制,但是有要去,要求表的存储引擎必须是MySAM,而且默认的全文索引支持英文,不支持中文。
如果对中文进行全文检索,可以使用sphinx的中文版(coreseek)。
创建索引的原则:
1.比较频繁作为查询条件的字段应该创建索引
2.唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件。
3.更新非常频繁的字段不适合创建索引。
4.不会出现在where子句中的字段不该创建索引。