SQLSERVER 学习笔记(一) SQL基础 分组 限制结果集范围 抑制重
Catalaog?分类:又叫DataBase?TableSpace,不同类的数据应该放在不同的数据库中。 表Table?:书放在书架?碗放碗橱?不同类型的资料放在不同的格子里 列?Column?,字段?Field?:同一个意思?某一列 主键Primary?Key?:数据行的唯一标识,不会重复的列才能当主键。一个表可以不设主键,但会难以处理。 主键选用策略:业务主键:使用有业务意义的字段做主键,如身份证、银行卡号。?逻辑主键:使用没有任何业务意义的字段做主键,完全给程序看的,业务人员不会看的数据。 业务字段可能升位,身份证号码有人重复,因此推荐用逻辑主键。 标间关联,外键ForeignKey:?同过一个唯一的字段来关联两个表。 上面的写法不好,当厂家地址发生变化时,要更改大量的数据。因此用下面的两个表通过厂家编号进行关联的写法比较好。缺点是查询某个商品厂址时需要两条语句。 常用数据类型: bit?可选值?0?1 datetime?时间 int?32位?bigint?64位 varchar(50)?不含中文信息?50字节???varchar(MAX)时可以保存很长的文本 nvarchar()?可以包含中文?日文等信息? varchar(50)?和?char(50)的区别:?nvarchar?不足的部分不写,char会用空格补齐? var?=?variable?可变 numeric(a,b)函数有两个参数,前面一个为总的位数,后面一个参数是小数点后的位数,例如numeric(5,2)是总位数为5,小数点后为2位的数, 也就是说这个字段的整数位最大是3位。 SQL语句入门 字符串用单引号 SQL语句大小写不敏感?但数据时大小写敏感的 执行SQL语句?表上?右键?新建查询?输入语句?执行 SQL主要分成两种? DDL(数据定义语句)?:?Create?Table?,Drop?Table,Alter?Table DML(数据操作语句):?Select??,?Insert??,Update?,?Delete 创建表 可以右键?新建表 也可以在新建查询中 使用?SQL语句 ?create?table?Person(Id?int?NOT?NULL,Name?nvarchar(50),Age?int?NOT?NULL); 删除表?drop?table?Person; 大部分数据类型都可以设为主键,但是实际上一般只使用?int(或bigint)+标识列(又称自动增长序列),uniqueidentifier? GUID算法是一种可以产生唯一标识的高效算法,每次产生的GUID都不会重复。(数据类型?uniqueidentifier?) SQLSERVER中?newid() select?newid() .NET中 Guid?id?=?Guid.NewGuid(); int?自增字段的优点:占用空间小,无需开发人员干预,易读;缺点?效率低?数据导入导出痛苦 GUID优点:效率高,数据导入导出方便。缺点:占用空间大,不易读。 业界主流倾向于Guid 插入数据 主键?自增长int型?(ID字段不用写) insert?into?Person3(Name,Age)?Values(‘lily’,30); insert?into?Person3?Values?(‘lily’,30);?//可以省略字段名?但不要使用 主键?GUID(uniquedentifier)型?(ID字段要写) insert?into?Person4(Id,Name,Age)?Values(newid(),’Lily’,30); GUID做主键时?显示顺序和插入顺序不一致。可以给主键默认值newid()?但很少这么做 更新?update update?Person1?set?Age=30;?//所有的年龄都设置为30 update?Person1?set?Age=50,Name=’lucy’;?//所有的年龄都设置为50?所有的名字都设置为lucy update?Person1?set?Age=Age+1; 带条件的 update?Person1?set?NickName=N’青年人’?where?Age>=30;?//如果有中文字符串,前面加N update?Person1?set?NickNAME=N’二十岁’?where?Age=20;?//等于判断是=?不等!=?或者?<> 带复合条件的?or?and? update?Person1?set?NickName=N’二三十岁’?where?Age=20?or?Age=30; 删除数据 delete?from?person_3?清空整个表 elete?from?person_3?where?name='lily' 检索数据 create?table?T_Employ(FNumber?VARCHAR(20),FName?varcharFAge?INT, FSalary?NUMERIC(10primary?keyFNumber)) insert?into?FNameFAgeFSalary)?values('DEV001''tom'8300) 'DEV002''jerry'2300.80'SALE001''jonh'5000'SALE002''kerry''SALE003''stone'1200'HR001''jane''HR002''tina''IT001''smith'); 'IT002'2800) ?? select?*?T_Employ?//显示所有字段 select??//查询FName?FAge两个字段 T_Employ?<5000?//?有过滤条件的显示所有字段 <5000;?//?有过滤条件地显示两个字段 as?姓名年龄月薪??设置别名 select?@@VERSION?版本+1?列NEWID()?编号GETDATE日期?select?语句可以和表无关。?还可以设置别名 +10000??显示时能够计算,如月薪加10000 聚合函数 COUNT(*)?;显示有多少条记录 MAX最高工资?; min最低工资?avg平均工资?SUM工资和?FSalary?>=5000; 排序?默认是升序?但是最好写上 order?by?ASC;?//按年龄升序排序 DESC按工资降序排序 先按照年龄进行升序排序,如果年龄相同,按工资进行降序排序??越靠前越优先 应该放在where后面 *<25? 通配符过滤 单字符通配符?_?匹配单个出现的字符 SELECT?FName?like?'_erry';所有类似_erry的 多字符通配符?%?任意次数?0?或多个 FROM?'%n%'所有带n的 FNumber?'DEV%'; 空值处理 NULL?代表不知道?不是表示没有?几乎所有NULL参与的运算结构都是NULL null+1返回NULL SELECT?'ABC'+'123';//ABC123 ''//123 NULL+;/NULL 下面两条都不会输出语句?错误的! WHERE?=NULL;?? <>NULL; 显示FName为null?和?不为null 的?语句 IS?NULL; NOT?NULL; 多值匹配 显示年龄为或者的 =25?or?=28 FAge?IN?(25显示年龄介于到的 >20?and?<30between?20?and?30 分组?GROUP?BY ?要放在WHERE后面 GROUP?BY?;?数据条数按年龄分组 没有出现在GROUP?BY中的字段是不能放在SELECT后的聚合函数除外. : SELECT?(*)人数?按FAge分组?可以显示FAge?但不能SELECT?FName FSALARY;?? 在where中根据聚合函数进行过滤 聚合函数是不能出现在where子句中的,必须使用having ? having是对分组后信息的过滤?能用的列和select中能用的是一样的. group?having?(*)>1是对原始数据进行过滤的 >2000?;? 排序的前三个?TOP?3 TOP?3?TOP?3?检索工资从高到低排序?第人开始的三个人的信息 IN(TOP?5?ORDER?BY? 添加两个字段 update?set?FSubComPany'Beijing'FDepartment'Development'? 'ShenZhen''HumanResource'? 'InfoTech'? 'Sales'? 消除重复的行?distinct distinct?FDepartment?;? 是用来消除完全重复的行用的?不是用来消除字段的 FSubCompany? 新建一个临时员工的表 CREATE?TABLE?T_TempEmployeeFIdCardNumber?intFIdCardNumber)); INSERT?INTO?T_TempEmployee'1234567890121''Sarni' '1234567890122''Tom''1234567890123''Yalaha''1234567890124''Tina') '1234567890125''Konkaya''1234567890126''Fotifa'); union?将上下两个字段的结果联合在一起 上下两个字段的列数和数据类型要相同.? T_TempEmployee union?all T_Employ?; 如果没有特殊理由?不要丢掉all?单独用union会去掉重复的行? union? 写报表经常用的方法:增加一个说明列同时用UNION?ALL合并.(不用UNION?ALL就会出现多个表1?查询员工年龄 '正式员工最高年龄'T_Employ UNION?ALL '正式员工最低年龄'MIN'临时员工最高年龄''临时员工最低年龄'2?查询每位正式员工的信息包括工号工资并且在最后一行加上所有员工工资额合计 T_Employ? '工资合计'; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |