Sql关键点总结 ->不得不说的sql 关键点
本文尚在更新中,这里暂时记录博主的心得和问题
---- 是分割线------
一、关于主键、外键和索引
- 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键
-
设计原则:
主键和外键是把多个表组织为一个有效的关系数据库的粘合剂。主键和外键的设计对物理数据库的性能和可用性都有着决定性的影响。1. 主键应当是对用户没有意义的。 2. 主键应该是单列的,以便提高连接和筛选操作的效率。 3. 永远也不要更新主键。
**但是,**这项原则对于那些经常需要在数据转换或多数据库合并时进行数据整理的数据并不适用。
4. 主键不应包含动态变化的数据,如时间戳、创建时间列、修改时间列等。 5. 主键应当有计算机自动生成。
二、关于Inner join 、outer join、 left join 和 right join
- left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
- right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
- inner join(等值连接) 只返回两个表中联结字段相等的行
- outer join(外连接) 可分为左外连接left outer join和右外连接right outer join
三、关于where 和 having
Where 是一个约束声明,使用Where来约束来之数据库的数据,Where是在结果返回之前起作用的,且Where中不能使用聚合函数。
Having是一个过滤声明,是在查询返回结果集以后对查询结果进行的过滤操作,在Having中可以使用聚合函数。
在说区别之前,得先介绍GROUP BY这个子句,而在说GROUP子句前,又得先说说“聚合函数”——SQL语言中一种特殊的函数。例如SUM, COUNT, MAX, AVG等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上
SELECT SUM(population) FROM A_Place;
//这里的SUM作用在所有返回记录的population字段上,结果就是该查询只返回一个结果,即一个地区的总人口数。
而通过使用GROUP BY 子句,可以让SUM 和 COUNT 这些函数对属于一组的数据起作用。当你指定 GROUP BY region 时,只有属于同一个(地区)的一组数据才将返回一行值,也就是说,表中所有除region(地区)外的字段,只能通过 SUM, COUNT等聚合函数运算后返回一个值。
-
WHERE子句在聚合前先筛选记录,作用在GROUP BY 子句和HAVING子句前;
-
HAVING子句可以让我们筛选成组后的各组数据,而 HAVING子句在聚合后对组记录进行筛选。
-
having就一定要和group by连用
-
只要条件里面的字段, 不是表里面原先有的字段就需要用having。
SQL在查询表的时候先把查询的字段放到了内存里,而where查询的时候是从表里面查的,其余需要用having。
四、存储过程sp
存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来调用存储过程。
五、SQL 语句的执行顺序
- 最先执行from tab;
- where语句是对条件加以限定;
- 分组语句【group by…… having】;
- 聚合函数;
- select语句;
- order by排序语句。
可以通过下面的 单元六 -> case 来看到不同
六、sql的if 和case?有何不同
- sql的if
case $
when $ then $
else $
end
- sql的case
if( $, $1, $2 )
//$判断, 是就返回$1,否则$2
select stock_name, sum(
case operation
when 'sell' then price
else -price
end
) capital_gain_loss
from Stocks
group by stock_name ;
select stock_name, sum(
if(operation = 'sell', price, -price)
) capital_gain_loss
from Stocks
group by stock_name ;
七、sql的正则表达式(通配符)
等价的
select employee_id, if (mod(employee_id,2)=1 and name not rlike '^M', salary, 0 ) as bonus
from Employees e
order by employee_id;
select
employee_id,
case when mod(employee_id,2)=1 and name not rlike '^M' then
200 else 0 end as bonus
from Employees
ORDER by employee_id;