常见的 数据库 ---sql语句

数据插入

向表中插入一行(该行的每一列都有数据)
insert into 表(列名,列名) values(值1,值2)
insert语句可以省略表名后的列名,但是不推荐。
Insert into 表 values(值1,值2)
插入数据时,只向某些列插入数据:如果插入的行中有些字段的值不确定,那么Insert的时候不指定那些列即可。
Insert into 表(列1)  values(值1)
自动编号列不需要手动插入。【SET IDENTITY_INSERT 表名 ON 】
注意:主键不能有重复值。
插入数据时的单引号问题。
Insert into 表(列) select 列1,列2 union
Insert into 表(列) select 列1,列2 from 表
Select 列 into 新表名 from 旧表
N前缀:N’字符串’,在服务器上执行的代码中(例如在存储过程和触发器中)显示的 Unicode 字符串常量必须以大写字母 N 为前缀。即使所引用的列已定义为 Unicode 类型,也应如此。如果不使用 N 前缀,字符串将转换为数据库的默认代码页。这可能导致不识别某些字符。在Northwind数据库下测试print ‘中文中文’

数据更新(数据修改)

 

更新一个列:update Student set sSex = ‘男’
更新多个列: update  Student set sSex ='女',sAge = 18,sBirthday='1989-8-8'
更新一部分数据: update  Student set sClassId= 4 where sClassId = 1,用where语句表示只更新Name是’tom’的行,注意SQL中等于判断用单个=,而不是==。
Where中还可以使用复杂的逻辑判断update Student set sAge=30 where sName='华佗' or sAge<25 ,or相当于C#中的||(或者)
所有学生的年龄加1update Student set sAge = sAge + 1
update Student set sClassId=6
where (sAge>20 and sAge<30) or(sAge=50)
Where中可以使用的其他逻辑运算符:(||)or、(&&)and、(!)not、<、>、>=、<=、 <>(或!=)等

数据删除

删除表中全部数据:DELETE  FROM  Student。
Delete只是删除数据,表还在,和Drop Table不同。
Delete 也可以带where子句来删除一部分数据:DELETE FROM Student WHERE sAge > 20 
==========================
truncate table student 的作用与delete from student一样,都是删除student表中的全部数据,区别在于:
1.truncate语句非常高效。由于truncate操作采用按最小方式来记录日志,所以效率非常高。对于数百万条数据使用truncate删除只要几秒钟,而使用delete则可能耗费几小时。
2.truncate语句会把表中的自动编号重置为默认值。
3.truncate语句不触发delete触发器。

 

约束-保证数据完整性

 

