函数
日期函数
SQL Server
- Getdate():返回当前日期时间,无参数
Dateadd():返回加上某个数值后的日期时间,参数依次为:单位(day,month等);数值;日期列
例子:
SELECT sname,dateadd(day,1000,sbdate) FROM ustudent
- Datediff():返回第二个日期与第一个日期的差值,参数依次为:单位(day,month等);日期1;日期2
- Year():返回日期的年份,参数为日期
- Month():返回日期的月份,参数为日期
- Day():返回日期的天,参数为日期
MySQL
- Now():返回当前日期时间,无参数
Date_add():
例子:
SELECT sname,date_add(now(),interval 1000 day) FROM ustudent
- Datediff(date1,date2):两个日期相减 date1 - date2,返回天数
字符函数
- Left()/ Right() :对指定值从左/右边开始截取指定个数的字符
- Substring():对指定值从指定位置开始截取指定个数的字符,注意开始位置是1
- Len():指定列中除去尾部的空格后的字符数 SQL Server
- Length() MySQL
- Lower()/Upper():大小字母转换
- Rtrim()/Ltrim():删除指定列中尾部/首部的空格
- Str():把数值转换成字串。如果不指定转换后的长度,默认为10。
- Concat():把多个字串连成一个
数据转换函数
MySQL 的CAST()和CONVERT()函数可用来获取一个类型的值,并产生另一个类型的值
Convert
MySQL
SELECT sid,cid,convert(score1*0.33+score2*0.67,decimal(6,2)) FROM uSC
CAST
MySQL
SELECT sid,cid,CAST(score1*0.33+score2*0.67 AS decimal(6,2)) FROM uSC
运算函数
- 统计计行数
- COUNT([DISTINCT] *):计算行数
- COUNT([DISTINCT] <列名>):计算指定列上不为NULL的行数
- 在指定列上计算总和 SUM([DISTINCT] <列名>)
- 在指定列上计算平均值 AVG([DISTINCT] <列名>
- 求最大值 MAX([DISTINCT] <列名>)
求最小值 MIN([DISTINCT] <列名>)
统计01班级一周的总课时 SQL Server为Len()
SELECT SUM(length(timeseg)) FROM ujobtable WHERE gid='1'
单表查询
消除重复的行
SELECT DISTINCT room,gid FROM uJobTable
- 普通条件表达式
- 关系运算符:=, >, <, >=, <=, != 或 <>
- 逻辑运算符:
- NOT 关系表达式结果取反
- AND 连接两个关系表达式,表示并列条件
- OR 连接两个关系表达式,表示或者条件
- 范围运算表达式
- 表达式 BETWEEN … AND …
- 表达式 NOT BETWEEN … AND …
集合条件表达式
表达式 IN (<值表>),表达式 NOT IN (<值表>) 下面两个语句相同
表达式可以单个列,也可以是由列组成的表达式;<值表>可以是一组由逗号分隔的常量或者是单列的SELECT语句
查询不及格同学的学号、姓名
select sid,sname from ustudent where sid in (select sid from usc where score1<60)
如果表达式的值包含在<值表>中,则表达式中列值所在的行符合选择条件。
IN关系表达式等价于多个OR连接形成的条件表达式
查询01、02和05班学生的姓名和性别
SELECT Sname,Ssexy FROM uStudent WHERE gid= ‘01’ or gid= ‘02’ or gid= ‘05’
SELECT Sname,Ssexy FROM uStudent WHERE gid IN (‘01’,’02’,’05’)
查询计算机科学与技术系同学的学号与姓名
select sid,sname from ustudent where gid in (select gid from ugrade where did in (select did from udept where dname=’计算机科学与技术系’))
字符串匹配
模糊查找
表达式 LIKE ‘<匹配串>’ 或者 表达式 NOT LIKE ‘<匹配串>’
通配符
% :代表任意多个(可以为0)字符
例:a%b表示以a开头,以b结尾的任意长度的字符串。如acb,addgb,ab 等都满足该匹配串.
_ :代表任意单个字符
例:a_b表示以a开头,以b结尾的长度为3的任意字符串。如acb,afb等都满足该匹配串
查询所有姓刘学生的姓名、学号和性别
SELECT Sname,sid,Ssex FROM uStudent WHERE Sname LIKE ‘刘%’
查询姓”欧阳”且全名为三个汉字的学生的姓名
SELECT Sname FROM uStudent WHERE Sname LIKE ‘欧阳_’
涉及空值的查询
使用谓词 IS NULL 或 IS NOT NULL
查所有有成绩的学生学号和课程号
SELECT Sid,Cid FROM uSC WHERE score IS NOT NULL
对查询结果排序
- 使用ORDER BY子句 可以按一个或多个属性列排序
升序:ASC,降序:DESC缺省值为升序
- 使用ORDER BY子句 可以按一个或多个属性列排序
使用GROUP BY子句对查询结果分组
- 分组的目的
- 未对查询结果分组,集函数将作用于整个查询结果
- 对查询结果分组后,集函数将分别作用于每个组
- 未对查询结果分组,集函数将作用于整个查询结果
分组方法 按指定的一列或多列值分组,值相等的为一组
求每个人平均分
SELECT sid,AVG(score1) FROM uSC GROUP BY sid
求每个班级的人数 将每一个gid相同的分为一组,计算各自数量
SELECT gid,COUNT(*) FROM uStudent GROUP BY gid
求’CS‘系每个班的学生的平均年龄
分析:判断学生平均年龄和CS系关系到了2张表,因此需要uStudent和uGrade表,这两张表的联系在于uStudent.gid= uGrade.gid
SELECT gid, AVG(YEAR(now())-YEAR(sbdate)) FROM uStudent WHERE gid IN (SELECT gid FROM uGrade WHERE did='CS') GROUP BY gid
- 分组的目的
HAVING