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 可变
sql语句入门
字符串用单引号
sql语句大小写不敏感 但数据时大小写敏感的
sql主要分成两种
DDL(数据定义语句) : Create Table ,Drop Table,Alter Table
DML(数据操作语句): Select , Insert ,Update , Delete
创建表
可以右键 新建表
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的
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
'工资合计';
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。