主键约束(PK) primary key constraint 唯一且不为空
唯一约束 (UQ)unique constraint 唯一,允许为空,但只能出现一次
默认约束 (DF)default constraint 默认值
检查约束 (CK)check constraint 范围以及格式限制
外键约束 (FK)foreign key constraint 表关系
增加外键约束时,设置级联更新、级联删除:
[ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
[ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]

数据检索

简单的数据检索 :SELECT * FROM Student
只检索需要的列 :SELECT sName FROM Student 、SELECT sName,sAge FROM Student
列别名:SELECT sName AS 姓名,sAge AS 年龄,sBirthday AS 出生日期 FROM Student
使用where检索符合条件的数据:SELECT sName FROM Student WHERE sSex=‘女’。
还可以检索不与任何表关联的数据:select 1+1;select select getdate();

 

Top 获取前几条数据,top一般都与order by连用
获得年纪最小的5个学生
获得年纪最大的10%的学生(percent)
Distinct 去除重复数据
select distinct sName from student
select distinct sName,sAge from student
DISTINCT是对查询出的整个结果集进行数据重复处理的,而不是针对某一个列。

聚合函数

SQL聚合函数:
MAX(最大值)、MIN(最小值)、AVG (平均值)、SUM (和)、COUNT(数量:记录的条数。)
聚合函数对null值不计算。
如果一行的数据都是null,count(*)包含对空值行、重复行的统计。
平均成绩select avg(english) from score
男学生出生日期的最大值和最小值:select max(sBirthday),min(sBirthday) from student where sSex='男'

 

带条件的查询

 

Select …from…where …
查询没有及格的学生的学号
查询年龄在20-30岁之间的男学生
Between…and …在之间
查询年龄在20-30岁之间的男学生
查询math成绩在80-90分之间的所有学生
建议:优先使用between … and …,而不是“列>=值1 and 列<=值2 ”,between … and …已做过优化处理,效率高。
查询班级id为1,2,3的所有学生
select sName,sAge from student where sClassId=1 or sClassId=2 or sClassId=3
select sName,sAge from student where sClassId in (1,2,3)

 

查询所有姓张的同学
Select * from student where left(sName,1)=‘张‘   看上去很美,如果改成查询名字中带亮的学生怎么做?
换一种做法 like 
Select  * from student where sName like ‘张%’    会吧所有姓张的都查询到,现在我想查询姓张并且名字是一个字的学生?
Select  * from student where sName like ‘%亮%’
_    、   %   、  []   、  ^
^只有MSSQL Server支持,其他DBMS用not like。
通配符 %多字符匹配的通配符,它匹配任意次数(零或多个)出现的任意字符
通配符_ 单字符匹配,它匹配单个出现的字符
[] 只匹配一个字符  并且这个字符必须是[]范围内的    [0-9]  [a-z]
not与like一起使用:not like ….
要通配_、%、[、^这些字符怎么办?[_]、[%]、[ [ ]、^(不需要放到中括号里,因为^只有放到中括号中才认为是通配符)

空值处理

数据库中,一个列如果没有指定值,那么值就为null,数据库中的null表示“不知道”,而不是表示没有。因此select null+1结果是null,因为“不知道”加1的结果还是“不知道”。
select * from score where english = null ;
select * from score where english != null ;都没有任何返回结果,因为数据库也“不知道”。
SQL中使用is null、is not null来进行空值判断: select * from score where english is null ; select * from score where english is not null ;
ISNULL ( check_expression , replacement_value )

数据排序

ORDER BY子句位于SELECT语句的末尾,它允许指定按照一个列或者多个列进行排序,还可以指定排序方式是升序(从小到大排列,ASC)还是降序(从大到小排列,DESC)。
按照年龄升序排序所有学生信息的列表:SELECT * FROM  Student ORDER BY sAge ASC
按照英语成绩从大到小排序,如果英语成绩相同则按照数学成绩从大到小排序 :SELECT * FROM  Score ORDER BY english DESC,math DESC
ORDER BY子句要放到WHERE子句之后 : SELECT * FROM  Score where english>=60 and math>=60 ORDER BY english DESC,math DESC
Order by 语句一般要放到所有语句的后面,就是先让其他语句进行筛选,全部筛选完成后,最后排序一下。
表中数据是集合,集合是没有顺序的。Order by 返回的数据是有顺序的,故此我们把order by 以后返回的数据集合叫“游标”。

数据分组
在使用select查询的时候,有时需要对数据进行分组汇总(即:将现有的数据按照某列来汇总统计),这时就需要用到group by语句。select 语句中可以使用group by 子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息。//分组一般都和聚合函数连用。
1.请从学生表中查询出每个班的班级Id和班级人数:(见备注1)
2 .请从学生表中查询出每个班的班级Id和班级中男同学的人数: (见备注2)
GROUP BY子句必须放到WHERE语句的之后 ,Group By与Order By都是对筛选后的数据进行处理,而Where是用来筛选数据的。
没有出现在GROUP BY子句中的列是不能放到SELECT语句后的列名列表中的 (聚合函数中除外)
错误: select sClassId,count(sName),sAge from student group by sClassId
正确: select sClassId,count(sName),avg(sAge) from student group by sClassId

Having语句

对表中的数据分组后,会得到一个分组后的结果集,如何对该结果集在进行筛选?→ having
查询班级人数超过三个人的班级。(见备注1)
注意Having中不能使用未参与分组的列,Having不能替代where。作用不一样,Having是对组进行过滤。
Having 是Group By的条件对分组后的数据进行筛选(与Where类似,都是筛选,只不过having是用来筛选分组后的组的。)
在Where中不能使用聚合函数,必须使用Having,Having要位于Group By之后。
Having的使用几乎是与where一样的,也可以用in。
Having count(*) in (5,8,10)







你可能感兴趣的:(常见的 数据库 ---sql语句)