数据查询
单表查询
无条件查询
查询一个或多个属性,AS关键字
-
查询一个或多个属性,u_name,u_age,u_score:
-
使用AS给查询结果取别名(AS也可以省略):
SELECT u_name as 名字, u_age as "年龄" , u_score as成绩 FROM T_USER ;
-
查询全部值
SELECT * FROM T_USER ;
算数运算符
-
SELECT中可以对数字和日期进行加减乘除运算
select u_name , u_score , u_score+10 , u_score-10 , u_score*2 , u_score/2 from T_USER ;
连接符 “||”
-
SQL中的连接符”||” 可将结果连接起来为一列
-
将u_name 和“的成绩为” u_score 连接起来
select u_name || '的成绩为' || u_score as 成绩 from T_USER ;
去除重复值
-
SQL中使用DISTINCT关键字 (系统默认不去除:ALL)
select distinct Sno from SC;
日期函数
-
取当前时间
select getdate()
-
返回date_expression中的日期值
day(date_expression)
-
返回date_expression中的月份值
year(date_expression)
-
返回date_expression中的年份值
month(date_expression)
-
取时间字段的季度值
datepart(qq,date_expression)
-
返回两个指定日期在date part 方面的不同之处,即date2 超过date1的差距值,其结果值是一个带有正负号的整数值。
-
与当前日期的年份差
DATEDIFF(yy,createtime,getdate()) DATEDIFF(yy,date1,date2)
日期部分 缩写 年份 yy、yyyy 季度 qq、q 月份 mm、m 每年的某一日 dy、y 日期 dd、d 星期 wk、ww 工作日* dw 小时 hh 分钟 mi、n 秒 ss、s 毫秒 ms
条件查询 WHERE
比较运算 ‘<’ ‘<=’ ‘>’ ‘>=’ ‘!=’
-
SQL中可以使用 条件运算符 ‘<’ ‘<=’ ‘>’ ‘>=’ ‘!=’ 过滤查询结果中的某些行,多个条件之间可以用 ‘and’ 连接。
-
查询T_USER表中成绩大于等于60分的学生
select u_name , u_score from T_USER where u_score >= 60 ;
与条件 (AND,BETWEEN)
-
查询A-B区间
-
查询T_USER表中成绩大于等于60分且小于等于80分的学生
-
AND写法
select u_name , u_score from T_USER where u_score >60 and u_score <80
-
BETWEEN写法
select u_name , u_score from T_USER where u_score between 60 and 80 ;
或条件(OR,IN)
-
SQL中用于或运算的关键字OR和IN
-
查询分数大于90分或者小于60分的记录-OR
select u_name , u_score from T_USER where u_score >90 or u_score <60 ;
-
查询成绩为100,98,65的学生-IN
select u_name , u_score from T_USER where u_score in(100,98,65) ;
非条件(!=,NOT)
-
查询名字不叫 ‘叶清逸’ 的记录
-
!=写法
select * from T_USER where u_name != '叶清逸' ;
-
NOT写法
select * from T_USER where u_name not like '叶清逸' ;
空或非空( IS NULL, IS NOT NULL)
-
空值
select * from T_USER where u_name is null ;
-
非空值
select * from T_USER where u_name is not null ;
模糊查询 LIKE
-
SQL中可以使用模糊查询like,其中 ‘_’ 占一位 ‘%’占多位。
-
查询名字中有 ‘清’ 字的记录
-
可以有三种表示方式,结果等价
-
包含’清’: %清%
-
第二位为’清’:_清%
-
倒数第二位为’清’:%清_
-
select * from T_USER where u_name like '%清%' ;
查询排序 ORDER BY
-
SQL中可以对查询结果进行排序
-
DESC 表示按从大到小排序
-
ASC 表示按从小到大排序,默认为从小到大排序。
-
将T_USER表按成绩从大到小排序
select * from T_USER order by u_score desc ;
ORDER BY 语句也可以用逗号隔开,表示如果上一个条件相同,接下来的排序方式。
select * from T_USER order by a_score desc ,order by b_score asc;
聚集函数(总数 最大 最小 平均)
-
统计个数:count
-
平均值:avg
-
最小值:min
-
最大值:max
-
总和:sum
-
有时在计算聚集函数前必须先去重,如果确实想去除重复项,可在聚集表达式中使用关键字distinct。
-
聚集函数只能用在select列表和having子句中
select count(*) from course; select min(distinct id) from course; select sum(distinct socer) from course;
分组聚集 GROUP BY
-
求各个课程号及相应的选课人数
select Cno,count(Sno) from SC group by Cno;
表名:user_profile
-
求每个学校的最低gpa
-
在带有group by子句的查询语句中,在select列表中指定的列要么是group by字句中指定的列,要么包含聚组函数。
-
错误代码示范:
select device_id,university,min(gpa) from user_profile group by university
-
正确解法之一:
select device_id,university,gpa from user_profile where (university,gpa) in (select university,min(gpa) from user_profile group by university) order by university
分组聚集 HAVING
-
HAVING短语作用于组
-
查询平均成绩大于90分的学生学号和平均成绩
select Sno,AVG(Grade) from SC group by Sno having AVG(Grade)>=90;
多表查询
数据更新
插入元组(行)
INSERT
Into <表名> [(<属性列1><属性列2><属性列3><属性列4>)]
Values(<常量1><常量2><常量3><常量4>);
-
将学生张三信息插入学生表Student当中(原表属性顺序:学号,姓名,性别,年龄,所在院系)
Insert Into Student Values (‘20205831’,’张三’,’男’,’18’,’CS’);
-
将一个新元组(学号:20205830,姓名:李东,性别:男,所在系列IS,年龄18)插入学生表Student中
-
在新增元组中指定了哪些属性要赋值,属性顺序可以不与create table 相同,但是后面赋值一定要与自己指定的属性一一对应。
Insert Into Student(Sno,Sname,Ssex,Sdept,Sage) Values (‘20205830’,’李东’,’男’,’IS’,’18’);
指出赋值属性时,若只插入部分列属性,则其他列属性自动赋予空值
Insert into SC (Sno,Cno) Values (‘20205832’,’1’);
没有指出赋值属性,需在其他属性上明确的赋值NUL
Insert into SC Values (‘20205832’,’1’,’NULL’);
插入子查询结果
Insert
Into <表名> [(<属性列1><属性列2><属性列3><属性列4>)]
子查询;
-
对每一个系,求学生平均年龄,并把结果放入数据库中
-
首先在数据库中建立一个新表,其中一列放系名,另一列放平均年龄
Create table Dept_age (Sdept char(15),Avg_age smallint);
-
然后对表Student按系分组,再把系名和平均年龄存入新表中
Insert Into Dwpt_age(Sdept,Avg_age) Select Sdept,AVG(Sage) From Student Group by Sdept;
数据修改(更新)
Update <表名>
Set <列名>=<表达式>[,<列名>=<表达式>]
[Where <条件>]
修改一个元组的值
-
将学生201215121的年龄改成22岁
Update student Set Sage=22 Where Sno=’201215121’;
带子查询的修改语句
-
将计算机系全体学生成绩归0
Update SC Set grade=0 Where Sno(select Son from Student Where Sdept=’CS’);
删除数据
Delete
From<表名>
[where <条件>]
-
功能从指定表中删除满足where子句条件的所有元组,如果没有where则删除表中的所有数据
-
删除学号201215128的学生记录
Delete From Student Where Sno=’201215128’;
视图
创建视图
CREATE VIEW <视图名> [(<列名> [,<列名>]…)]
AS
<子查询>
[WITH CHECK OPTION];
-
建视图的语句,就是在完整的SELECT语句前,增加“CREATE VIEW 视图名 AS”。
-
建立信息系学生的视图
CREATE VIEW IS_Student AS SELECT Sno,Sname,Sage FROM Student WHERE Sdept='IS';
-
建立信息系学生的视图,并要求进行修改和插入操作时仍需保证该视图只有信息系的学生
-
定义IS_Student视图时加上了WITH CHECK OPTION子句,对该视图进行插入、修改和删除操作时,RDBMS会自动加上Sdept=‘IS’的条件。
CREATE VIEW IS_Student AS SELECT Sno,Sname,Sage FROM Student WHERE Sdept='IS' WITH CHECK OPTION;