我是做Unity客户端的。半路出家,所以基础薄弱。特记录一些SQl语句的基础知识,比较浅薄。只是为了加深记忆,所谓眼过千遍不如手过一遍么! 也是为了以后对数据酷这块知识的更多扩充。所以,见笑了。对了,为了方便认知,单词全部为小写
One. 简单查询!
1.select语句
select [all:默认值为全部| distinct:消除重复][top n] 表达式列表 [as 可自定义别名]
from 表明或者视图名
[where 条件表达式]
[group by 列名] [having 搜索表达式]
[order by 列名[asc:升序 | desc:降序]]
内容 | _________________________________作用_________________________________ |
---|---|
select | 用于指定输出的内容 |
from | 用于指定要检索的数据的来源表或来源试图 |
where | 指定对记录的过滤条件 |
group by | 指定对检索到的记录进行分组的条件 |
having | 用于在分组的基础上指定选取某些组的条件,必须和group by 同时使用 |
order by | 用于对检索到的记录进行排序 |
2.聚集函数
聚集函数的主要功能是对表在指定列名表达式的指上进行纵向统计和计算,也成为聚合函数
*。在Select查询语句中常用的有:
表达式 | 作用 |
---|---|
count | 统计列中选取的项目个数或查询输出的行数 |
sum | 计算指定的数值型列名表达式的总和 |
avg | 计算指定的数值型列名表达式的平均值 |
max | 求出指定的数值,字符,或者日期型列名表达式的最大值 |
min | 求出指定的数值,字符,或者日期型列名表达式的最小值 |
eg:
1. 统计“信息管理”专业的学生总人数
select count(*) as '人数' from Students where professional='信息管理'
2. 计算课程为“090110A”课程成绩的最高分,最低分和平均分。
select max(degree) as '最高分' , min(degree) as '最低分' , avg(degree) as '平均分' from Elective where cno='090110A'
3.范围查询
where中可以使用Between 和and 判定某个表达式值是否在某个区域范围之间。初值和终值用 and 分开。
eg:
1. 查询生日在1988-09-01至1990-06-30之间的学生的学号,姓名,性别和出生年月
select sno, sname, sex, birthday from Students where convert(char(10), birthday, 120) Between '1988-09-01 and '1990-06-30'
注:convert() 函数是把日期转换为新数据类型的通用函数。他的第三个参数 120 表示转化之后的格式。
Style ID | Style 格式 |
---|---|
100 或者 0 | mon dd yyyy hh:miAM (或者 PM) |
102 | mm/dd/yy |
103 | dd/mm/yy |
104 | dd.mm.yy |
… | … (更多请百度) |
4.模糊查询
有时候查询的条件并不是很精确。可以使用模糊查询。 使用 like 关键词来实现模糊查询。
注:模糊表达式可以是完整的字符串,也可以是加入了一下通配符。
通配符 | 含义 |
---|---|
% | 代表0或多个字符 |
_ | 代表1个字符 |
[] | 代表指定范围或集合中的1个字符 |
[^] | 代表不在指定范围或集合中的一个字符 |
在sql server 2005 中将 一个汉字看做为一个字符,而不是两个 |
eg:
1. 查询姓“李”的学生的姓名和联系方式
select sname, telephone, email from Students where sname like '李%'
2. 查询姓“李”或者姓 “陈”的学生的姓名和联系方式
select sname, telephone, email from Students where sname like '[李、陈]%'
3. 查询除了姓“李”或者姓 “陈”的学生的姓名和联系方式
select sname, telephone, email from Students where sname like '[^李、陈]%'
5.排序查询
asc 为升序, desc为降序。 默认为升序asc。
eg:
1. 查询选修课编号为090112A的学生的学号和成绩,并降序排序
select sno, degree from Elective where cno='090112A' order br degree desc
6.分组查询
使用 group by 子句可以根据某列的值对查询结果进行分组,然后再进行统计的汇总。如果未对查询结果分组,聚集函数将作用整个查询结果。如果对插叙结果分组,聚集函数将分别作用于每个组,从而细化了聚集函数的作用对象。
eg:
1. 查询每门课程的的平均成绩
select cno as '课程编号', avg(degree) as '平均成绩' from Elective group by cno
注:使用 group by 子句后,select 子句的列名列表中只能出现分组列或聚集函数
如果分组后,还要求按一定的条件对这些组进行筛选,则要使用having 子句指定筛选条件。 having 子句是作为group by 子句的条件出现的。所以有 having 必须要有 group by,并且在 gruop by 之后
eg:
1. 查询成绩大于80分的学生号和平均成绩,计算平均成绩只计算及格的。
只将及格成绩计算在内可以使用where子句直接过滤。但平均成绩需要用聚集函数 avg计算,因此不能使用where子句过滤。 只能使用 having 子句来过滤平均分高于80分的记录
select sno as '学号', avg(degree) as '平均成绩' from Elective where degree>=60 group by sno having avg(degree) > 80
where 和 having 的 区别是作用的对象不一样,where子句作用于表或试图,从中选择满足条件的数据行。而 having 子句作用于 组,从中选择满足条件的组。
7.TOP查询
TOP查询仅在结果集中从前向后列出指定数量的数据行。
语法: TOP (Expression) [Percent] [With ties]
参数 | 意义 |
---|---|
Expression | 为表达式或数字,即从前向后返回的数据行数 |
Percent | 百分比,表示结果集中只输出查询结果的前百分之Expression条的记录 |
With ties | 指定从基础结果集中返回附加的行,这些行包含于出现在最后的 order by 列中的值相同的值。必须于 order by 一起使用,基本结果要根据 order by 子句指定的排序列和排序方式排序。例如,若基本结果集中第n(Expression 的值)行后的m行记录的排序列数据都相同,则这些记录均在结果集中输出,即输出的结果集的前 n+m 行记录 |
eg:
1. 查询年龄最小的学生的姓名,性别和生日。
select TOP(1)sname, sex, birthday from Students order by birthday desc
8.其他处理
eg:
1. 空值处理
select * from Students where telephone IS NULL
2. 保存查询结果去新建表中
select * INTO Students_Computer from Students where professional='计算机应用'
2. 更新表中一个字段的值为随机范围值
UPDATE loaction SET strength=round(rand()*500) where id > 0
3. 一个循环插入的SQL脚本
DELIMITER ;;
CREATE PROCEDURE test_insert()
BEGIN
DECLARE y TINYINT DEFAULT 1;
WHILE y<10
DO
insert into package_gift (name) values ("nihao");
SET y=y+1;
END WHILE ;
commit;
END;;
CALL test_insert();