(完整word版)SQL常用的增删改查语句、视屏笔记
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SQL:结构化查询语言,是国际化标准组织采纳的标准数据库语言
作用:数据库管理员可以用利用次语言操作数据库系统,即:SQL是一种能够被数据库系统读懂的操作语言。
T—SQL是微软公司针对SQL Server这种关系数据库所定义的一种SQL语言,用户可以完成Server数据库中的所有操作。
SQL的分类:
(1):数据定义语言,DDL
用来创建数据库和数据库中的各种对象
数据库中的对象包括:表、视图、索引、存储过程、触发器
DDL常用的命令包括:create、alter、drop
(2):数据操纵语言,DML
可以完成对数据库中数据的查询、更新、删除、插入的功能
DML常用的命令包括:select、update、delete、insert
(3)数据控制语言,DCL
DCL常用的命令包括:grant、revoke、deny
(4)数据类型
1、数字数据类型
a、整型数据类型:bigint、int、smallint、tinyint
b、浮点数据类型:float、real
c、固定精度数据类型:decimal、numeric
d、货币数据类型:money、smallmoney
将数据格式转换成字符串方法:STR(ID);---ID为数据类型,STR(ID)为字符串
2、字符数据类型:varchar、char、text、nchar、nvarchar、ntext
区别char和varchar数据类型:
char数据类型是存放固定长度的字符
Varchar数据类型是存放动态长度的字符
char(14),实际放入到数据库的字符长度为14个字符,如果实际存储的长度小于定义的长度,那么数据库会在次字符串后面加上3个空格
1、insert语句:
insert语句是属于SQL语言中的DML
作用:为表插入数据
你向一个表中插入一条新记录,但有一个字段没有提供数据。
在这种情况下,有下面的四种可能:
1、如果该字段有一个缺省值(默认值),该值会被使用。
2、如果该字段可以接受空值,而且没有缺省值,则会被插入空值。
3、如果该字段不能接受空值,而且没有缺省值,就会出现错误。
你会收到错误信息:
The column in table mytable may not be null.
4、如果该字段是一个标识字段,那么它会自动产生一个新值。
当你向一个有标识字段的表中插入新记录时,只要忽略该字段,标识字段会给自己赋一个新值。
使用INSERT语句可向文本型字段中插入数据。
但是,如果你需要输入很长的字符串,你应该使用WRITETEXT语句。
语法:insert into 表名(列名1,列名2,…..) values(值1,值2,….)
注意:(列名1,列名2,…..)可以不写,这样的话,插入的values(值1,值2,….)中的值必须包含表中的所有列,不然会报错。
把INSERT 语句与SELECT 语句结合起来,可以添加多个记录。
像这样:
代码:INSERT mytable (first_column,second_column)
SELECT another_first,another_second
FROM anothertable WHERE another_first=’Copy Me!’
这个语句从anothertable拷贝记录到mytable.只有表anothertable中字段another_first的值为’Copy Me!’的记录才被拷贝。
2、update语句它也是属于SQL语句中的DML, 可以修改表的数据,使用WHERE子句来选择更新特定的记录。
需要更新很长的字符串,应使用UPDATETEXT语句。
如果你不提供WHERE子句,表中的所有记录都将被更新。
语法:update 表名 set 列名1=值1,列名2=值2,……..[where 条件….] update student set sage=20 where sno=’s014’----修改一列
update student set sage=20,set ssex=’女’ where sno=’s014’
----修改多列逗号隔开
3、delete语句也是属于SQL语句中的DML
作用:可删除表中的一行或多行,在SQL SELECT 语句中可以使用的任何条件都可以在DELECT 语句的WHERE子句中使用。
删除应该表中的所有记录,应使用TRUNCATE TABLE语句。
语法:delete from 表名[where 条件….]
delete from student----删除表student中所有数据
delete from student where sno = ‘s014’----删除表student中编号是014的一行
delete from student where sno >= ‘s013’--删除表student中编号大于等于013的行
4、建立索引
Create INDEX index_name ON table_name (column_name)
说明:对某个表格建立索引后,数据库会对相应列进行自然排序,以增加查询时的速度。
4、基本查询技术:
数据库中提供一种可以将表中的数据查询出来的技术,称为select查询
select查询技术的基本语法格式
select [列名1,列名2,…..] | from 表名1,表名2
[where 条件]
[group by分组的列名]
[having聚合函数比较操作]
[order by 排序的列名]
(1)查询语句中的“*”号代表将表中的列全部显示出来
select * from student
(2)如果只想在查询中显示某一列用:
select sno sname sage from student
注意:“*”和列名只能够二选一,不能够同时出现
(3)在查询的时候可以为表或者列定义别名
A:为列定义别名
select sno as 学号 ,sname as 姓名 from student
或:select ‘学号’=sno, ‘姓名’=sname from student
B:为表定义别名
select sno sname sage ssex from student a
好处:当出现多张表联系起来作查询的时候,如果多张表中含有相同的列名的时候,为表定义别名使得查询比较方便
例如:想查询课程是由哪些老师就是讲授的。
从课程course表和老师teacher表中查找车tno列相同的数据
select cname, tname, from course a , teacher b
where a.tno = b.tno
(4)distinct关键字
此关键字是为了去掉列中重复的值, 对于所有重复的数据行在SELECT返回的结果集合中只保留一行。
select distinct sno from sc
(5)order by排序(默认升序)
语法:order by 列名[desc | asc]
desc:代表降序排列
asc 代表升序排列
select *from student order by sname
如果不写排序关键字,默认的是升序
select *from student order by sname desc
(6)where关键字使用
Where作为查询筛选结果的一个过程(非常重要)
语法:where 条件1[or | and] [条件2]…
条件1可以包括以下内容:
Where 列名1 <expression> 列名2 | 数值
(7)top n限制返回的行数
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT 时,说明n是表示一百分数,指定返回的行数等于总行数的百分之几。
例如:
代码:SELECT TOP 2 * FROM `testtable`
代码:SELECT TOP 20 PERCENT * FROM `testtable`
条件表达式分类:
1、比较条件:
(>:大于 <:小于 >=:大于等于 =<:小于等于 <>:不等于 =:登于)
例如:找学生年龄大于23岁的同学信息
select *from student where sage>23
2、逻辑条件
(and:与运算 or:或运算 not:非)
逻辑操作的用法:
Where 条件1<and | or | not>条件2
例如:查找课程编号大于’c002’的课程由哪些老师讲授
sSelect *from teacher ,course where teacher.tno = course.tno and o > ‘c002’
例如:查找选修了课程’c002’,或者成绩大于70的学生有哪些
select sname , sage , cno ,score from student a , sc b
where a.sno = b.sno and (cno=’c002’ or score>70)
例如:not关键字的使用:
select *from sc where score not between 70 and 80
3、in关键字
它是要求查询的结果在某几个值里面
select *from sc where score not in(70,90,80)
select *from course where cno in (‘c001’,’c002’,’c005’)
in还可以应用到子查询中
select *from sc where sno
in (select sno from student where sno >= ‘s002’)
4、like关键字
like是作为SQL模糊查询比较常用的一个技术,在like关键字使用中提出两
个比较特殊的符号
%:0个或多个任意字符
_:任意一个字符
例如:a、查找学生表中姓“陈”的同学
select * from student where sname like ‘陈%’
b、查询学生表中名字是三个字的学生信息
select * from student where sname like ‘___’----‘内三下
杠’
思考题:如果一个列中的内容含有下划线,要去用like来查找含有下划线的信息,该怎么做?
在SQL模糊查询中提供了一个escape(逃离、躲避、转移)关键字,它作为转义符使用
select *from student where sname like ‘%$_%’ escape ‘$’
“$”是定义的转移符号,那么在$符号后面的下划线不再是like中的特殊符
号,而是一个普通字符
5、all关键字
6、any关键字
7、between…and 关键字
5、聚合函数:只能对表中的数字类型进行计算,其他类型报错
max、min、count、avg、sum
max函数使用:select max(sage) from student----求学生表中最大的年龄
min函数使用:select min(sage) from student-----求学生表中最小的年龄
count函数使用:
select count (*)from student
select count (sno)from student
count(*):可以计算包含null列的记录数
count(列名):记录总记录数的时候,不去计算null值
avg函数的使用:select avg(sage) from student-----求学生表中的平均年龄
sum函数的使用:select sum(sage) from student-----求学生表中的年龄和
6、group by子句,它是一个分组函数,可以对某一列相同的值进行分组并求出相应的结果。
语法:
Select 列名1 [,列名2….] from 表名 group by 列名1[,列名2…]
例如:求学生表中男女生的总数
Select ssex ,count(ssex) from student group by ssex
例如:求不同老师总共讲授的课程的总数
A.两张表的查询teacher,course
B.对不同的老师进行一个分组
C.分组后求课程的总数
Select t.tno , tname , count(cno) from teacher t , course c
where t.tno = c.tno group by t.tno , tname
groyp by 执行原理、注意事项:
a.先根据group by 后的列名进行分组
b.然后根据count(列名)中的列名进行统计
c.group by子句经常和聚合函数一起使用
d.在使用group by的时候,如果查询的列没有包含在聚合函数中,那么该列一定要出现
在group by子句后面
7、having子句使用
having子句的作用非常重要,它是对聚合函数的值可以进行比较的操作。
Having 必须放在group by 子句的后面。
例如:查询讲两门课以上的老师信息
Select t.tno , tname , count(cno) from teacher t , course c
Where t.tno = c.tno group by t.tno , having count(cno) >=2
创建表的语法
creat table 表名(
列名_1 数据类型约束条件
列名_2 数据类型约束条件
……………………
)
注意:如果定义的表中有多个列,那么需要以英文逗号”,”隔开;
表名和列名不能是SQL语言中的关键字
Numeric(p,n)
P代表数字类型的精度,插入数据的的最大长度。
整数位多了会报错
n代表小数点后面的位数。
小数后的位数长度超过n为会四舍五入
creat table A_2(
a_no numeric(5,2) //最大长度为5位,小数点后为两位,
)
insert into A_2 (a_no) values (789.298) //789.30
insert into A_2 (a_no) values (7890.28) //报错
插入日期类型
creat table A_3(
a_date datatime
)
insert into A_3 values (‘2011-04-02’)
查询表:
select *from 表名
select *from A_2
1、SQL链接查询
含义:复杂的SQL查询是基于多张表以上的查询,就必须考虑多张表的连接查询
是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志。
SQL链接查询的分类:
等值链接外连接交叉链接
等值链接:
两个SQL语句:
第一个:select tname , cname from teacher t , course c where t.tno = c.tno
第二个:select tname , cname from teacher t inner join course c on t.tno=c.tno
查询学生所选的课程的分数,要求跟上学生的姓名:
select a.sno , sname , o , cname , score from student a
sc b , course c where a.sno = b.sno and o = o
注意:第二个SQL语句是SQL 92/SQL 99的写法,这种写法叫做连接查询中的内连接形式
外连接:包括:左外链接、右外连接、完全链接
外连接不只列出与连接条件相匹配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的数据行。
使用外连接需要一些关键字:
left outer join on (左外连接)
right outer join on (右外连接)
full outer join on (完全连接的写法)
例子:select *from 表1 left outer join 表2 on 表1.列名=表2.列名
creat table R(
a varchar(5)
b varchar(5)
c varchar(5) ) creat table S(
c varchar(5)
d varchar(5) )
left outer join的含义:除了满足查询条件的结果显示出来,还需将left outer join 左侧表中没有匹配的数据显示出来
外连接实战应用:
1、查询所有同学的学号、姓名、选课数、总成绩
如果没有选课的学生信息,是否也要打印出来作为统计数据
select a.sno , sname , count(cno) , sum(score)
from student a left outer join sc c
on a.sno = c.sno group by a.sno , sname
2、查询不同老师所教不同课程的平均分
select t.tno , tname , o , avg(score) from course c
left outer join sc on o = o group by o , t.tno , tname
right outer join的含义:除了满足查询条件的结果显示出来,还需将right outer join 右侧表中没有匹配的数据显示出来
1、查询所有同学的学号、姓名、选课数、总成绩
如果没有选课的学生信息,是否也要打印出来作为统计数据
select a.sno , sname , count(cno) , sum(score) from sc c
right outer join student a
on a.sno = c.sno group by a.sno , sname
2、查询不同老师所教不同课程的平均分
select t.tno , tname , o , avg(score) from sc
right outer join course c on o = o
group by o , t.tno , tname
full outer join的含义:就是左外连接和有外链接结果的和
select *from R full outer join on S on R.c = S.c 连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较
运算符、逻辑运算符等构成。
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接连接。
例如:
代码:SELECT p1.pub_id,p2.pub_id,p1.pr_info
FROM pub_info AS p1 INNER JOIN pub_info AS p2
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)(一)内连接
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。
SQL的子查询
1、where子查询
select cno , score from sc where score > (select avg (score) from sc)
where子查询后面的条件允许写select语句,那么这个限制条件(“>”符号)后的查询称为子查询。
2、from子查询
结构:select *from 表名1 , (select *from 表名2)
例如:查询每个学生的课程、成绩、总平均分
select cno , score , from sc,(select avg(score) as cc from sc)
b
where sc.
虚表命名为b,查询出来的平均分命名为cc
在from关键字后面出现的查询句子,我们可以让他单独的作为一张虚表。
3、in子查询
它是要求查询的结果在某几个值里面
select *from sc where score not in(70,90,80)
select *from course where cno in (‘c001’,’c002’,’c005’)
in还可以应用到子查询中
select *from sc where sno
in (select sno from student where sno >= ‘s002’)
4、any子查询
>any:大于最小的
<any:小于最大的
=any:就是关键字in的作用
select * | 列名1 , 列名 , 列名2….from 表名 where 列名 >any 比较条件(子查询) select * | 列名1 , 列名 , 列名2….from 表名 where 列名 <any 比较条件(子查询) select * | 列名1 , 列名 , 列名2….from 表名 where 列名 =any 比较条件(子查询) 例如:查询学生成绩大于70,且出去里面最小的学号
select distinct a.sno , sname from student a , sc b
where a.sno = b.sno and b.sno >70
and a.sno > any (select sno from sc where score > 70)
5、all子查询
语法格式:
select * | 列名1 , 列名 , 列名2….from 表名 where 列名 >all 比较条件(子查询) select * | 列名1 , 列名 , 列名2….from 表名 where 列名 <all 比较条件(子查询) select * | 列名1 , 列名 , 列名2….from 表名 where 列名 =all 比较条件(子查询) >all:大于子查询结果中最大的数据
<all:小于子查询结果中最小的数据
=all:没有任何数据
Select * from student where sno > all(select sno from sc where score >70)
6、嵌套子查询
7、exists子查询
允许查找特定条件的行,exists后面总是跟一个子查询,只要只查询返回了行,exists 的值就为true。
例:查询返回在任何一次考试中分数低于40分得学生studentID和姓名
select studentID , name from student s where exists
(select studentID from studentExam e Where mark<40 and e.studentID = s.studentID);
这里的基础是一个相关子查询返回分数低于40分得学生的studentID:
select studentID from studentExam e Where mark<40
对student表中的每一行只执行一次
and e.studentID = s.studentID
修改表:
修改表的时候一般有如下操作:
1、修改表中的数据类型
2、为表添加列
3、删除表中的列
4、为表添加约束
5、删除表的约束
第一种:为表添加列
alter table 表名 add 列名数据类型约束
alter table emp add e_address varchar(20) default’成都’ //声明后面插入的数据的地址默认为成都,即约束为成都
insert into emp (empno,ename,depno)
values (1004,’李明’,2)
select * from emp //查询emp表格中的数据
第二种:删除表中的列
Alter table 表名 drop column 列名
alter table emp drop column e_address
注意:
1、如果在删除表中列的时候,一定要注意此列是否含有约束对象。
如果有约束对
象,应先删除约束对象,再删除表中所对应的列。
2、删除表中的约束:
alter table 表名 drop constraint 约束名
alter table emp drop constraint DF_emp_e_address_00200768
3、删除约束的时候,约束名不要用单引号修饰。
第三种:修改表中列的数据类型
比如:增加varchar的长度
alter table 表名 alter column e_name varchar(25)
第四种:为表添加约束
作用:为了更好地保护数据库中数据的完整性,存储数据的一致性和正确性的一套机制。
alter table 表名 add constraint 约束名约束类型[约束表达式]
约束的分类:
在SQL Server2005中有6种约束:
主键约束(primary key constraint)
第1种主键约束定义:在创建表的时候定义主键约束:
Creat table A_1(
a_no int primary key,--此定义方式,系统会默认生成一个主键约束名称
a_name varchar(10)
)
--主键到底有什么用:
--1、一个列被定义成主键后,此列中的数据不能为NULL
--2、被定义成主键的列,其数据必须是唯一的
insert into A_1 values (1,’张三’)---第一个数字不能为null
insert into A_1 values (2,’李四’)---第一个数字不能和1重复
第2种主键约束的定义
creat table A_2(
a_no int ,
a_name varchar(10),
constraint PK_A_2 primary key (a_no)
)
第3种主键约束的定义
create table A_3(
a_no int,
a_name varchar(10)
)
---如果创建的表中某一列想定义为一个主键,
---必须满足一个前提条件,即该列不能为空
---如下:声明表A_3的a_no列不为空
alter table A_3 alter column a_no int not null
---如下:修改表A_3的a_no列为主键约束
alter table A_3 add constraint PK_A_3 primary key(a_no)
唯一性约束(unique constraint)
检查约束(check constraint)
如果要为表中的某一列定义一个规则,可以使用check约束。
例如:为表A的a_sex定义只能存放“男”或“女”
creat table A(
a_name varchar(10),
a_sex varchar(2) constraint ck_sex check(a_sex=’男’or a_sex=’女’)
)
insert into A (a_name,a_sex)
values (‘李四’,’女’)----true
values (‘李四’,’你’)---false
列约束实例:
creat table 会员(
No smallint not null constraint memberNoChk-----列约束是直接跟在后面
check(No between 1 and 10000),
name varchar(20) not null,
address varchar(60) not null
)
表约束实例:
creat table 我的会员(
No smallint not null,
name varchar(20) not null,
address varchar(60) not null,
constraint ChkmemberNo-----表约束是表的列写完后添加约束
check(No between 1 and 10000)
)
列约束与表约束的区别:列约束是直接跟在后面,而表约束则是表列项写完后添加约束外部键约束(foreign key constraint)
外键是指用于建立实体与实体之间关系,当添加、修改、删除数据的时候,他可以保持两张表的数据一致性。
外键就是针对表与表的关系确立而设置的。
作用:
1、当插入数据的时候,如果数据在父表中找不到,我们的外键就阻止你进行一个插入操作。
2、保持两张表的数据一致性
外键的创建方式:
-------如何建立外键,即外键到底建立在哪张表中才是正确的
-------1、确立表之间的子父关系
-------2、外键一定是建在子表中的,且该外键是父表中的主键的那一列。
-------3、在创建表的时候就可以添加外键:将子表某列和父表主键关联起来
alter table 子表 add constraint FK_C foreign key (子表某列) references 父表(父表主键)
方法1,创建表的时候就定义
例如:A和B表是一对多的关系,那么A表称为父表,B表称为子表。
为了体现子父关系,可以使用外键。
---emp,员工表
---dep,部门表
---员工表 VS 部门表===> n:1
Create table emp(---部门信息(子表)
empno int primary key,----员工编号
ename varchar(10),-----员工姓名
depno int foreign key references dep (depno)
)
create table dep(----部门信息(父表)
depno int primary key,----部门编号
dname varchar(10)---部门的名称
)
方法2,创建表的时候,自定义外键的名称
create table B(
b_no int primary key,
b_name varchar(10)
)
---B VS C 1:n
create table C(
c_no int primary key,
c_name varchar(10),
b_no int,
constraint FK_C foreign key (b_no) references B (b_no) )
方法3,创建外键约束的方法
create table B(
b_no int primary key,
b_name varchar(10)
)
create table C(
c_no int primary key,
c_name varchar(10),
b_no int,
)
alter table C add constraint FK_C foreign key (b_no) references B (b_no) 默认约束:dafault
Default可以为表在插入数据的时候,指定一个默认的值
creat table people(
p_id int primary key,
p_name varchar(20),
p_sex varchar(2) default ‘男’
constraint ck_people check (p_sex=’男’or 9_sex = ‘女’)-----检查约束
)
insert into people(p_id,p_name) values (1,’张三’)
空值(NULL)约束
1、完整性约束,包括:primary key、unique
完整性约束的基本语法格式:
[CONSTRAINT constraint_name(约束名)]<约束类型>,约束不指定名称时,系统会
给定一个名称
2、参照性约束,包括:foreign key
3、用户自定义约束,包括:check default
第五种:删除表中的约束
alter table 表名 drop constraint 约束名
alter table emp drop constraint DF_emp_e_address_00200768
删除表:
删除表的操作可使用:drop table 表名
在使用drop table 的时候,注意一点:如果有字符关系的表,且用了foreign key 进行约束,那么删除父表的时候,数据库会提示无法删除。
drop table people
日期函数:
A、获取当前系统时间
select getdate()
B、在当前系统时间上增加两天
第一种:select getdate()+2
第二种:使用dateadd()函数:它可以在向指定日期加上一段时间的基础上,返回
新的datetime值
语法结构:dateadd(datepart , number , date)
select dateadd(DD , 2 , getdate())----当前时间加两天;
其中:
datepart:对日期做怎样的增加,DD:天MM:月;YYYY:年;HH:小时
number:增加的量
date:日期类型的数据
C、对两个时间进行差值比较
datediff()函数
语法:datediff(datepart , start , end)
datepart:代表做差值的单位:年、月、日、时、分、秒
start:日期类型数据
end: 日期类型数据
select datediff (DD , getdate() , getdate()+5)
D、datepart:返回表示指定日期的某一部分
语法结构:datepart(datepart , date)
例如:返回当前系统的时间年份
select datepart(yyyy , getdate())----返回年份
除了datepart可以返回指定日期的某一部分,还可以用convert函数完成相应功能效果
convert()函数是把日期转换为新数据类型的通用函数
语法:convert(数据类型,要转换的数据,转换的格式)====》
convert (datatype,data,style)
例子1:当前日期格式转化为dd/mm/yy
select convert (varchar (10) , getdate() , 103)
例子2:当前日期格式转化为yyyy-mm-dd hh:mi:ss(24h)
select convert ( varchar (30) , getdate() , 120)
字符函数
1、len:求字符串长度
语法:len(字符串)
例子1、查询学生表中姓名的长度
select len(sname) , sname from student
例子2:查询学生姓名是3个字的信息
select *from student where len(sname) = 3
2、replace:字符串替换函数
语法:replace (‘String1’ , ‘String2’ , ‘String3’)
String1:要搜索的字符串表达式;String1可以是字符数据或二进制数据
String2:要查找的字符串表达式;String2可以是字符数据或二进制数据
String3:用于替换的字符串表达式;String3可以是字符数据或二进制数据
select replace(‘abcdefg’,’abc’,’$$$$$$$$’)----- $$$$$$$$defg
select sname replace(sname,sname,’###’) from student where len(sname)=3;
3、substring:求字符串子串函数
语法:substring(expression , start , length)
expression:是字符串、二进制字符串、文本、图像、列和包含列的表达式,不要
使用包含数据函数的表达式
start:指定字符串开始位置的整数,start可以为bigint类型
length:一个正整数,指定要返回的expression的字符数或字节数,如果length
为负。
则会返回错误,length可以是bigint类型
例子1:返回从学生学号第2个字符到最后字符的信息
Select sno , substring(sno , 2 , len(sno)) from student
4、upper:将字符串转换为大写
语法:upper(字符串)
例子:select upper(‘abcdef’)---- ABCDEF
5、lower:将字符串转换为小写
语法:lower(字符串)
例子:select lower(‘ABCDEF’)----abcdef
6、rtrim: 去掉字符串右边的空格
语法:rtrim(字符串)
例子:select rtrim(‘abcdef ’)+’d’--------abcdefd
7、ltrim: 去掉字符串左边的空格
语法:ltrim(字符串)
例子:select ’d’ + ltrim(‘ abcdef’) --------dabcdef
7、charindex:求字符串中某个字符在整个字符串中的位置
语法:charindex(expression1 , expression2 [,start_location])
参数解释:
expression1:代表要查找的子串
expression2:代表原串
Start_location:查找的起始位置
例子1:求’abc’中’a’在整个字符串中的位置
select charindex(‘a’ , ‘abc’)
例子2:从第2位开始查找,’a’在’abcabc’中出现的位置
select charindex(‘a’ , ‘abc’ , 2)
视图的创建方法
1、可视化创建方法(即在对象管理器中创建)
2、通过create view命令来创建视图
create view的语法格式:
create view<视图名> [(<视图属性列表(列名)>)]
[with encryption] as <子查询>[with check option]
with encryption: SQL Server对包含create view语句的文本进行加密
with check option:强制视图上执行的所有数据更新语句都必须符合子查询中where子句的条件
例子:创建能够查看每个老师所教的课程的视图
create view t_view as select cno , cname , t.tno , tname
from course s , teacher t where o = t.tno
视图是基于多张表导出的一张表
select * from t_view
基本视图的修改:
如果要让视图进行一个插入操作,有时会影响基本的数据,但需要注意一下几点内容:
1、基于一张表的视图,可以对试图进行修改、更新、删除数据,则插入的数据会影响
到基表
create view t_student as select sno,sname,ssex from student where sno>’s005’
对视图插入数据
insert into t_student values (‘s014’,’李晓波’,’男’)----会影响基
表
修改视图中的数据
update t_student set ssex=’女’ where sno = ‘s014’ ----会影响
基表
2、如果生成的视图包含聚合函数、其它函数、distinct、group by、order by、into;
不能插入、更新、删除数据
create view t_student as select sno , ssex , count(ssex) coun
from student group by sno , ssex
3、如果生成的视图是由两张表以上的查询生成,不能进行插入。
更新、删除数据。
Create view t_student as select a.sno , sname , o , cname
From student a, course b , sc c where a.sno = c.sno and o = o
4、如果生成的视图,含有with check option ,一定要满足查询条件(where的条件)
才能进行插入、更新、删除数据。
create view t_student as select sno , sname , sex
from student where sno<’s005’ with check option
insert into t_student values (‘s015’,’刘洋’,’女’)------报错sno
需小于s005才行
修改视图:
通过alter view 进行
例如:创建视图:
create view v_t4 as select *from teacher Where tno > ‘t004’with check option 查看已建视图创建脚本的命令
sp_helptext t_t4
会显示创建脚本:create view v_t4 as select *from teacher Where tno > ‘t004’with check option
修改上面的视图v_t4脚本为下:把with check option去掉
alter view v_t4 as select *from teacher where tno > ‘t004’
FROM子句
FROM子句指定SELECT语句查询及与查询相关的表或视图。
在FROM子句中最多可指定256个表或视图,它们之间用逗号分隔。
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列所属的表或视图。
例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应使用下面语句格式加以限定:
代码:SELECT username,citytable.cityid FROM usertable , citytable
WHERE usertable.cityid=citytable.cityid
在FROM子句中可用以下两种格式为表或视图指定别名:
代码:表名 as 别名
表名别名例如上面语句可用表的别名格式表示为:
代码:SELECT ‘username’, b.cityid FROM usertable a,citytable b
WHERE a.cityid=b.cityidSELECT
不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。
例如:
代码:SELECT a.au_fname+a.au_lname FROM authors a,titleauthor ta
(SELECT ‘title_id’,’title’ FROM ‘titles’
WHERE ‘ ytd_sales’>10000) AS t
WHERE a.au_id=ta.au_id AND ta.title_id=t.title_id
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。
UNION联合查询
UNION运算符可以将两个或两个以上的SELECT语句的查询结果集合合并成一个结果集合显示,即执行联合查询。
UNION的语法格式为:
代码:select_statement UNION [ALL] selectstatement
[UNION [ALL] selectstatement][…n]其中selectstatement为待联合的SELECT查询语句。
ALL选项表示将所有行合并到结果集合中,不考虑重复元素。
不指定该项时,被联合查询结果集合中的重复行将只保留一行。
联合查询时,查询结果的列标题为第一个查询语句的列标题。
因此,要定义列标题必须在第一个查询语句中定义。
要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。
在自动转换时,对于数值类型,系统将低精度的数据类型转换为高精度的数据类型。
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。
例如:查询1 UNION (查询2 UNION 查询3)
在集合中,两集合联合后将包含每个集合的数据成员,但每个数据成员只记录一次{1,2,3,4}intersect{3,4,5,6} ==={1,2,3,4,5,6}
交集:intersect返回交集
{1,2,3,4}intersect{3,4,5,6} ==={3,4}
差分:except返回不包含共同元素的集合
{1,2,3,4}except{3,4,5,6} ======{1,2,5,6}
二、数据类型:
smallint
16位元的整数。
interger
32位元的整数。
decimal(p,s)
p精确值和s大小的十进位整数,精确值p是指全部有几个数(digits)大小值,s是指小数点後有几位数。
如果没有特别指定,则系统会设为p=5; s=0
float
32位元的实数。
double
64位元的实数。
char(n)
n长度的字串,n不能超过254。
varchar(n)。