【网学网提醒】:网学会员为大家收集整理了SQL语言提供大家参考,希望对大家有所帮助!
对表名列名大小写不敏感,对内容则大小写敏感
每句以分号结束,可以分多行写
-----------------------------------------------
建立数据库:
mssql语法:
createschemaauthorization创建者名//建立数据库,标识创建者名
db2、xdb、dbaseiv语法:
createdatabase数据库名;//建立数据库,标识数据库名
-----------------------------------------------
表操作:
*****基本表的建立*****:
createtable学生表(char(6)notnullunique,//非空且取值唯一
char(6)unique,
成绩float,
导师编号char(6),//假设有一个导师编号为主码的导师表
primarykey(),//以为这个表的主码
foreignkey(导师编号)references导师表);//把导师表的主码作为这个表的外码
*****修改基本表结构*****:
增加一个属性列:新增的属性列值都为空
altertable学生表
add年龄int;
改变列的数据类型:原有数据可能破坏
altertable学生表
modifyint;
altertable学生表
modifychar(6);
取消列的完整性约束:
altertable学生表
dropunique();//变成可以同名
不允许删除任何属性列
如果一定要去掉某属性列,只能其它属性列复制到一个新表中,然后删除原表,再将新表重命名为原表名。
*****删除基本表*****:数据、索引和视图都自动删除
droptable表名;
*****拷贝基本表*****:
(1)首先用create要建立一个新表
(2)选择旧表中的属性列中的数据到新表属性列中:新旧属性列必须一一对应,列名可以不同,但列类型一定要相同
insertinto新表(列1,列2,列3)
select,,导师编号
from学生表
--------------------------------------------------
数据类型:括号中参数可以省略
bit整数型,小等于8位时1字节,以此类推。TRUE转换为1,FALSE转换为0,可取值为NULL
tinyint整数型,1字节,0~255
smallint整数型,2字节,-32768~32767
int整数型,4字节,-2147483648~2147483647,常用
bigint整数型,8字节,-9223372036854775808~9223372036854775807,不会自动转化为此类型
float(28)浮点型,最大53缺省24。1~24时,4字节,精度7,25~53时,8字节,精度15
real浮点型,4字节,等价于float(24)
decimal(12.9)小数型,前面是总位数,最大38缺省18,后面是小数位数,小于总位数。存储字节随总位数多少而变
numeric(12,9)数字型,等价于decimal
char(n)固定长度字符型,n最大8000,n字节,用于列数据项的大小一致
varchar(n)可变长度字符型,n最大8000,实际长度+2字节,用于列数据项
的大小差异相当大
varchar(max)可变长度字符型,最多输入2147483647字节,实际长度+2字节,用于列数据项大小相差很大,且可能超过8000字节
nchar(n)固定长度unicode字符型,n最大4000,n*2字节,用于列数据项的大小可能相同
nvarchar(n)可变长度unicode字符型,n最大4000,实际长度*2+2字节,用于列数据项的大小可能差异很大
nvarchar(max)可变长度unicode字符型,最多输入2147483647字节,实际长度*2+2字节,用于列数据项大小相差很大,且可能超过8000字节
binary(n)固定长度二进制型,n最大8000,n字节,用于列数据项的大小一致
varbinary(n)可变长度二进制型,n最大8000,实际长度+2字节,用于列数据项的大小差异相当大
varbinary(max)可变长度二进制型,最多占2147483647字节,实际长度+2字节,实际长度+2字节,用于列数据条目超出8,000字节时
money货币型,8字节,精确到小数点后4位
smallmoney货币型,4字节,精确到小数点后4位
datetime日期型,4字节,1753年1月1日~9999年12月31日,精确到3.33毫秒
smalldatetime日期型,2字节,1900年1月1日~2079年06月06日,精确到1分钟
cursor指针型
timestamp计数器型,8字节,含timestamp列的记录行执行插入、更新时,该计数器值就会增加。一个表只能有一个timestamp列,不能作为主键
sql_variantsql变量型,8016字节,可以存储除varchar(max)、varbinary(max)、nvarchar(max)、xml、timestamp、sql_variant、用户定义类型以外的各种数据类型。
uniqueidentifierID序列号型,16字节,可以存放6F9619FF-8B86-D011-B42D-00C04FC964FF格式。数据可以进行比较运算=、<>、<、>、<=、>=和是否为空运算ISNULL、ISNOTNULL
table用于临时存储一组行以进行后续处理
xmlxml型,用于存储xml实例,大小不超过2G
text将淘汰,转为varchar(max)
image将淘汰,转为varbinary(max)
ntext将淘汰,转为nvarchar(max)
------------------------------------------------------
数据操作:
*****查询数据*****:
一、查询全部列的全部记录:
select*
from学生表;
select*
fromaaa.dbf;//如果指定了数据库别名就可以
二、查询部分列的全部记录:
select,
from学生表;
表达式的列:
select,2006-年龄//当前年份-年龄=出生年份,“2006-年龄”成为查询结果的列名
from学生表;
三、查询符合条件的部分记录,在最后加上语句
where条件表达式
(1)普通表达式:=<><=>=!=!
where='001'
(2)逻辑表达式:orandnot
可
以组合用,默认优先级从左到右,用括号改变优先级
where='001'or'002'//或,条件在同一列。理解为并选,用in更为方便
where='001'or='某某'//或,条件在不同列
where成绩>80and导师编号='005'//且,一定在不同列
wherenot'103'//非,理解为排除
(3)特殊表达式:between-andlikeinisnullexists
where年龄between50and55//范围内
wherelike'高%'//字符串匹配,可以使用通配符。%表示零或多个字符,_表示任何一个字符,汉字要两个
wherein('001','002','004')//同一列中并选,比用or直观
where成绩isnull//为空
where成绩exists//有值。是isnull的反意
(4)not表达式:可以与以上各种表达式配合,代表相反
如:not
四、特殊结果显示要求:不能使用tet、ntext、image类型
(1)分组要求,在最后加一行
groupby列名//列名一定要在前面的select中要显式列出,用*也不行
having列名1>10//配合groupby使用,再对分组的结果再进行筛选。列名2要在select中
(2)排序要求,一定加一行在最后,不论是升还是降,首先列出空值项。不能放在嵌套查询的子查询中
orderby列名1//默认按升序排列
orderby列名1,列名2desc//先按列名1升序排列,遇到相同时按列名2降序排列
computesum(列名3)by列名1//配合orderby使用,再对排序结果进行函数计算。列名3要在select中
(3)消除某列中重复的结果
selectdistinct导师编号
from学生表
五、数值函数,在select后面加代码,如要在where中使用,要用嵌套
(1)计数器
selectcount(distinct导师编号)//有几个导师
from学生表
(2)最大和最小
selectmax(成绩)成绩//后一个“成绩”指定了查询结果时显示的列名。如果省略,系统会自动给出“max(成绩)”。以下类同
from学生表
selectmin(成绩)
from学生表
(3)平均值
selectavg(成绩)
from学生表
(4)求和
selectsum(成绩)
from学生表
六、嵌套查询:
(1)子查询单值返回:
例:查询专业代号为'000101'的学生成绩
select,,成绩
from学生表
where专业=
(select专业
from课程表
where专业代号='000101');
例:查询总分排在第一名后面的学生
select,,总分
from学生表
where总分 (select总分
from成绩表
where名次=1);
(2)子查询多值返回:
例:查询英语大于98的学生的总分
select,,总分
from学生表
where总分in
(select总分
from成绩表
where英语>98);
例:查询比英
语考98的同学总分还要高的学生的总分
select,,总分
from学生表
where总分>all//all代表子查询会返回多个值
(select总分
from成绩表
where英语=98);
(3)子查询返回true或false:如果子查询非空,返回true。子查询为空,返回false
例:如果有学生的英语高于98,则查询这些学生的总分
select,,总分
from学生表
where总分exists
(select总分
from成绩表
where英语>98);
七、连接多个表查询:多为有主码和外码关系的表
(1)等值连接:一般连接两张表
select学生,导师,//列名只在一张表中有的,直接写列名。
from学生表,导师表
where学生表.导师编号=导师表.导师编号;//两个列不一定要相同,但一定要有可比性。一般为主码和外码的关系,后面还可以有逻辑达表式和特殊表达式
特别注意:
select学生表.,导师表.,//如果两个表中有相同的列名,要用表名前缀。
select学生表.*,导师表.,//学生表.*,表示列出学生表中的所有列
(2)自身连接:一个表与自己进行连接,要为一个表取两个别名
select别名1.课名,别名2.预修课名
from选课表别名1,选课表别名2
where别名1.预修课名=别名2.课名;
(3)外连接:可以把不符合where条件的记录也都输出来,只是进行where判断的数据为空输出。加一个*号
select学生表.*,选课表.课名
from学生表,选课表;
where学生表.已选课程=选课表.课名(*);//有些学生可能还没有选课,但也可以输出学生的信息,只是“课名”值为空
(4)复合条件连接:where中有多个条件限制,可以自身连接和两表连接,连接两张以上的表时常用
select学生表.,导师表.
from学生表,导师表;
where学生表.导师编号=导师表.导师编号//基本连接
and学生表.年龄<25;//其它限制
and导师表.年龄>50;//其它限制
八、集合查询:只在两个查询块之间加一行就可以了
并操作union
交操作intersect
差操作minus
例:查询总分高于98,或年龄小于18岁的学生信息
select*
from学生表
where总分>98
union
select*
from学生表
where年龄<18;
*****向表写入数据*****:
如果数据是变量,那么单引号不要
第一种:添加整条记录
insert
into学生表
values('1002122','高高仔','男',23,'计算机应用');//没有条件语句,要和表一一对应,logical、datetime、char要加单引号
第二种:添加记录中的个别属性
insert
into学生表(,,专业)
values('1002122','高高仔','计算机应用');//指定数据与表的对应
第三种:从表中选出符合条件的记录,插
入到另一个表中
insert
into三好生表
values(,,专业)
select,,专业
from学生表
where平均分>95;
*****删除数据*****:
(1)删除一个记录
delete//一定是删除整行记录,所以没有列名
from学生表
where='001021';
(2)删除全部记录
delete
from学生表;
*****修改数据*****:
(1)单项简单修改:
update学生表
set='高高仔'
where='001'
(2)多项条件修改:
update学生表
set='高高仔',成绩=100,平均分=平均分+1
where='001'and年龄<30
*****提交和撤消表格*****:
commit表名//存储表格
rollback//撤消commit后的内容
-----------------------------------------------
索引:
用指针指向对应的数据,就像书的目录一样指向页数,能加快查询、有序输出和避免重复
一个表可以建立一个或多个索引,建立后就不用管它了,系统会自动选择合适的索引,用户不必也不能选择索引。
如果一个表的数据需要频繁增删,索引会频繁更新,所以索引要少一点。
createindex索引名
on表名(列名);//默认下是升序
createindex索引名
on表名(列名1asc,列名2desc);//列名1升序,列名2降序
建立唯一索引:一个索引值只对应一个记录
createuniqueindex索引名
on表名(列名);
删除索引:
dropindex索引名;//不必指明是哪一个表的索引
--------------------------------------------------
视图:
是一种虚表,不实际存在,不占空间。基本表的数据发生变化,视图中查询的数据也随之改变。
目的是在查询时隐蔽表中保密数据。
可以避免误删除,所以视图对数据的增加、删除和修改有限制。
建立视图:放在数据字典中。建好后可以像基本表一样查询,数据库系统会自动把对视图的查询转化为对基本表的查询
(1)简单的单表视图:
createview学生表视图//一般视图的列名省略,默认为select中和列名。
as//以下为子查询
select,,专业
from学生表
where年龄<22;//后面不允许含有orderby和distinct语句
(2)指定视图列名的多表视图:
createview学生表视图(,,出生年份)//自定义更合适视图列名、多表中有同名列、函数和列表达式,要与select一一对应地把视图列名写出。
as
select学生id,学生表.,2006-年龄
from学生表,导师表
where学生表.导师编号=导师表.导师编号
and专业='计算机';
(3)大多数据库操作系统不允许对视图表进行insert、delete、update操作。个别可以的话,必须在建立视图的最后一行加上:
withcheckoption
删除视图:如果此视图为父视图,那子视图也要
一一手动删除,不然操作子视图会出错
dropview学生视图表;
-----------------------------------------------------
备份和恢复:
BACKUPDATABASE数据库名TODISK='路径和文件名'WITHinit//备份数据库到文件。init指完全备份
RESTOREDATABASE数据库名FROMDISK='路径和文件名'WITHnorecovery//从文件中恢复数据库。norecovery指完全恢复
-----------------------------------------------------
授权和收回权限:
接受权限的用户可以是一个或多个,也可以是全体用户public
常见的权限:
数据库:createtab
(建立基本表,属主拥有对该表的一切操作权)
属性列:select,insert,update,delete,allprivileges
(查询)(查入)(修改)(删除)(前四种的总和)
视图:select,insert,update,delete,allprivileges
(查询)(查入)(修改)(删除)(前四种的总和)
基本表:select,insert,update,delete,alter,index,allprivileges
(查询)(查入)(修改)(删除)(改表)(索引)(前六种的总和)
授权:
例:给gaogaozai对学生表的select权限,且gaogaozai还可以把权限传播给别人
grantselect
ontable学生表
togaogaozai;
withgrantoption
例:给gaogaozai和linlin对两张表所有权限,不能再传播权限
grantallprivileges
ontable学生表,导师表
togaogaozai,linlin;
例:给所有人对学生表insert权限,不能再传播权限
grantinsert
ontable学生表
topublic;
收回权限:
例:收回gaogaozai对学生表中列的update权限
revokeupdate()//省略(),则表示对所有列
ontable学生表
fromgaogaozai;