SQL(结构化查询语言)
关系数据库的标准语言
SQL Server、Oracle、DB2
非过程化语言
不需要指定对数据的存放方法
统一的语言
创建、修改以及删除数据对象(数据库、表等)
T-SQL
SQL的加强版, 提供了类似于程序语言的基本功能
变量说明、流程控制、功能函数
DML:数据操纵语言
查询、插入、删除和修改数据
SELECT、INSERT、UPDATE、DELETE
DCL:数据控制语言
建立数据库、数据库对象和定义其列
CREATE、ALTER、DROP
DDL:数据定义语言
控制数据库组件的存取许可、存取权限等
GRANT、REVOKE
比较运算符
运算符 | 含义 |
= | 等于 |
> | 大于 |
< | 小于 |
<= | 小于等于 |
>= | 大于等于 |
<> | 不等于 |
!> | 不等于 |
BETWEEN | 指定值的包含范围(包含边界)。使用 And 分隔开始值和结束值 |
IS [Not] NULL | 指定是否搜索空值或非空值 |
LIKE | 模糊查询,与指定字符串进行模式匹配 |
IN | 是否在数据范围里面 |
通配符
运算符 | 含义 |
AND | 组合两个条件,并在两个条件都为True时取值为True |
OR | 组合两个条件,并在两个条件之一为 True 时取值为True |
NOT | 和其他操作符一起使用,取反的操作 |
1.创建数据库:
Createdatabasebenet--创建一个数据库名为”benet“
on
(
name=benet,--文件的逻辑名
filename='d:\benet.mdf',--数据文件存放的物理位置
size=10MB,--文件的初始大小
maxsize=100MB,--文件的总存储空间大小
filegrowth=10MB--文件的自动增长大小
)
logon
(
name=benet_log,
filename='d:\benet.ldf',--日志文件存放的物理位置
size=10MB,--日志文件的初始大小
maxsize=100MB,--日志文件的总存储大小
filegrowth=10MB--日志文件自动增长大小
)
Go
2.创建表:
usebenet--在benet数据库下创建表
createtablestudent--创建一个表为”student“
(
sidintidentity(1,1)primarykeynotnull,
--设置标示符自动增长”identity“设置主键”primarykey' 不为空“not null”
namenvarchar(50)notnull,
sexnvarchar(50) default'男'notnull, --默认值为”男”
ageintnotnull,
birthdaysmalldatetime null
)
3.插入记录:
usebenet--在benet数据库student表下插入记录
insertintostudent(name,sex,age,birthday)
values ('zhangsan','男',22,'1994-01-01'),
('lisi','女',24,'1992-02-03'),
('wangwu','男',25,' ')
4.修改数据:
usebenet
updatestudent--把原来wangwu的性别"男",改为"女"
setsex='女'
wherename='wangwu'
usebenet
updatestudent--把所有性别为"男",改为"女"
setsex='女'
wheresex='男'
usebenet
updatestudent--把所有人的年龄都+10
setage=age+10
usebenet
updatestudent--把zhangsan的年龄+10
setage=age+10
wherename='zhangsan'
5.修改表:
usebenet
altertablestudent--添加列cid
addcidintnull
usebenet
altertablestudent
dropcolumncid--删除列cid
usebenet
altertablestudent--修改birthday的数据类型为datetime
altercolumnbirthdaydatetime
6.修改列名:
usebenet
execsp_rename'student.sex(原始表内的列名)','性别(新列名)','column' --把列名“sex”改为“性别”
7.删除:
删除数据(注意:语句DELETE和DROP TABLE之间有一个非常重要的区别。DELETE删除一个表中的一部分或全部的内容。而DROP TABLE则将表的内容和表的大纲全都一起删除。这样,在执行了DELETE语句之后,表依然存在于数据库中,尽管表中或许已没有行了,但在执行DROP TABLE语句后,表将不复存在)
条件删除 | 记录事物日志 | 重置标识符列 | 外键约束 | |
Delete | 使用where子句按条件删除 | 是,数据可以恢复 | 否 | 可以用于含有外键约束的表 |
Truncate table | 只能清空整个表 | 否,数据无法恢复 | 重置标识符列为0 | 不能用于含有外键约束的表 |
usebenet
deletefromstudent--删除表中所有性别为“男”的信息
where性别='男'
usebenet
deletefromstudent--删除表中所有年龄为“34”的信息
whereage='34'
usebenet
droptablestudent--删除表
8.select 查询
(1)查询studen表中的所有数据,“*”代表全部
usebenet
select*fromstudent
(2)查询studen表中的name列
usebenet
selectnamefromstudent
(3)查询studen表中的name列和sex列,用","隔开
usebenet
selectname,sex
fromstudent
(4)查询studen表中的李四的年龄
usebenet
selectage
fromstudent
wherename='李四'
(5)查询studen表中的不为李四的年龄
usebenet
selectage
fromstudent
wherename<>'李四'--(where name!='李四'\where not name='李四')
(6)查询studen表中的name大于24的
usebenet
selectname,age
fromstudent
whereage>24
(7)查询studen表中的name大于等于30的
usebenet
selectname,age
fromstudent
whereage>=30
(8)查询studen表中的name小于24的
usebenet
selectname,age
fromstudent
whereage<24
(9)查询studen表中的name小于等于30的
usebenet
selectname,age
fromstudent
whereage<=30
(10)查询studen表中的age等于18并且age等于30的
usebenet
selectname
fromstudent
whereage=18 and age=30--(whereage in (18,30))
(11)查询studen表中的name大于等于30的并且小于等于50
usebenet
selectname,age
fromstudent
whereage>=30 andage<=50 --(where age between 30 and 50,如果不等于加“not”)
(12)查询studen表中的name小于等于30的或者大于等于50
usebenet
selectname,age
fromstudent
whereage<=30 orage>=50 --(where age not between 30 and 50)
(13)查询studen表中的sex为女并且年龄等于18
usebenet
selectname,age
fromstudent
wheresex='女'andage=18
(14)查询studen表中的所有sex(不重复)使用distinct
usebenet
selectdistinctsex--查询studen表中的所有sex(不重复)
fromstudent
NOT操作的优先级最高,AND其次,OR最低
比较以下两个语句的不同:
(15)比如:
usebenet
Select*
Fromstudent
Where age>22 andage<30)
orcid=1 andsex='男'
--先执行age>22 andage<30,然后执行cid=1 andsex='男'
,最后执行age<3 orcid=1
(16)查询student中cid为空的性名
usebenet
Selectname
Fromstudent
Wherecidisnull --不为空(where cid is not null)
Selectcount(*)
Fromstudent
9.聚合函数
AS子句可以用来改变结果集列的名称
比如:
(1)查看setudent表中age的总和
SelectSUM(age)as年龄
Fromstudent
(2)查看setudent表中age的平均数
Selectavg(age)as年龄
Fromstudent
(3)查看student表中age的的总个数
Selectcount(age)as总个数
Fromstudent
(4)查看student表中age的最大值和最小值
Selectmax(age) -- 最大值
Fromstudent
Selectmin(age) --最小值
Fromstudent
10.分组查询:按照一定条件分类组合,通过groupby 子句实现,having子句的作用是筛选满足条件的组
(1)统计每个课程的总成绩
Selectcidas课程编号,sum(score)as总成绩
Fromscore
groupbycid
(2)统计每个课程的平均成绩
Selectcidas课程编号,avg(score)as平均成绩Fromscore
groupbycid
(3)统计每个学生每个课程的平均成绩
Selectsidas学生编号,cidas课程编号,avg(score)as平均成绩
Fromscore
groupbysid,cid
(4)只显示补考过的学生成绩
Selectsidas学生编号,cidas课程编号,avg(score)as平均成绩Fromscore
groupbysid,cid
havingcount(score)>1
11.降序升序、Top
(1)查询student中的所有数据,并以年龄降序排列
Select*
fromstudent
orderbyagedesc --esc升序
(2)查询student中前5列数据,并以年龄降序排列
Selecttop 5 * --用top子句实现
fromstudent
orderbyagedesc
12.LIKE操作符用于将列的值与某个特定的模式做比较。列的数据类型可以是任何字符或者日期型数据。
通配符 %:any 代表零个或多个任意字符 _:single代表某一个任意字符
(1)查询student表中所有姓名以张开头的姓名和年龄
Selectname,age
fromstudent
wherenamelike'张%'
(2)查询student表中所有姓名不是以张开头的姓名和年龄
Selectname,age
fromstudent
wherename not like'张%'
(3)查询student表中所有姓名无论第几个字为“德”的姓名和年龄
Selectname,age
fromstudent
wherenamelike'_德%'
(4)查询student表中所有姓名第二个字为“德”的姓名和年龄
Selectname,age
fromstudent
wherenamelike'%德%'
(5)查询student表中年龄为2和3开头的所有姓名
Selectname
fromstudent
whereagelike'[2-3]%'
(6)查询姓(firstname)的打头字母不是J,K,L,M,N,O,并且名(lastname)的打头字母不是E或者Z的所有学生的编号和名字
Selectstid,name
Fromstudent
Wherefirstnamelike'[^J-O]%'
andlastnamelike'[^EZ]%'
13.多表查询
合并union
把student表和score表的cid合并
Selectcid
Fromstudent
union
selectcid
fromscore
(1)内链接inner join
Selectstudent.name姓名s,student.cid班级s,
class.cid班级c,class.name名子c
fromstudent,class
wherestudent.cid=class.cid
或者标准写法:
Selectstudent.name姓名s,student.cid班级s,
class.cid班级c,class.name名子c
fromstudentinnerjoinclass
onstudent.cid=class.cid
(2)外连接
1>左外连接使用left join(左为主表,右为从表,如果左表某一行在右表中没有匹配行,则右表返回null值)
Selectstudent.name姓名s,student.cid班级编号s,
class.cid班级编号c,class.name班级名c
fromstudentleftjoinclass
onstudent.cid=class.cid
2>右外连接使用right join(右为主表,左为从表,如果右表某一行在左表中没有匹配行,则左表返回null值)
Selectstudent.name姓名s,student.cid班级编号s,class.cid班级编号c,class.name班级名c
fromstudentrightjoinclass
onstudent.cid=class.cid
3>完整外连接使用full join(返回左表和右表的所有行,当某一行在另一表中没有匹配行时,另一表返回空值)
Selectstudent.name姓名s,student.cid班级编号s,class.cid班级编号c,class.name班级c
fromstudentfulljoinclass
onstudent.cid=class.cid
4>交叉连接使用cross join(表之间没有任何关联条件,查询将返回左表与右表挨个连接的所有行,就是左表中的每一行与右表的所有行一一组合
Selectstudent.name姓名s,student.cid班级编号s,class.cid班级编号c,class.name班级c
fromstudentcrossjoinclass
或者
Selectstudent.name姓名s,student.cid班级编号s,class.cid班级编号c,class.name班级c
fromstudent,class