1.联合主键
SQL server 中给表增加联合主键的两种方法
第一种方法,新建表时增加联合主键:
create table t_students(
id int not null,
name varchar(10) not null Primary Key (id, name),
age int,
dept_id int
)
注:联合主键的列需要限制非空约束。
第二种方法,给已有表增加联合主键:
create table t_dept(
dept_id int,
dept_name varchar(20),
stamp varchar(100)
)
--先设置非空约束
Alter table t_dept alter column dept_id int not null
Alter table t_dept alter column dept_name varchar(20) not null
--增加主键
Alter table t_dept add constraint pk_t_dept primary key( dept_id, dept_name)
SQL Server联合主键的影响与利用
SQL Server 联合主键是数据库管理系统中各种表最为重要的设计元素。它包含多个字段的一组,用于标识数据库中的唯一记录,并保护数据库的完全性。
SQL 联合主键的使用有以下影响:
1.保护完全性:联合主键的最重要的功能之一是用于保护表中记录的完全性。例如,可以将表中的信息链接起来,已避免违背业务规则。
2.提高性能查询:SQL 中,联合主键可以帮助优化数据库查询。使复杂或者特定字段频繁查询的效率更加高效,从而提高查询性能。
3.增强安全性:使用联合主键可以禁止未授权的访问,以避免意外地更改或删除数据库中的信息。
2.联合索引
在数据库中,索引是提高查询性能的重要机制。SQL 提供多种类型的索引,其中联合索引是非常常用的索引类型。
联合索引,也被成为复合索引或多列索引,顾名思义,是一种包含多列的索引。与单列索引相比,联合索引可以根据多个列的值进行排序和搜索,从而提高性能。联合索引遵循最左匹配原则,即索引的第一列被视为最重要的列,其次是第二列,以此类推。
创建联合索引
在SQL Server中,可以使用CREATE INDEX 语句来创建联合索引。下面是一个创建联合索引的实例:
CREATE INDEX idx_name ON table_name (column1, column2, column3);
在上述实例中,index_name是索引的名称,table_name是表的名称,olumn1, column2, column3是需要包含在索引中的列名。可以根据实际需要定义包含的列数。
使用联合索引
联合索引在查询时可以提供更高的性能。当查询条件中涉及到联合索引的列时,数据库引擎可以直接使用索引来查找匹配的行,而无需扫描整个表。
下面是一个使用联合索引的查询示例:
SELECT * FROM table_name WHERE column1 = value1 AND column2 = value2;
联合索引的注意事项:最左匹配原则
1.列的顺序:最常用的列放在左侧,方便利用索引提供的性能优势
2.列的选择:选择经常用户查询调价你的列来创建索引
3.索引维护开销:创建联合索引会增加数据库的额外开销。每当插入、更新或删除行时,数据库引擎都需要更新相关的索引。因此,在创建联合索引时,需要权衡索引的性能提升和维护开销之间的关系。
面试可能会问到的问题:
1.现有联合索引(a,b,c)
select * from table where c=1,b=2,a=3;
上面这条SQL走不走索引
答: 走。MYSQL的优化器会自动调整条件顺序,a在最左侧,可以命中最左原则。
select * from table where c=1,b=2;
答:不走索引,最左前缀不匹配,直接跳过,没法使用联合索引。
2.现有联合索引(b,c)
select a,b,c from table where c=2,b=1;
答:索引不能覆盖SQL所有查询字段,a不在(b,c)的联合索引中,所以在查询数据,还需要回表去查询,去主键索引中去查
selset b,c from table where c=2,b=1;
答直接使用联合索引就能返回结果
3.下面这条SQL语句如何创建索引
select *from table where a=x and b>x and c=x
答:建立(a, c, b )的联合索引,a和c是等值条件,能快速的过滤数据,b是范围查询,放在最后,避免阻断后面的字段。