page(1-75)

最好是没有意义的主键字段,以方便未来的扩展.

PS:主键,以后标书编码填错须要改的时候,关联表都须要跟着改.假设是一个无意义的自增字段是主键就无此原因.

主键最好不要设置为联合主键,否则减少效率,不利于扩展

PS:原文[联合主键能够解决表中没有唯一主键的问题,只是联合主键有例如以下缺点:]

1.效率低.在进行数据的加入、删除、查找及更新的时候,数据库系统必须处理俩个字段,这样大大减少了数据的处理速度.

2.使数据库的结构设计变得槽糕.组成联合主键的字段通常都是有业务含义的字段,这与”使用逻辑主键而不是业务主键”的实践相冲突,easy造成系统开发及维护上的麻烦.

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:忽略字段的话,则会依照定义表中的字段顺序进行插入.建议不使用忽略写法.忽略后不easy查看相应的字段和值的相应easy反倒easy出错.

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 这俩种数据库上,假设要移植到其他数据库上的话 要避免使用这样的方式.

–同义运算符 能够在全部主流数据库上执行.只是因为粗心等原因 很easy将 ‘不大于’ 表示为 ‘<’ ,从而忘记’不大于’是包括 ‘小于’ 和’等于’这俩个意思.easy出错.

–因此推荐 使用 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') --不推荐此写法,easy出错 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

版权声明:本文博主原创文章。博客,未经同意不得转载。

金色的 SQL注意事项(1)的更多相关文章

  1. 部分常见ORACLE面试题以及SQL注意事项

    部分常见ORACLE面试题以及SQL注意事项 一.表的创建: 一个通过单列外键联系起父表和子表的简单例子如下: CREATE TABLE parent(id INT NOT NULL, PRIMARY ...

  2. sql注意事项积累

    1.一定要记住,SQL 对大小写不敏感! 2.sql中的单引号 '',如果单引号中是字符串,代表是常量 如,select 'b.phoneNumeber' from test; 如果是数字,如'123 ...

  3. Entity Framework --Entity SQL注意事项

    Entity SQL 是 ADO.NET 实体框架 提供的 SQL 类语言,用于支持 实体数据模型 (EDM).Entity SQL 可用于对象查询和使用 EntityClient 提供程序执行的查询 ...

  4. Django关于SQL注意事项

    执行原生SQL: from django.db import connection, connections cursor = connection.cursor() cursor.execute( ...

  5. SQL 注意事项

    -------选择表名 配置Ctrl+3 能够select * 桌 USE [NB] GO /* 物: StoredProcedure [dbo].[SP_Select] 脚本日期: 05/28/20 ...

  6. MyBatis 动态SQL注意事项

  7. 如何执行一个mysql的sql脚本文件

    sql脚本是包含一到多个sql命令的sql语句,我们可以将这些sql脚本放在一个文本文件中(我们称之为“sql脚本文件”),然后通过相关的命令执行这个sql脚本文件.基本步骤如下:一.创建包含sql命 ...

  8. 基于注解的Mybatis mapper 接口注意事项

    基于注解的Mybatis mapper 接口功能没有mapper xml配置文件丰富,并且动态sql语句的灵活性不能和xml配置相比. 这里仅仅说一下基于注解的动态sql注意事项: Mybatis提供 ...

  9. mysql学习笔记—常用sql语句

    sql注意事项: SQL 对大小写不敏感:SELECT 与 select 是相同的 某些数据库系统要求在每条 SQL 语句的末端使用分号. CREATE DATABASE CREATE DATABAS ...

随机推荐

  1. Matlab的parfor并行编程

    Matlab的parfor并行编程 通常消耗最多计算资源的程序往往是循环. 把循环并行化.或者优化循环体中的代码是最经常使用的加快程序执行速度的思路. Matlab提供了parforkeyword,能 ...

  2. (原创)(C#随笔)IEnumerable< ICollection < IList区别

    public interface IEnumerable { IEnumerator GetEnumerator(); } 再看ICollection<T> public interfac ...

  3. maven的命令使用笔记

    (1)创建web项目mvn archetype:create  -DgroupId=com.mycompany.webapp  -DartifactId=myweb  -DarchetypeArtif ...

  4. Java编码浅析(注意区分三个概念)(转)

    编码: (1)外部资源的字符集-----没有读入jvm中的数据都是外部资源 (2)jvm中数据的字符集-----都是unicode (1)和(2)之间发生交互时,如果不指定编码,则使用JVM平台默认字 ...

  5. System单元对所有与COM相关的声明就这么多,需要倒背如流

    是首先是VM表,但是和COM相关的函数地址都废弃了,这几个VM函数具体放在哪里,还得在研究: { Virtual method table entries } vmtSelfPtr = -; vmtI ...

  6. java基础---->摘要算法的介绍 (转)

    数据摘要算法是密码学算法中非常重要的一个分支,它通过对所有数据提取指纹信息以实现数据签名.数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密.数据摘要算法也被称为哈希(Hash)算法. ...

  7. hdu 1007 最近点对问题(Splay解法)

    为什么要写这个题..经典啊,当然,别以为我用分治做的,不过主要思想还是那神奇的六个点共存(一个h*2h的矩形中最多能放下多少个点使得两两距离不超过h) 其实我是在这里看到的 http://commun ...

  8. Android中的跨进程通信方法实例及特点分析(二):ContentProvider

    1.ContentProvider简单介绍 在Android中有些数据(如通讯录.音频.视频文件等)是要供非常多应用程序使用的.为了更好地对外提供数据.Android系统给我们提供了Content P ...

  9. js编码、解码

    js对文字进行编码涉及3个函数:escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decodeURIComponent 1 ...

  10. VSTO之旅系列(二):创建Excel解决方案

    原文:VSTO之旅系列(二):创建Excel解决方案 本专题概要 引言 创建VSTO项目 Excel对象模型 创建Excel外接程序 创建Excel文档级自定义项 小结 一.引言 也许很多朋友都没有听 ...