数据库零散知识点(二)

1.union all (包括重复行) 和union(不包括重复行):

连接两个结果集,将两个查询结果放在一个里面,要求两个查询的字段的数量和类型要基本一样

2.交叉连接 cross join(和其他连接不同的是 不需要用 on):

交叉联接返回第一个表中的所有行,第一个表中的每一行与第二个表中的所有行组合。交叉联接也称作笛卡尔积

3.完全连接 full join:

完整外部联接返回第一个表和第二个表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。(将两表的所有数据都展示出来,无对应的用null展现)

4.alter修改(在此主要讲的是修改表,部分约束)

    4.1  给这个表加字段
    alter table Orders
    add orderid int  identity

   4.2 给已有的表上创建主键
   alter table Employees
   add constraint PK_Employees
   primary key(EmployeeID)
  4.3 给已有的表上创建外键
  alter table Orders
  add constraint FK_EmployeeCreatesOrder
  Foreign key(EmployeeID) references Employees(EmployeeID)
 4.4 给已有的表添加default约束
  alter table Customers
  add constraint CN_CustomerDefaultCreateTime
  default getdate() for CreateTime

4.5 在对表里的字段(例如:外键)进行约束更改时加上on delete cascade
  外键关联使用 级联删除on delete cascade (如果进行删除数据,会把相关联的数据全部删掉)
  alter table Orders
  add constraint FK_EmployeeCreatesOrder
  Foreign key(EmployeeID) references Employees(EmployeeID)
  ON UPDATE CASCADE

5.isnull()函数 isnull(a,b) 如果a=null,值为b, 如果a!=null,值为a

  coalesce(a,b,c,...)函数返回其参数中的第一个非空表达式,当你要在n个字段中选取某一个非空值,可以使用

  case()函数强制转换和隐形转换类型

  into #aa  创建临时表

 cast和convert数据类型转换  eg:cast(memberid as varchar)
 convert还提供一些日期格式转换,cast没有(其实也是可以的)
 区分为了ANSI/ISO兼容,cast是ansi兼容的,而convert不兼容

 

6.派生表:由一个查询结果集的列和行构成,常会使用共用表表达式(Common Table Expression, CTE)

  6.1.WITH设定一个SQL片段,在同时执行后面的sql查询中可以多次调用这个片段 

       参考链接:http://www.itmayun.com/it/files/1/article/914021395600840/1.html

7.exists
通常exists的性能比派生表的性能更好些

8.ROW_NUMBER() :ROW_NUMBER() over ()根据什么进行排序 (eg:1 2 3 4 5 6)   在里面使用PARTITION BY告诉该函数在列改变值时重置计数,进行分组 (eg:1 2 3 4 5  1 2  1)
RANK: rank() over() 跳跃排序。如果多个行具有相同的顺序值,则允许这些行具有相同的值(eg:1 2 2 4 5 6)
DENSE_RANK: dense_rank() over()连续排序。仍然是具有相同顺序值就具有相同的值,但排名始终是递增的(eg:1 2 2 3 4)
NTILE(x):将总结果划分为x个类别,从1~x开始对这些类别排名

注:在每个排序PARTITION BY都可以使用

9.OFFSET...FETCH用于分页 :offset(表示第几行开始) fetch(表示显示的行数的数据)
使用OFFSET...FETCH子句时必须同时使用ORDER BY
可以单独使用OFFSET,但不能单独使用FETCH
不可以同时使用select top 和 offset...fetch
可以使用算术式或变量来确定偏移多少行或获取多少行,但不可以使用标量子查询                                                                          eg:  select * from MemberInfo
      order by CreateTime desc
      offset 10 rows
      fetch next 10 rows only

10. merge命令同步数据
通过merge命令,可以将多个DML操作语句组合成一个整体(数据操纵语言(Data Manipulation Language, DML)),两个表进行关联,如果有匹配的则修改,没有匹配的则添加

eg:

数据库零散知识点(二)_第1张图片

merge可以通过OUTPUT子句,可以将刚刚做过变动的数据进行输出

eg:

数据库零散知识点(二)_第2张图片

结果:数据库零散知识点(二)_第3张图片

matcher By target:这暗示了行已经存在于目标表上,因此很可能对目标表的行执行更新的操作
not matcher By target:通常对应根据源表中的数据将行插入到表中
not matcher By Source:这通常用于处理源表中缺少的行,这种情况下,通常将之删除目标表中的行
By target默认,一般不显示

参考链接:https://www.cnblogs.com/billqian/p/5157052.html

11. 创建表三范式
1NF:无重复列,保证原子性
2NF:每列必须依赖于整个键,实体的属性完全依赖于主关键字
3NF可以记忆为:使所有数据都依赖于键,整个键,只是键。不可以派生的数据

 

你可能感兴趣的:(SQL)