知识点SQL语句学习及详细总结文档格式.docx
《知识点SQL语句学习及详细总结文档格式.docx》由会员分享,可在线阅读,更多相关《知识点SQL语句学习及详细总结文档格式.docx(64页珍藏版)》请在冰豆网上搜索。
.
数据库操作3.SQL语句
(1)创建数据库
CREATEDATABASEdatabase_name
基础.SQL二
SQL(StructuredQueryLanguage,结构化查询语言)是用户操作关系数据库的通用语言。
1.SQL功能概述
系统提供的数据类型2.
数值数据类型2.1
存储说明数据类型空间
bit数据类型是整型,其值只能是0、1或空值。
这种数据类型用于存储只有两种可能值的数据,如Yes或1字bit
节或False、True或、OnNo(很省空间的一种数据类型,Off.
如果能够满足需求应该尽量多用。
)255
到数据类型能存储从0tinyint1字之间的整数。
它在你只打算存储有tinyint
节限数目的数值时很有用。
-2smallint数据类型可以存储从smallint
字2次幂15的2到(-32768)次幂15的.
存储说明数据类型空
间
(32767)之间的整数。
这种数据类型节
对存储一些常限定在特定范围内的数值型数据非常有用。
(如果tinyint类型太单调不能满足您的需求,您可以考虑用smallint类型,因为这个类型相对也是比较安全的,不接受恶意脚本内容的嵌入。
)
int数据类型可以存储从-2的31次幂(-2147483648)到2的31次幂4个(2147483647)之间的整数。
存储到字int
数据库的几乎所有数值型的数据都节
可以用这种数据类型
数据类型能用来存储从-10的38次最numeric多的固定精度-1次幂38的10到-1幂或)p,s(.
存储数据类型说明空
间
和范围的数值型数据。
使用这种1decimal(p,s)
据类型时,必须指定范围和精度范围是小数点左右所能存储的数的总位数。
精度是小数点右边存
的数字的位
2.2普通编码字符串类型
数据类型说明存储数据类型用来存储指定长度的定长char非统一编码型的数据,n表示字符串的最n字char(n)
大长度,取值范围为1~8000(若实际字___系统自动在后面补空格)n,符串控件小于
说明存储数据类型字符表示字符串的,n可变长度的字符串类型
字节varchar(n)
1~8000。
最大长度,取值范围为销
text数据类型用来存储大量的非统一编每个码型字符数据。
这种数据类型最多可以有text
个字.
亿个字符231-1或20的区别:
和varcharchar
char4个字节,而,若某列数据类型为varchar(20)存字符串”Jone”时,只占用类型更节省类型比char(20)会在为填满的空间中填写空格。
所以,varchar),4处理速度也慢一些。
因此,n值比较小(小于空间,但它的开销会大一些,char用类型更好些。
2.3统一编码字符串类型(Unicode)
数据类型说明存nchar数据类型用来存储定长统一编码2nnchar(n)
字符型数据。
统一编码用双字节结构来__普通文(存储每个字符,而不是用单字节.
存说明数据类型。
它允许大量的扩展字符。
本中的情况)
使用的4000种字符,此数据类型能存储.
字节空间上增加了一倍字nvarchar数据类型用作变长的统一编码字符型数据。
此数据类型能存储4000字nvarchar(n)
销种字符,使用的字节空间增加了一倍.
最多可存储2的30次方-1将近10亿个每ntext
字符个三.SQL数据操作语言
1.数据查询语句
1.1查询语句的基本结构
SELECT<
目标列名序列>
--需要哪些列
From<
表名>
--来自哪张表
>
]
行选择条件<
WHERE[
]<
分组依据列[GROUPBY>
<
组[HAVING
>
排序依据列[ORDERBYSELECT子句用于指定输出的字段;
FROM子句用于指定数据的来源;
WHERE子句用于指定数据的选择条件;
GROUPBY子句用于对检索到的记录进行分组;
HAVING子句用于指定组的选择条件;
子句用于对查询的结果进行排序;
ORDERBY
子句和FROMSELECT子句是必需的,其它是可选的。
以上子句中,
1.2单表查询
1.2.1选择表中若干列
(1)查询指定的列
SELECT列名FROM表名
1
?
SELECTSname,SnoFROMStudent:
例子
(2)查询全部列
表名FROM*SELECT.
SELECT*FROMStudent:
例子(3)查询经过计算的列
表名SELECT列名FROM1
-
SELECTSname,year(getdata()):
例子
year(Birthdate)FROMStudent
1.2.2选择表中的若干元祖
(1)消除取值相同的行:
DISTINCT
SELECTDISTINCTSnoFROM表名
SELECTDISTINCTSnoFROMStudent:
(2)查询满足条件的元祖
查询条件
谓
词
比较
=
、
<
!
确定范围
BETWEEN…AND.
NOT
词谓查询条件
BETWEEN…AND
确定集合IN、NOTIN
LIKE、字符匹配NOTLIKE
ISNULL、空值ISNOTNULL
多重条件(逻辑谓词)AND、OR
a.比较大小
SELECTSnameFROMStudentWHERE
year(getdata())-year(Birthdate)<
20
b.确定范围
BETWEEN…AND和NOTBETWEEN…AND可用于查找属性值在或不在指定范围。
列名|表达式|[NOT]BETWEEN下限值AND上限值
BETWEEN…AND代表的范围是在上限值和下限值之间(包括边界值),即为
。
true
代表的范围是不在上限值和下限值之间(不包括边界NOTBETWEEN…AND)falsetrue值),即为。
(若判断值为边界值时,为SELECTSno,CnoFROMSCWHEREGrade
BETWEEN80AND90
SELECTSno,CnoFROMSCWHERE
价于等此查询Grade>
=80ANDGrade<
=90
SELECTSno,CnoFROMSCWHEREGrade
例子NOTBETWEEN80AND90
于等查询价此Grade<
80ORGrade>
90
c.确定集合
IN运算符的含义:
当列中的值和集合中的某个常量值相等时,结果为True。
NOTIN运算符的含义:
当列中的值和集合中的全部常量值都不相等时,结果为True。
SELECTSnoFROMStudentWHEREDept
IN('
信息管理系'
'
计算机系'
SELECTSnoFROMStudentWHERE
此查询等价于:
Dept='
ORDept='
例子NOTIN('
计算机'
ANDDept!
='
Dept!
)系
d.字符串匹配运算符用于查找指定列中与匹配串匹配的元祖。
Like>
匹配串]LIKE<
列名[NOT
通配符含义
(下划_匹配任意一个字符线)(百分%匹配0个或多个字符号)匹配[]中的任意一个字符。
如[abcd]表示匹配ab[]
任何一个,若是连续的,可以用-表示,如[a-d[^]
表示不匹[^abcd]中的任意一个字符。
如[]不匹配
其中任何一个,若是连续的,可以用-表示,如
例子:
(查询姓“张”的学生详细信息)
SELECT*FROMStudentWHERESnameLIKE'
张%'
(查询不姓“张”的学生详细信息)
SELECT*FROMStudentWHERESnameNOT
LIKE'
(查询姓“张”、“李”的学生详细信息)
[张李]%'
(查询名字的第二个字为“小”或“大”的学生详细信息)
SELECT*FROMStudentWHERESnameLIKE
'
_[小大]%'
e.涉及空值的查询
空值(NULL)在数据库中有特殊含义,表示当前不确定或未知的值。
判断是否为NULL时,不可用普通的比较运算符,需用ISNULL
SELECTSnoFROMStudentWHEREGrade
ISNULL
1.2.3对查询结果进行排序
将查询结果按照指定的顺序显示。
ASC表示按列值升序排列(从上往下,值从大到小)。
DESC表示按列值降序排列(从上往下,值从小到大)。
默认为ASC。
ORDERBY<
列名>
[ASC|DESC]
SELECTSno,GradeFROMSCORDERBY
GradeDESC
1.2.4使用聚合函数统计数据
聚合函数也称为统计函数或集合函数,作用是对一组值进行计算并返回一个统计结果。
聚合函数.
含义
聚合函数含义
统计表中元祖的个数COUNT(*)
列COUNT([DISTINCT]<
统计本列的非空列值个数>
名计算列值的和值(必须是数值列名>
)SUM(<
计算列值的平均值列名>
)(必须是数AVG(<
计算列值的最大值MAX(<
计算列值的最小值列名MIN(<
上述函数除COUNT(*)外,其它函数在计算过程中均忽略NULL值
(统计学生总人数)
SELECTCOUNT(*)FROMStudent
学号学生的考试平均成绩)”001“(统计.
SELECTAVG(Grade)FROMSCWHERESno=
'
001'
(查询“C001”号课程考试成绩的最高分和最低分)
SELECTMAX(Grade)最高分,MIN(Grade)最低分FROMSCWHERECno='
C001'
聚合函数不能出现在WHERE子句中!
1.2.5对数据进行分组统计
需要先对数据进行分组,然后再对每个组进行统计。
分组子句GROUPBY。
在一个查询语句中,可以用多个列进行分组。
分组子句跟在WHERE子句的后面:
GROUPBY<
分组依据列>
[,...n]
[HAVING<
组筛选条件>
(1)使用GROUPBY子句
(统计每门课程的选课人数,列出课程号和选课人数).
SELECTCnoas课程号,COUNT(Sno)as选课人数FromSCGroupBYCno
(统计每个学生的选课门数和平均成绩)
SELECTSno学号,COUNT(*)选课门数,AVG(Grade)平均成绩FromSCGroupBYSno
带WHERE子句的分组(统计每个系的女生人数)
SELECTDept,COUNT(*)女生人数FromStudentWhereSex='
女'
GroupBYDept
(2)使用HAVING子句
HAVING子句用于对分组后的统计结果再进行筛选,它的功能与WHERE子句类似,它用于组而不是单个记录。
在HAVING子句中可以使用聚合函数,但在子句一起使用。
GROUPWHERE子句中不能,通常与(查询选课门数超过3门的学生的学号和选课门数)
SELECTSno学号,COUNT(*)选课门数,AVG(Grade)平均成绩FromSCGroupBYSnoH3>
AVINGCOUNT(*).
HAVING的作用及执行顺序、GROUPBY、(3)WHERE
WHERE子句用于筛选FROM子句中指定的数据所产生的行数据。
?
GROUPBY子句用于对经WHERE子句筛选后的结果数据进行分组。
HAVING子句用于对分组后的统计结果再进行筛选。
可以分组操作之前应用的筛选条件,在WHERE子句中指定它们更有效,这样可以减少参与分组的数据行。
在HAVING子句中指定的筛选条件应该是那些必须在执行分组操作之后应用的筛选条件。
(查询计算机系和信息管理系每个系的学生人数)
第一种:
SELECTDept,COUNT(*)FROMStudentGROUPBYDeptHavingDeptin('
第二种:
SELECTDept,COUNT(*)FROMStudentWHEREDeptin('
)GROUPBYDept
以上例子比较:
第一种是按照系分组好了之后,只采取所有系中的两个系,显然效率不高。
而第二种是先进行WHERE筛选条件之后,再进行GROUPBY计算,显示更好。
1.3多表连接查询
若一个查询同时涉及到两张或以上的表,则称为连接查询。
1.3.1内连接使用内连接时,如果两个表的相关字段满足条件,则从两个表中提取数据组成新的记录。
连接条<
ON表2表FROM1[INNER]JOIN
件1
注意:
连接条件中的连接字段必须是可比的,必须是语义相同的列。
(查询学生及选课的详细信息)
SELECT*FROMStudentINNERJOINSCONStudent.Sno=SC.Sno
(查询计算机系学生的选课情况,列出该学生的名字、所修课程号、成绩)------行选择条件
SELECTSname,Cno,GradeFROMStudentINNERJOINSCONStudent.Sno=SC.SnoWHEREDept='
(统计每个系的平均成绩)------分组的多表查询
SELECTDept,AVG(Grade)ASAverageGrade
FROMStudentSINNERJOINSCONS.Sno=SC.SnoGroupBYDept
(统计计算机系每个学生的选课门数、平均成绩、最高成绩、最低成绩)------分组和行选择条件的多表连接查询
SELECTSno,COUNT(*),AVG(Grade),MAX(Grade),MIN(Grade)FROMStudentSJOINSCONS.Sno=SC.SnoWHEREDept='
1.3.2自连接
自连接是一种特殊的内连接,相互连接的表在物理上是一张表,但在逻辑上可以看做是两张表。
FROM表1AST1JOIN表1AST2
?
通过为表取别名的方法,可以让物理上的一张表在逻辑上成为两张表。
(一定要为表取别名!
(查询与刘晨在同一个系学习的学生的姓名、所在系)
SELECTS1.Sname,S1.DeptFROMStudentS1JOINStudentS2
ONS1.Dept=S2.Dept---同一个系的学生
WHERES2.Sname='
刘晨'
---S2表作为查询条件
ANDS1.Sname!
----S1表作为结果表,并从中去掉‘刘晨'
本人信息
1.3.3外连接
在内连接操作中,只有满足条件的元祖才能出现在查询结果集中。
外连接是只限制一张表中的数据必须满足条件,而另一张表的数据可以不满足条件。
FROM表1LEFT|RIGHT[OUTER]JOIN表2ON<
连接条件>