SQL Server T-SQL (Stuctured Query Language)
T – SQL 运算符: +, -, * ,/,%
T – SQL 赋值运算符:= 例如:Name = ‘王华’
T – SQL 比较运算符:= 等于 例如:age = 23 > 大于 例如:price > 100
< 小于 <> 不等于 >= 大于等于 <= 小于等于 != 不等于(非SQL-92标准)
T – SQL 逻辑运算符:AND 与(并且), OR 或(或者), NOT 非(取反)
一、使用INSERT插入数据 (增)
1.一次插入一行数据 INTO解释:(到…里;深入…之中;成为…状况;进入到…之内)
语法:INSERT [INTO] 表名 [(列名列表)] VALUSE (值列表)
如:INSERT INTO Student (Name,Address,Grade,Email,Sex)
VALUSE (‘张三’,’湖北’,’25’,’[email protected]’,DEFAULT); DEFAULT(默认值)
2.一次插入多行数据
(1)(通过INSERT SELECT 语句将现有表中的数据添加到已存在的表中)
如:INSERT INTO Address (SName,Phone,Address,Email)(表必须预先存在)
SELECT StudentName,Phone,Address,Email
FROM Student
(2)(通过SELECT INTO 语句将现有表中的数据添加到新表中)
如:SELECT IDENTITY (int,1,1) AS StudentNo Student.StudentName,Student.Address,Student.Email
INTO AddressList (此表不能预先存在)
FROM Student
插入自增列(标识列)
语法:SELECT IDENTITY(数据类型,标识种子,标识增长量) AS 列名
INTO 新表
FROM 原始表
(3)(通过UNION关键字合并数据进行插入)
如:INSERT Result(表名)(StudentNo,SubjectId,StudentResult,ExamDate)
SELECT ‘S120090201‘,1,80,‘2009-9-3‘ UNION
SELECT ‘S120090202‘,2,60,‘2009-9-3‘
二、(1)使用DELETE 删除数据 (删出多条记录,WHERE 不带条件)(删)
语法:DELETE [FROM] 表名 [WHERE <删除条件>]
如:DELETE FROM Student (DELECT 后面不能出现列名,它删除是删除整条记录)
WHERE StudentNo = ‘S1220015’
(2) 使用TRUNCATE TABLE 删除数据 (删除整表数据)(删)
说明:(删除整表记录,比DELETE执行速度块,它会删除表中的所有行(所有记录)。但表结构、列、约束、索引等不会被改动,而且删除后标识列会重新编号。缺点:使用它删除数据后,不能恢复还原。)
三、使用UPDATE 更新数据 (改)
语法:UPDATE 表名 SET 列名 = 更新值 [WHERE 更新条件]
如:UPDATE Student SET sex = 0 (表中Sex列都将被更新)
如:UPDATE Student SET Scores = Scores + 5
WHERE Scores <= 95 (表中条件满足的Scores列将被更新)
判断条件是否为空: WHERE Email IS NULL (如果等空条件将满足)
四、使用SELECT 语句进行查询(查)
说明:查询时,可以在.sql文件开头加入“USE <数据库名称>”
语法:SELECT <列名>
FROM <表名>
WHERE <查询条件表达式>
[ORDER BY <排序的列名>] ASC(升序) 或 DESC(降序) ,默认为(升序)。
1.查询所有的数据行和列 (*)表示所有列
SELECT * FROM Student
2.查询部分行或列
SELECT SCode,Sname,Saddress
FROM Student
WHERE Saddress = ‘湖北’
3.在查询中使用列的别名
SELECT Scode AS 学生编号,Sname AS 学生姓名,Saddress AS 学生地址
FROM Student
WHERE Saddress <> ‘湖北’
合并列:SELECT StudentName+’,’+Sex AS 姓名性别 (需要同类型)
FROM Student
使用“=”命名:
SELECT 姓名性别 = StudentName+’,’+Sex
FROM Student
4.查询空值
SELECT StudentName FROM Student WHERE Phone IS NULL (条件为空满足)
SELECT StudentName FROM Student WHERE Phone IS NOT NULL (不为空)
5.在查询中使用常量列
SELECT 姓名 = StudentName, 地址 = Address, ‘北大青鸟‘ AS 学校名称
FROM Student
6.查询返回限制行数
(1)SELECT TOP 5 StudentName, BornDate AS 生日
FROM Student WHERE Sex = 0 (使用关键字 TOP + 返回个数)
(2)SELECT TOP 20 PERCENT StudentName, BornDate AS 生日
FROM Student WHERE Sex = 0 (使用TOP + 数字 + PERCENT(表示百分之))
7.如何使用 ORDER BY
SELECT TOP 1 StudentName,GradeId
FROM Student
ORDER BY BornDate DESC
测试 SELECT StudentResult/2 AS 计算的成绩,StudentNo,StudentResult,*
FROM Result (可以任意添加多少的列)
模糊查询
1.通配符
_ 一个字符 A LIKE ‘C_’ 则符合条件的如:CS,CB,CA 等。
% 任意长度的字符串 B LIKE ‘CO%’ 则符合条件的如:Coabc,Coxyz,等。
[] 括号中所指定范围的一个字符 C LIKE ‘a0[1-5]’,则符合条件的如:a01,a04等
[^] 不在括号中所指定范围内的任意一个字符 D LIKE ‘a0[^1-5]’ 如:a06,a07等。
2.使用LIKE进行模糊查询
SELECT * FROM Student WHERE StudentName LIKE ‘李%’ 或者’李__’
结果:将查询出姓为李,名为两个或一个字符的学生信息
SELECT * FROM Student WHERE Address LIKE ‘%江%’
结果:将查询出地址为长江路的的学生信息
select * FROM Result WHERE StudentResult LIKE ‘7[1-8]‘
结果:71-78,包括71和78.
select * FROM Result WHERE StudentResult LIKE ‘7[^1-8]‘
结果:不包括71-78,包括70和79
3.使用BETWEEN 在某个范围内进行查询 (包头包围的取值)
用于数字,并且前面的数字一定比后面的大,否则无结果.
SELECT * FROM Result WHERE StudentResult BETWEEN 60 AND 80
结果:包括60和80,及60到80之间的数字
SELECT * FROM Result WHERE StudentResult NOT BETWEEN 60 AND 80
结果:不包括60和80,及不包括60到80之间的数字
4.使用IN在列举值内进行查询
用于指定的非数字范围取值.
SELECT StudentName,Sex FROM Student WHERE Address IN (‘长江路’,’湖北’)
结果:查询出地址为长江路和湖北的学生姓名及性别。
SELECT StudentName FROM Student WHERE Address NOT IN (‘长江路’,’湖北’) 结果:查询出地址不为长江路和湖北的学生姓名。
T-SQL中的聚合函数
SUM() 返回表达式中所有数值的总和,SUM()只能用于数字类型的列。
SELECT SUM(StudentResult) AS 学号为23的学生总分 FROM Result WHERE StudentNo = ‘23’
AVG() 返回表达式中所有数值的平均值,AVG()也只能用于数字类型的列。
SELECT SUM(StudentResult) AS 学号为23的学生平均分 FROM Result WHERE StudentResult >= 60
MAX()和MIN()
MAX()返回表达式中最大的值,MIN()……最小的值,它们都可以用于数字型、字符型以及日期/时间类型的列。
SELECT AVG(StudentResult)AS 平均分,MAX(StudentResult) AS 最高分,
MIN(StudentResult)AS 最低分 FROM Result WHERE StudentResult >= 60
COUNT() 返回提供的组或记录集中的个数,COUNT()可以用于数字和字符类型的列。
SELECT COUNT(*) FROM Result WHERE StudentResult >= 60 (*)将统计所有行
SELECT COUNT(StudentResult) FROM Result (如果为空(NULL)将不被计算)
使用GROUP BY进行分组查询
SELECT GradeId, AVG(StudentResult)
FROM Result
GROUP BY GradeId
- 查询男女学生的人数各有多少人
SELECT 人数 = COUNT(*),Sex AS 性别
FROM Student
GROUP BY Sex
- 查询每个年级的总人数
SELECT COUNT(*) AS 人数,GradeId AS 年纪
FROM Student
GROUP BY GradeId
- 查询每个科目的平均分,并按照有高到底的顺序排列显示
SELECT SubjectId AS 科目, AVG(StudentResult) AS 平均分
FROM Result
GROUP BY SubjectId
ORDER BY AVG(StudentResult) DESC
- 多列分组查询
SELECT COUNT(*) AS 人数, GradeId AS 年级, Sex AS 性别
FROM Student
GROUP BY GradeId,Sex
ORDER BY GradeId
使用HAVING子句进行分组筛选
注意:SELECT 后面除聚合函数,后面的内容在GROUP后面一定要出现
- 查询年级总人数超过5的年级
SELECT COUNT(*) AS 人数,GradeId AS 年级
FROM Student
GROUP BY GradeId
HAVING COUNT(*) > 5
- 查询平均分及格的课程信息
SELECT SubjectId AS 课程编号,AVG(StudentResult) AS 平均分
FROM Result
WHERE StudentResult >= 60
GROUP BY SubjectId
HAVING AVG(StudentResult) >= 60
ORDER BY AVG(StudentResult) DESC
- 查询门课程及格总人数和及格学生的平均分
SELECT COUNT(*) AS 人数, AVG(StudentResult) AS 平均分, SubjectId AS 课程
FROM Result
WHERE StudentResult >= 60
GROUP BY SubjectId
- 查询没门课程及格总人数和及格平均分在80分以上的记录
SELECT COUNT(*) AS 人数, AVG(StudentResult) AS 平均分, SubjectId AS 课程
FROM Result
WHERE StudentResult >= 60
GROUP BY SubjectId
HAVING AVG(StudentResult) >= 80
- 在按照部门分类的员工表中,查询“有多个员工的工资不低于2000的部门编号”
SELECT 部门编号,COUNT(*) FROM 员工信息表
WHERE 工资 >= 2000
GROUP BY 部门编号
HAVING COUNT(*) > 1
多表联接接查询
一、内连接查询
1.在WHERE子句中指定联接条件
SELECT StudentName,StudentResult
FROM Student,Result
WHERE Student.StudentNo = Result.StudentNo
2.在FROM子句中使用INNER JOIN…ON
SELECT S.StudentName,R.StudentResult
FROM Student AS S
INNER JOIN ResultAS R ON (S.StudentNo = R.StudentNo)
例1:SELECT R.SubjectId, S.StudentName, R.StudentResult
FROM Student AS S
INNER JOIN ResultAS R ON(S.StudentNo = R.StudentNo)
WHERE R.StudentResult >=60 AND R.SubjectId = 18
例1中,查询将返回科目编号为18的及格学生的姓名和分数
列2:(研究)SELECT R.SubjectId, S.StudentName, R.StudentResult
FROM Student AS S
INNER JOIN ResultAS R ON(S.StudentNo = R.StudentNo)
GROUP BY R.SubjectId,S.StudentName,R.StudentResult
三个表之间联接查询
SELECT S.StudentName AS 姓名, SU.SubjectId AS 科目, R.StudentResult
FROM Student AS S
INNER JOIN ResultAS R ON (S.StudentNo = R.StudentNo)
INNER JOIN Subject SU ON (SU.SubjectId = R.SubjectId)
二、外联接查询
- 左外联接查询 (查询左表全部内容,右表不满足为空NULL) OUTER:外面的(可加可不加)
SELECT S.StudentName AS 姓名,R.SubjectId AS 科目, R.StudentResult
FROM Student AS S
LEFT OUTER JOIN ResultAS R ON (S.StudentNo = R.StudentNo)
- 右外联接查询(查询右表全部内容,左表不满足为空NULL)
SELECT S.StudentName AS 姓名,R.SubjectId AS 科目, R.StudentResult
FROM Student AS S
RIGHT OUTER JOIN ResultAS R ON (S.StudentNo = R.StudentNo)