SQL 语句

发布时间:2017-5-23 17:01:02 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"SQL 语句",主要涉及到SQL 语句方面的内容,对于SQL 语句感兴趣的同学可以参考一下。

如今各个公司对程序员的数据库知识尤其是SQL语句的掌握程度有很高的要求,作为一名光荣的程序员,不会玩儿SQL语句走在街上根本不好意思和人打招呼!好了,废话不多说。 sql server常用的两种主键数据类型 int(或bigint)+标识列(又称自动增长字段),另外一种就是uniqueidentifier数据类型(又称Guid  UUID) GUID在SQL server里的使用就是直接newid就可以了 insert into T_us (id,userName,[password])values(newid,'tom',123456) Guid在c#里的调用方法就是Guid.NewGuid();   sql表是可以设置默认值的。如果id不是为int类型主键,而是guid类型主键,那么我们可以给id设一个默认值“newid()”到时候就会自动生成了。但是一般我们很少这么干。 use sales 指向sales的数据库 select 姓名 ,datediff(year,出生时间,getdate()) as '年龄' from xs  --查询年龄datediff(year,出生时间,getdate())函数就是获取你的年龄,例如:36 alter table usertable  altercolumn userpawsnchar(20)--修改表列的属性 一、SQL 基础知识 1、DDL(数据定义语言) 1)创建数据表 --创建数据表 create table Test(Id int not null, Age char(20));  --创建数据表 create table T_Person1(Id int not null, Name nvarchar(50), Age int null); --------约束 alter  table tableName --为一个表创建约束 add  constraint   Pk_tableName  --约束名(约束名一般是以Pk开头 也就是主键的缩写,Primary Key) primary key (学号)  --为学号列添加约束   alter   table tableName  --删除约束 drop  Pk_tableName   select * from  sys.key_constraints --查询所以表的约束 --创建表,添加外键 Create table T_Students( StudentNo char(4), CourseNo char(4), Score int, Primary key(StudentNo), Foreign key(CourseNo) References T_Course(CourseNo) );   2)修改表结构 --修改表结构,添加字段 Alter table T_Person add NickName nvarchar(50) null;   --修改表结构,删除字段 Alter table T_Person Drop column 列名   3)删除数据表 --删除数据表 Drop table T_Person;   --删除数据表 drop table test 4)创建索引 Create [Unique] Index <索引名> on <基本表名>(<列明序列>);   2、DML(数据操纵语言) 1)插入语句 insert into T_Person1(Id,Name,Age) values(1,'Vicky',20) --插入一条据数,字段和值必须前后对应 insert into T_Preson1(Id,Name,Age) values(2,'Tom',19) insert into T_Person1(Id,Name,Age) values(4,'Jim',19) insert into T_Person1(Id,Name,Age) values(5,'Green',20) insert into T_Person1(Id,Name,Age) values(6,'Hanmeimei',21) insert into T_Person1(Id,Name,Age) values(7,'Lilei',22) insert into T_Person1(Id,Name,Age) values(8,'Sky',23)   insert into T_Person1(Id,Name,Age) values(newid(),'Tom',19)   2)更新语句 --修改列,把所有的age字段改为30 update T_Person1 set age=30   --把所有的Age字段和Name字段设置为... update T_Person1 set Age=50,Name='Lucy'     update T_Person1 set Name='Frankie' where Age=30   update T_Person1 set Name=N'中文字符' where Age=20 --中文字符前面最好加上N,以防出现乱码   update T_Person1 set Name=N'成年人' where Age=30 or Age=50   3)删除语句 delete from T_Person1 --删除表中全部数据   delete from T_Person1 where Name='Tom' --根据条件删除数据   4)查询语句 查询语句非常强大,几乎可以查任意东西! ----------------- ---- 数据检索 ----- ----------------- --查询不与任何表关联的数据. SELECT 1+1; --简单运算 select 1+2 as 结果   SELECT newid();--查询一个GUID字符创   select GETDATE() as 日期 --查询日期   --可以查询SQLServer版本 select @@VERSION as SQLServer版本   --一次查询多个 select 1+1 结果, GETDATE() as 日期, @@VERSION as 版本, NEWID() as 编号     --简单的数据查询.HelloWorld级别 SELECT * FROM T_Employee;   --只查询需要的列. SELECT FNumber FROM T_Employee;   --给列取别名.As关键字 SELECT FNumber AS 编号, FName AS 姓名 FROM T_Employee;   --使用 WHERE 查询符合条件的记录. SELECT FName FROM T_Employee WHERE FSalary<5000;   --对表记录进行排序,默认排序规则是ASC SELECT * FROM T_Employee ORDER BY FAge ASC,FSalary DESC;   --ORDER BY 子句要放在 WHERE 子句之后. SELECT * FROM T_Employee WHERE FAge>23 ORDER BY FAge DESC,FSalary DESC;   --WHERE 中可以使用的逻辑运算符:or、and、not、<、>、=、>=、<=、!=、<>等.   --模糊匹配,首字母未知. SELECT * FROM T_Employee WHERE FName LIKE '_arry';   --模糊匹配,前后多个字符未知. SELECT * FROM T_Employee WHERE FName LIKE '%n%';   --NULL 表示"不知道",有 NULL 参与的运算结果一般都为 NULL.   --查询数据是否为 NULL,不能用 = 、!= 或 <>,要用IS关键字 SELECT * FROM T_Employee WHERE FName IS NULL; SELECT * FROM T_Employee WHERE FName IS NOT NULL;   --查询在某个范围内的数据,IN 表示包含于,IN后面是一个集合 SELECT * FROM T_Employee WHERE FAge IN (23, 25, 28);   --下面两条查询语句等价。 SELECT * FROM T_Employee WHERE FAge>=23 AND FAge<=30; SELECT * FROM T_Employee WHERE FAge BETWEEN 23 AND 30;   ----创建一张Employee表,以下几个Demo中会用的这张表中的数据 ----在SQL管理器中执行下面的SQL语句,在T_Employee表中进行练习 create table T_Employee(FNumber varchar(20), FName varchar(20), FAge int, FSalary Numeric(10,2), primary key (FNumber) )   insert into T_Employee(FNumber,FName,FAge,FSalary) values('DEV001','Tom',25,8300) insert into T_Employee(FNumber,FName,FAge,FSalary) values('DEV002','Jerry',28,2300.83) insert into T_Employee(FNumber,FName,FAge,FSalary) values('SALES001','Lucy',25,5000) insert into T_Employee(FNumber,FName,FAge,FSalary) values('SALES002','Lily',25,6200) insert into T_Employee(FNumber,FName,FAge,FSalary) values('SALES003','Vicky',25,1200) insert into T_Employee(FNumber,FName,FAge,FSalary) values('HR001','James',23,2200.88) insert into T_Employee(FNumber,FName,FAge,FSalary) values('HR002','Tom',25,5100.36) insert into T_Employee(FNumber,FName,FAge,FSalary) values('IT001','Tom',28,3900) insert into T_Employee(FNumber,FAge,FSalary) values('IT002',25,3800)   --开始对T_Employee表进行各种操作 --检索所有字段 select * from T_Employee   --只检索特定字段 select FName,FAge from T_Employee   --带过滤条件的检索 select * from T_Employee where FSalary<5000   --可更改显示列名的关键字as,as—起别名 select FName as 姓名,FAge as 年龄,FSalary as 薪水 from T_Employee     二、SQL Server 中的数据类型 1、精确数字类型 bigint int smallint tinyint bit money smallmoney 2、字符型数据类型,MS建议用VarChar(max)代替Text Char VarChar Text 3、近似数字类型 Decimal Numeric Real Float 4、Unicode字符串类型 Nchar NvarChar Ntext 5、二进制数据类型,MS建议VarBinary(Max)代替Image数据类型,max=231-1 Binary(n) 存储固定长度的二进制数据 VarBinary(n) 存储可变长度的二进制数据,范围在n~(1,8000) Image 存储图像信息 6、日期和时间类型,数据范围不同,精确地不同 DateTime SmallDateTime 7、特殊用途数据类型 Cursor Sql-variant Table TimeStamp UniqueIdentifier XML   三、SQL中的内置函数   -------------------------------------- ----- 数据汇总-聚合函数 --------- -------------------------------------- --查询T_Employee表中数据条数 select COUNT(*) from T_Employee   --查询工资最高的人 select MAX(FSalary) as Top1 from T_Employee   --查询工资最低的人 select Min(FSalary) as Bottom1 from T_Employee   --查询工资的平均水平 select Avg(FSalary) as 平均水平 from T_Employee   --所有工资的和 select SUM(FSalary) as 总工资 from T_Employee   --查询工资大于5K的员工总数 select COUNT(*) as total from T_Employee where FSalary>5000     ------------------------------ ----- 数据排序 ------- ------------------------------ --按年龄排序升序,默认是升序 select * from T_Employee order by FAge ASC   --多个条件排序,先什么,后什么,在前一个条件相同的情况下,根据后一个条件进行排列 --where在order by之前 select * from T_Employee order by FAge ASC, FSalary DESC     ------------------------------ ----- 模糊匹配 ------- ------------------------------ --通配符查询 --1.单字符通配符_ --2.多字符通配符% --以DEV开头的任意个字符串 select * from T_Employee where FNumber like 'DEV%'   --以一个字符开头,om结尾的字符串 select * from T_Employee where FName like '_om'   --检索姓名中包含m的字符 select * from T_Employee where FName like '%m%' --查询姓名以王和李开头的学生 select*fromxs where姓名like'王%'or姓名like'李%' ------------------------------ ----- 空值处理 ------- ------------------------------ --null表示不知道,不是没有值 --null和其他值计算结果是null select null+1   --查询名字是null的数据 select * from T_Employee where FName is null   --查询名字不为空null的数据 select * from T_Employee where FName is not null   --年龄是23,25,28中的员工 select * from T_Employee where FAge=23 or FAge=25 or FAge=28     --或者用in 集合查询 --年龄是23,25,28中的员工 select * from T_Employee where FAge in (23,25,28)   --年龄在20到25之间的员工信息 select * from T_Employee where FAge>20 and FAge<25   --年龄在20到25之间的员工信息,包含25 select * from T_Employee where FAge between 20 and 25   --年龄在35到36之间的学生信息 (表中没有学生的年龄,只有出生时间"1988-10-12 00:00:00",所以这个时候就必须吧学生的年龄计算出来) datediff(year,出生时间,getdate()) 就取得了学生的实际年龄 比如说36 ,有了所有学生的实际年龄。这个时候只要between 35 and 36 就可以啦。 select* fromxswhere datediff(year,出生时间,getdate())between 35 and 36   ------------------------------ ----- 数据分组 ------- ------------------------------ Select FAge,COUNT(*) from T_Employee group by FAge --1.根据年龄进行分组 --2.再取出分组后的年龄的个数   --注意:没有出现在group by 子句中的字段,不能出现在select语句后的列名列表中(聚合函数除外) --group by 必须出现在where后面 Select FAge,AVG(FSalary),COUNT(*) from T_Employee group by FAge   --错误用法 Select FAge,FName,COUNT(*) from T_Employee group by FAge   --加上where的group by 子句 --group by 必须出现在where后面 Select FAge,AVG(FSalary),COUNT(*) from T_Employee where FAge>=25 group by FAge     --Having不能包含查不到的字段,只能包含聚合函数和本次查询有关的字段 select FAge,COUNT(*) from T_Employee group by FAge Having COUNT(*)>1   select FAge,COUNT(*) from T_Employee where FSalary>2500 group by FAge   --HAVING 子句中的列 'T_Employee.FSalary' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中 --Having是对分组后信息的过滤,能用的列和select中能有的列是一样的。 --因此,having不能代替where select FAge,COUNT(*) from T_Employee group by FAge Having FSalary>2500     ------------------------------ ----- 确定结果集行数 ------- ------------------------------ --取出所有员工的信息,根据工资降序排列 select * from T_Employee order by FSalary DESC   --取出前三名员工的信息,根据工资降序排列 select top 3 * from T_Employee order by FSalary DESC   --根据工资取出排名在6-8的员工信息,按工资降排列 select top 3 * from T_Employee where FNumber not in (select top 5 FNumber from T_Employee order by FSalary DESC) order by FSalary DESC       ---修改数据表,添加字段,更新字段的值等操作。 alter table T_Employee add FSubCompany varchar(20) alter table T_Employee add FDepartment varchar(20) update T_Employee set FSubCompany='Beijing',FDepartment='Development' where FNumber='DEV001'; update T_Employee set FSubCompany='ShenZhen',FDepartment='Development' where FNumber='DEV002'; update T_Employee set FSubCompany='Beijing',FDepartment='HumanResource' where FNumber='HR001'; update T_Employee set FSubCompany='Beijing',FDepartment='HumanResource' where FNumber='HR002'; update T_Employee set FSubCompany='Beijing',FDepartment='InfoTech' where FNumber='IT001'; update T_Employee set FSubCompany='ShenZhen',FDepartment='InfoTech' where FNumber='IT002' update T_Employee set FSubCompany='Beijing',FDepartment='Sales' where FNumber='SALES001'; update T_Employee set FSubCompany='Beijing',FDepartment='Sales' where FNumber='SALES002'; update T_Employee set FSubCompany='ShenZhen',FDepartment='Sales' where FNumber='SALES003';   select * from T_Employee   ------------------------------ ------ 去掉重复数据 ------ ------------------------------ --所有员工的部门信息 select Distinct FDepartment from T_Employee;     select FDepartment,FSubCompany from T_Employee   --以上两个例子结合起来比较,Distinct针对的是整行进行比较的 select Distinct FDepartment,FSubCompany from T_Employee       ------------------------------ ----- 联合结果集Union -------- ------------------------------ --创建一个测试表T_TempEmployee,并插入数据 Create Table T_TempEmployee(FIdCardNumber varchar(20),FName varchar(20),FAge int,Primarykey(FIdCardNumber)); insert into T_TempEmployee(FIdCardNumber,FName,FAge) values('1234567890121','Sarani',33); insert into T_TempEmployee(FIdCardNumber,FName,FAge) values('1234567890122','Tom',26); insert into T_TempEmployee(FIdCardNumber,FName,FAge) values('1234567890123','Yamaha',38); insert into T_TempEmployee(FIdCardNumber,FName,FAge) values('1234567890124','Tina',36); insert into T_TempEmployee(FIdCardNumber,FName,FAge) values('1234567890125','Konkaya',29); insert into T_TempEmployee(FIdCardNumber,FName,FAge) values('1234567890126','Foortia',29);   select * from T_TempEmployee   --Union关键字,联合2个结果 --把2个查询结果结合为1个查询结果 --要求:上下2个查询语句的字段(个数,名字,类型相容)必须一致 select FName,Fage from T_TempEmployee union select FName,Fage from T_Employee     select FNumber, FName,Fage,FDepartment from T_Employee union select FIdCardNumber,FName,Fage,'临时工,无部门' from T_TempEmployee   ---Union All:不合并重复数据 --Union:合并重复数据 select FName,FAge from T_Employee union all select FName,FAge from T_TempEmployee   select FAge from T_Employee union select FAge from T_TempEmployee   --注意:Union因为要进行重复值扫描,所以效率低,因此如果不是确定要合并重复,那么就用Union all   --例子:报名 select '正式员工最高年龄',MAX(FAge) from T_Employee union all select '正式员工最低年龄',MIN(FAge) from T_Employee union all select '临时工最高年龄',MAX(FAge) from T_TempEmployee union all