第四章 数据操作语句
插入数据:
INSERT [INTO]table_Name [<列名>……] VALUES <值列表>……
例:
INSERT INTOdbo.student(Sno,Sname,Ssex,Sage,Sdept) VALUES
('9512203','王敏','女','20','计算机系')--按列名顺序插入一行数据
INSERT INTOdbo.student VALUES ('9521101','张力','男','信息系','22')--按默认列顺序插入一行数据
INSERT INTOdbo.student(Sno,Sname,Ssex,Sage,Sdept) VALUES
('9521102','吴斌','男','21','信息系'),
('9521103','张海','男','20','信息系')--插入多行数据
INSERT INTOdbo.student(Sno,Sname,Ssex,Sage,Sdept)
SELECT '9531101','钱小平','女','18','数学系'
UNION SELECT'9531102','王大力','男','19','数学系'--插入多行数据
(插入数据必须一行一行进行,不能一列一列插入,并且必须插入主键)、
更新数据:
UPDATE <表名> SET <列名>=表达式(新值)[……]
[WHERE <条件>]
例:
用子查询实现:
UPDATE SCSET Grade=Grade+5
WHERE SnoIN
(SELECT SnoFROM Student
WHERE Sdept=’计算机系’)
用多表连接实现:
UPDATE SCSET Grade=Grade+5
FROM SCJOIN student ON SC.Sno=student.Sno –-将两个表连起来
WHERE Sdept= '计算机系'
删除数据:
DELETE FROM <表名> [删除条件]
查询语句:
SELECT <目标列名> FROM <数据源>
WHERE <条件>
GROUP BY <分组依据>
HAVING <组提取条件>
ORDER BY <排序依据>
单表查询:
SELECT Sno,Sname FROM dbo.student --列名不用加括号
SELECT SNAME,2016-SAGE FROM dbo.student –-2016-SAGE 无列名
SELECT SNAME,'出生年月',2016-SAGE FROM dbo.student –设置常量列
SELECT SNAMEAS 姓名,常量列='出生年月',2016-sage 年份 FROM dbo.student
--设置列别名
SELECT DISTINCTSNO FROM dbo.SC --DISTINCT 去掉重复行
SELECT SnameFROM dbo.student WHERE Sdept='计算机系'
查询条件 | 谓词 |
比较 | <、>、<=、>=、=、<>(!=)、(NOT+ 比较运算符) |
确定范围 | BETWEEN AND、NOT BETWEEN AND |
确定集合 | IN,NOT IN |
字符匹配 | LIKE,NOT LIKE |
空值 | IS NULL,IS NOT NULL |
多重条件 | AND,OR,NOT (取反(效率低)) AND的优先级高于OR |
SELECT Sname,Sage FROM dbo.student WHERE Sage>20
SELECT Sname,Sdept,Sage FROM dbo.student WHERE Sage BETWEEN 20 AND 23
SELECT Sname,Sdept,Sage FROM dbo.student WHERE Sage NOT IN('20','21','22','23')
_ | 任意一个字符 |
% | 任意0或多个字符 |
[] | 匹配[]中的任意一个字符,例[abcd] |
[^] | 不匹配[]中的任意一个字符 |
SELECT Sname,Sdept,Sage FROM dbo.student WHERE Sname LIKE '[张王李]%' -- % 放在后面
SELECT Sname,Sdept,Sage FROM dbo.student WHERE Sname LIKE '_[大小]%' -- 如果没有_,结果为大??,小?;如果没有%,结果为?大,??小
SELECT SageFROM dbo.student WHERE RTRIM(Sname) LIKE '王__' --去掉数据中自动添加的空格
SELECT Sno,Grade FROM dbo.SC WHERE Grade IS NOT NULL
排序:
ORDER BY <列名> ASC|DESC
SELECT Grade,Sage,Sname FROM dbo.SC JOIN dbo.student ON SC.Sno=student.Sno ORDER BY Grade,Sage DESC --排序,ASC升序,DESC降序
聚合函数(统计函数):
COUNT(*) | 求表中元组个数 |
COUNT(DISTINCT <列名>) | 求列中非空值数量 |
SUM(<列名>) | 求列值总和 |
AVG(<列名>) | 求平均 |
MAX(<列名>) | 最大值 |
MIN(<列名>) | 最小值 |
不能出现在WHERE中!!!
SELECT COUNT(*)选课数量 ,COUNT(Grade) 考试门数,MAX(Grade) 最高分,MIN(Grade) 最低分 FROM dbo.SC WHERE Sno='9512101'
分组统计:细化统计函数的作用对象。查询列表中的每个列要么是分组依据列,要么是统计函数列;
SELECT Sno,COUNT(Cno),AVG(Grade) FROM SC GROUP BY Sno --单分组条件
SELECT Sdept,Ssex,COUNT(*) FROM dbo.student GROUP BY Sdept,Ssex --多分组条件
SELECT Sdept,Ssex,COUNT(*) FROM dbo.student GROUP BY Sdept,Ssex HAVING COUNT(*)<2 --使用HAVING 语句进行筛选
WHERE 语句用于分组前对所有数据进行筛选,不用使用统计函数,HAVING语句用于分组后对分组数据进行筛选,可以使用统计函数;
多表连接:
内连接:
SELECT CO.Cno,Grade FROM dbo.Course AS CO INNER JOIN dbo.SC AS SC ON CO.Cno=SC.Cno WHERE Sno='9512101' --内连接
自连接:必须使用别名将同一张表区分成两张表,注意哪个是查询条件表,哪个是查询结果表。
SELECT Sname,Sdept FROM dbo.student WHERE Sdept=(SELECT Sdept FROM dbo.student WHERE Sname='李晨')
SELECT T2.Sname,T2.Sdept FROM dbo.student T1 JOIN dbo.student T2 ON T1.Sdept=T2.Sdept WHERE T1.Sname='李晨' --自连接
外连接:
SELECT CnameFROM dbo.Course CO LEFT OUTER JOIN dbo.SC SC ON CO.Cno=SC.Cno WHERE SC.Grade IS NULL --左外连接
SELECT Cname,Sno FROM Student.dbo.SC RIGHT OUTER JOIN STUDENT.DBO.Course ON Course.Cno=SC.Cno WHERE Sno IS NULL—右外连接
左外连接要求T2必须满足连接条件,T1可以不满足;(T1中的数据在T2中可以找不到对象,即T2中可以没有对应的数据)
ALTER VIEWdbo.V_Inventory2
AS
SELECT INV.cInvCode,INV.cInvName,INV.cInvStd,inv.dSDate,COM.cComUnitName,INVC.cInvCCode,INVC.cInvCName,INVC.iInvCGrade FROM UFDATA_001_2016.dbo.Inventory INV JOIN (可以使用RIGHT OUTER JOIN)UFDATA_001_2016.dbo.ComputationUnit COMON INV.cComUnitCode=COM.cComunitCode
RIGHT OUTERJOIN UFDATA_001_2016.dbo.InventoryClass INVC ON INV.cInvCCode=INVC.cInvCCode
INNER JOIN UFDATA_100_2016.dbo.InventoryClass INVCLASSON INVCLASS.cInvCCode IN(SELECT SUBSTRING(cInvCCode,1,2)FROM UFDATA_100_2016.dbo.Inventory)
使用外连接进行多表联查:你希望他的某一列数据都出现的那个表,用RIGHT时放在最后一个表,用LEFT时放在第一个表,其他的表连接使用JOIN 即可
右外连接正相反;
截取字符串:
SUBSTRING(字段,startindex,length)startindex从1开始
TOP限制结果集:‘
TOP N [PERCENT][WITH TIES]
WITH TIES:表示包括并列结果。(必须与ORDER BY排序一起使用 )
如果使用DISTINCT 则要放在DISTINCT之后。