金典 SQL笔记(1)

page(1-75)

主键最好是无意义的字段便于以后扩展.
PS:假设以标书编码为主键,以后标书编码填错需要改的时候,关联表都需要跟着改.如果是一个无意义的自增字段是主键就无此原因.

主键最好不要设置为联合主键,否则降低效率,不利于扩展
PS:原文[联合主键可以解决表中没有唯一主键的问题,不过联合主键有如下缺点:]
1.效率低.在进行数据的添加、删除、查找及更新的时候,数据库系统必须处理俩个字段,这样大大降低了数据的处理速度.
2.使数据库的结构设计变得槽糕.组成联合主键的字段通常都是有业务含义的字段,这与”使用逻辑主键而不是业务主键”的实践相冲突,容易造成系统开发及维护上的麻烦.
3.使创建指向此表的外键关联关系变得非常麻烦,甚至无法创建指向此表的外键关联关系.
4.加大开发难度.很多开发工具及框架只对单个主键有良好的支持,对于联合主键经常需要进行非常复杂的特殊处理.
考虑到这些缺点,我们应该只在兼容遗留系统等特殊场合才使用联合主键,而在其它场合则应该使用唯一主键.

字符类型知识点:
1.大部分数据库中固定长度字符类型名称为char(使用固定长度字符类型保存数据时,由于剩余部分会以空格填充,那么在读取的字段值时就会将后面填充的空格也读出来.
2.可变长度字符类型一般为varchar
PS:固定长度字符类型和可变长度字符类型都只能存储基于ACSII的字符,这样对于使用中文、韩文、日文等UniCode字符集的程序来说将会造成存储问题.为了解决这个问题,我们可以使用国际化可变长度字符类型,这种类型可以用俩个字节来保存一个字符.这样就可以解决中文、韩文等字符串保存问题了.在大部分数据库中可变长度字符类型名称为nvarchar.
但是如果字段中没有存放双字节字符的话,尽量不要使用国际化可变长度字符.
3.固定长度字符类型和可变长度字符类型一般都不能指定过于大的长度,比如长度超过1024是不允许的.超过这个长度的建议使用大字符类型字段

SQL执行顺序
WHERE语句在GROUP BY语句之前;SQL会在分组之前计算WHERE语句。
HAVING语句在GROUP BY语句之后;SQL会在分组之后计算HAVING语句

对于分组来说,SELECT和GROUP BY列必须匹配。而SELECT语句包含聚合函数时这一规则是一个例外。

插入语句
insert into 表名(字段,字段2,字段3) values(‘值’,’值1’,’值2’)
PS:忽略字段的话,则会按照定义表中的字段顺序进行插入.建议不使用忽略写法.忽略后不容易查看对应的字段和值的对应容易反倒容易出错.

select * from People –所有
select name,age from People –部分列
select max(age) from People –最大值
select min(age) from People –最小值
select avg(age) from People –平均值
select sum(age) from People –求和
select count(age) from People –统计记录数量

select * from T_Employee order by FAge asc –排序 asc升序 默认升序可省略
select * from T_Employee order by FAge desc –降序
select * from T_Employee order by FAge desc,FSalary desc –多组排序

二元操作符 or and 左表达式为待匹配的字段,而右表达式为待匹配的通配符表达式.
select * from T_Employee where FName like ‘erry’ –单字符匹配的通配符”
select * from T_Employee where FName like ‘%n_’ –多字符匹配的通配符为”%”

————–S
select * from T_Employee where FName like ‘[SJ]%’ –集合匹配 匹配第一个字符为S或者J长度不限的字符串
select * from T_Tmployee where FName like ‘^[SJ]%’ –上面的表达式取反 即不包含 S或者J开头的长度不限的字符串 等同于下面表达式
select * from T_Tmployee where NOT(FName like ‘S%’) and NOT(FName like ‘J%’) 通配符过滤是非常强大的功能,不过在使用通配符过滤的时候,数据库系统会对全表进行扫描,所以执行
速度非常慢.因此不要过多的使用通配符过滤.在使用其他方式可以实现效果的时候就应该避免使用通配符过滤

————–E

select * from T_Tmployee where FName IS NULL –空值判断 不要使用时 FName = NULL 去判定这种写法是错误的!
select * from T_Tmployee where FName IS NOT NULL –判断不为空的值

–反义运算符 ‘=’ ‘>’ ‘<’ 等于 大于 小于 可以通过 ‘!’ 来取反 ‘!=’ ‘!>’ ‘!<’ 不等于 不大于 不小于
select * from T_Tmployee where FAge != 22 and FSALARY != 2000 – 检索年龄不等于22谁 工资不等于2000员的员工
– 不等于运算分 ‘<>’
! 运算符 只能运行在MS SQLSERVER 和 DB2 这俩种数据库上,如果要移植到其它数据库上的话 要避免使用这种方式.
同义运算符 能够在所有主流数据库上运行.不过由于粗心等原因 很容易将 ‘不大于’ 表示为 ‘<’ ,从而忘记’不大于’是包含 ‘小于’ 和’等于’这俩个意思.容易出错.
因此推荐 使用 NOT 运算符.来表示 ‘非’的意思 除了’<>’这种方式之外

–多值检测 公司要为23,25,28岁员工发福利 检索 姓名 年龄 工号
–一般性我们的思路是 用or Fage = 23 or Fage = 25 or Fage = 28 数量一旦变多 反倒不好维护
– SQL 提供了 in 方式. Fage in (23,25,28) in语句只能进行多个离散值的检测.
–范围值检测 查询某一区间的值 诸如23-27岁. 用In 则穷举 或者 Fage >=23 and Fage <=27
在sql中 推荐使用 where between 23 and 27 等同于 Fage >=23 and Fage <= 27 而且性能更高.

慎用 where 1=1 ,使用where 1=1后 数据库无法使用索引等查询优化策略,数据库将被迫对每条数据进行扫描(也就是全表扫描)以比较此行是否满足过滤条件.数据库较大时会比较慢

建表及案例数据

USE [NB]
GO
/****** 对象:  User [sasa]    脚本日期: 06/25/2015 10:40:21 ******/
CREATE USER [sasa] FOR LOGIN [sasa] WITH DEFAULT_SCHEMA=[dbo]
GO
/****** 对象:  StoredProcedure [dbo].[SP_Select]    脚本日期: 06/25/2015 10:40:21 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
Create Proc [dbo].[SP_Select]       
@OName varchar(100)      
As  
Declare @Str Varchar(1000),  
  @dbname varchar(40)      
set @dbname=db_name()      
Set @Str='Select * from '+@dbname+'.dbo.'+@OName      
Exec (@Str)
GO
/****** 对象:  StoredProcedure [dbo].[sp_syscolumns]    脚本日期: 06/25/2015 10:40:21 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROC [dbo].[sp_syscolumns]   --Exec sp_syscolumns 'eemployee'
@Object NVARCHAR(1000)
As  
/*    
Function:取得一个对象中的所有列的项目(主要针对表)   
Remark:  Create By Deam L 2013/4/7
*/
Begin
    Set nocount on

    Declare @Name NVARCHAR(1000)
    Select  @Name=Isnull(@Name+',','')+name From syscolumns Where id=object_id(@Object)
    Print   @Name

    Set nocount off
END
GO
/****** 对象:  StoredProcedure [dbo].[前言]    脚本日期: 06/25/2015 10:40:21 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      <CXP,,>
-- Create date: <2014-10-8 09:11:56,,>
-- Description: <获取OA系统当前申请的采购流程,,>
-- =============================================
CREATE PROCEDURE [dbo].[前言]
AS
GO
/****** 对象:  StoredProcedure [dbo].[c_CreateSqlBaseTable]    脚本日期: 06/25/2015 10:40:21 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[c_CreateSqlBaseTable]
AS
BEGIN
    --T_Person为记录人员的数据表 其中主键字段FName为人员姓名,FAge为年龄,FRemark为备注信息,
    --T_Debt为债务信息.其中主键为FNumber为债务编号,FAmount为欠债金额,FPerson为欠债人姓名,
    --FPerson与T_person中FName字段建立了外键关联关系
    CREATE TABLE T_Person(FName VARCHAR(20),FAge INT,FRemark VARCHAR(20),primary KEY(FName))
    CREATE TABLE T_Debt(FNumber VARCHAR(20),FAmount NUMERIC(10,2) NOT NULL
    ,FPerson VARCHAR(20),PRIMARY KEY(FNumber),FOREIGN KEY(FPerson) REFERENCES T_Person(FName))

    --插入范例数据
    INSERT INTO T_Person(FName,FAge,FRemark) VALUES('Tom',18,'USA')
    INSERT INTO T_Person(FName,FAge,FRemark) VALUES('Jim',20,'USA')
    INSERT INTO T_Person(FName,FAge,FRemark) VALUES('Lili',22,'China')
    INSERT INTO T_Person(FName,FAge,FRemark) VALUES('XiaoWang',17,'China')
    INSERT INTO T_Person(FName,FAge,FRemark) VALUES('Kimisushi',18,'Korea')
    INSERT INTO T_Person(FAge,FName) VALUES(22,'LXF')
    INSERT INTO T_Person VALUES('lurenl',23,'China') --不推荐此写法,容易出错

    INSERT INTO T_Debt(FNumber,FAmount,FPerson) VALUES('1',300,'Jim')
    INSERT INTO T_Debt(FNumber,FAmount,FPerson) VALUES('2',300,'Jim')
    INSERT INTO T_Debt(FNumber,FAmount,FPerson) VALUES('3',100,'Tom')
END
GO
/****** 对象:  Table [dbo].[T_Person]    脚本日期: 06/25/2015 10:40:21 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[T_Person](
    [FName] [varchar](20) NOT NULL,
    [FAge] [int] NULL,
    [FRemark] [varchar](20) NULL,
PRIMARY KEY CLUSTERED 
(
    [FName] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** 对象:  Table [dbo].[T_Debt]    脚本日期: 06/25/2015 10:40:21 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[T_Debt](
    [FNumber] [varchar](20) NOT NULL,
    [FAmount] [numeric](10, 2) NOT NULL,
    [FPerson] [varchar](20) NULL,
PRIMARY KEY CLUSTERED 
(
    [FNumber] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** 对象:  ForeignKey [FK__T_Debt__FPerson__07020F21]    脚本日期: 06/25/2015 10:40:21 ******/
ALTER TABLE [dbo].[T_Debt]  WITH CHECK ADD FOREIGN KEY([FPerson])
REFERENCES [dbo].[T_Person] ([FName])
GO
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL Server是微软推出的一种关系型数据库管理系统(RDBMS),被广泛应用于企业级应用中。 SQL Server具有很多金典特点。首先,SQL Server具有稳定可靠的性能。它使用了先进的查询优化器和执行引擎,能够高效地处理复杂的查询和大数据量。同时,SQL Server还提供了高可用性和故障恢复功能,例如备份和恢复、故障转移和数据库镜像等,保证了数据库的可靠性和可用性。 其次,SQL Server具有完善的安全性。它支持多层次的安全措施,包括身份验证、授权和审计等功能。用户可以根据需要为数据库设置不同的权限,以保护数据的机密性和完整性。此外,SQL Server还提供了数据加密功能,确保敏感数据在存储和传输过程中的安全性。 第三,SQL Server具有丰富的功能和工具。它支持多种数据类型和数据操作,包括表操作、索引和触发器等。SQL Server还提供了强大的查询语言和存储过程,方便用户进行数据提取和分析。此外,SQL Server还与其他微软产品和服务无缝集成,例如.NET框架、Azure云服务等,为用户提供更多的开发和部署选择。 最后,SQL Server具有良好的扩展性和可管理性。它支持分布式和集群部署,能够处理大规模的数据和高并发请求。同时,SQL Server提供了丰富的管理工具和性能监控功能,帮助用户更好地管理和优化数据库系统。 综上所述,SQL Server作为金典的关系型数据库管理系统,具有稳定可靠的性能、完善的安全性、丰富的功能和工具,以及良好的扩展性和可管理性。它在企业级应用中得到广泛应用,是一款值得信赖的数据库解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值