1、添加数据操作
(1)使用INSERT VALUES 语句插入数据
语法: INSERT INTO table_or_view (字段名1,...,字段名n)
VALUES (字段值1,...,字段值n)
注释: insert:插入 、 into:到什么里面去 、table_or_view: 用于指定向数据表中添加的表或试图的名称
字段名:是指该数据表中的列名 字段值:用于指定向数据插入的数据值
例如: insert into stuinfo (stuNo ,stuName,birthday,stuTel,stuAddress,className)
values ('13580901028' , '李文' , '90-03-17' , '2222273' , '广东珠海' ,'Y2T116');
insert into stuinfo (stuNo ,stuName,birthday,stuTel,stuAddress,className)
values ('27489301028' , '査小文' , '80-01-11' , '9322273' , '广东深圳' ,'Y1T146');
(2)使用INSERT SELECT 语句插入数据(该语句比INSERT语句效率高得多)
语法: INSERT table_name SELECT column_list FROM table_list WHERE sarch_condirions
例如:现在想要对学员信息表做一个备份,我们可以创建一张跟学员表结构一样的学员信息备份表,然后再从表中查 询出数据并插入到学员信息备份表中。
代码:CREATE TABLE StuInfo_bak (创建学生信息备份表)
(
StuNo varchar (12) not null ,
StuName varchar (12) not null ,
StuAge int ,
StuSex nchar (1) not null
check (StuSex='男' or StuSex='女'),
StuTel varchar (30) ,
StuAddress varchar (50) default ('地址不详'),
Birthday datetime ,
classname varchar (12)
)
---从Stuinfo表中查出记录直接插入Stuinfo_bak表中
---insert into StuInfo_bak select * from StuInfo
inert into StuInfo_bak ( StuNo ,StuName,StuAge,StuSex,StuTel,StuAddress,Birthday,classname)
select StuNo ,StuName,StuAge,StuSex,StuTel,StuAddress,Birthday,classname
from StuInfo
(3) 使用SELECT INTO 语句创建表
例如 :select StuNo ,StuName,StuAge,StuSex,StuTel,StuAddress,Birthday,classname
into stuInfo_bak
from StuInfo
----这样不仅创建了表stuinfo_bak,而且stuinfo表中的数据也一起插入stuinfo_bak表中去了。
2、更新数据操作
(1)UPDATE 语法
UPDATE <table name>
SET <colum>=<value> [,<colum>=<value>]
[WHERE <search condition>]
例如:将学员信息表中的学员的学号为"13540607014"的年龄改为38岁,可以使用如下更新语句。
但数据类型必须是数值型。
-----修改年龄38岁
update StuInfo
set stuage = 38
where stuno = '13540607014'
------查看这个学员的信息,看是否已改变
select * from StuInfo where stuno = '135340607104'
(2)修改年龄为实际年龄 ---datediff是指两日期差
update StuInfo set stuage = datediff( yyyy,birthday,GETDATE() ) ---GETDATE是指获取当前日期
select * from StuInfo
----修改年龄加一岁且电话号码前加"-"
update StuInfo set stuage = stuage+1 , StuTel = '0756-' + StuTel
----查看这个学员的信息,看看是否改变
select * from StuInfo
(3)根据其他表更新行
例如: 商品信息表和厂商信息表
update 商品信息
set 厂商编号=(select 厂商编号 FROM 厂商信息 where 厂商名称='牛牛集团')
where 商品名称 = '新版美国EML雅诗兰黛ANR特润眼部精华眼霜ML'
(4) 使用top表达式(可用top来限制update语句中修改的行数)
例如:某商场搞活动,需要随机抽取5件商品降低25%,就是说商品信息表中的随机5件商品价格降低25%
UPDATE TOP (5) 商品信息
SET 商品价格 = 商品价格*0.75
3、删除数据操作
(1)DELETE 语法
DELETE FROM <table name>
[WHERE <searh condition> ]
(2)使用DELETE 语句
----删除学员备份表所有数据
DELETE FROM Stuinfo_bak
----删除学员信息表中的地址为"珠海" 的所有信息
DELETE FROM stuinfo where stuAddress like '%珠海%'
----删除学员信息表中的20%的学员信息
DELETE TOP (20) PERCENT stuinfo
----删除学员信息表中前4行
DELETE TOP(4) stuinfo
(3)使用TRUNCATE TABLE 语句
----需要删除学员信息表中的所有数据
TRUNCATE TABLE stuinfo (注意,如有外键引用的表,不能用truncate来删除表数据
4、SELECT 简单查询
(1)查询全部行和列
语法:select {列举所有字段段名|*} from 表名
例如:-------先删除这张表中数据
delete from StuInfo
-------再从备份表中插入数据到学员表
insert into StuInfo select * from StuInfo_bak
-------查询全表
Select * from stuinfo ;
-------按字段 列表查询
Select stuNo , stuName ,stuAge ,stuSex ,stuTel,stuAddress from stuinfo ;
(2)查询全部行全部列
语法:select column1 , column2 ... from 表名
例如:Select stuNo , stuName from stuinfo ;
Select stuName, stuTel ,stuAddress from stuinfo ;
(3)查询部分行和全部列
语法:select 所有字段名 from表名 where查询条件语句集合
例如:-------查询手机号码是1380013800的学员的所有资料
Select * from stuinfo where stuTel= '1380013800'
-------查询姓名为李志锋的学员的所有资料
Select * from stuinfo where stuname='刘志峰'
(where字句中的条件可以是多个,多个条件之间可用 or 或 and)
--------查询手机号以139开头的珠海的学员的所有资料
Select stuNo,stuName,stuAge,stuSex,stuTel,stuAddress from stuinfo
where stuTel like '139' and stuAddress like '%珠海%'
(4)查询部分行部分列
语法:select 部分字段名 from 表名 where查询条件语句集合
例如:-------查询手机号以139开头的珠海的学员的学号、姓名与具体地址
Select stuno ,stuName ,stuAddress from StuInfo
where stuTel like '139%' and stuAddress like '%珠海%'
(5)添加top n 查询顶部几条记录
语法:Select top n 部分字段名 from 表名
例如:------查询手机号以139开头的珠海的前3个学员的学号、姓名、地址
Select top 3 stuNo ,stuName , stuAddress from Stuinfo
where stuNo like '139%'
and stuAddress like '%珠海%’
(6)添加top n percent 查询百分比的记录
语法:Select top 10 percent 部分字段名|所有字段名 from 表名
例如:------查询手机号以139开头的珠海的学员的学号、姓名、地址显示前10%的记录
select top 10 percent stuno ,stuName ,stuAddress from StuInfo
where stuTel like '139%'
and stuAddress like '%珠海%'
(7)使用+号并列查询
语法:select 字段名m + 字段名 n , 其他字段名 from 表名
例如:-----查询手机号以139开头的珠海的学员的学号、姓名、地址,出生日期
select stuNo ,stuName + '(+stuAddress+')' , birthday from stunifo
where stuTel like '139%'
and stuAddress like '%珠海%'
(8)查询中使用as以别名显示字段名
语法:select字段名m + 字段名n as 别名 ,其他字段名 from表名
例如:-----查询手机号以139开头的珠海的学员的学号、姓名、地址,出生日期
select stuNo ,stuName + '(+stuAddress+')'as fullName , birthday from stunifo
where stuTel like '139%'
and stuAddress like '%珠海%'
(9)查询中使用=号代替as的用途
课堂案例:
----------查询姓张的学员
select * from student where studentName like '张%’
----------查询教员登录名最后一位为6教员信息
select * from teacher where loginId like '%6'
----------查询教员的编号在6-10之间
select * from teacher where techerId between 6 and 10
----------查询教员的登录名倒数第二个字符为2的教员信息
select * from teacher where loginId like '%2_'
----------在stuInfo表中添加一条记录,指定每一列
insert into stuinfo (stuNo,stuName,stuSex,stuAge,stuAddress)
values ('1005' , '王五' , '男’,'23' ,'广东珠海' )
----------在stuInfo表中添加一条记录,指定部分列
insert into stuinfo (stuNo,stuName, stuSex)
values ('1005' , '王五' , '男’)
----------在成绩表一次性添加多条记录
insert into stuMarks
select '1004', 50 ,70.5 union
select '1005', 74 , 83 union
select '1006', 99 , 81
----------数据表的备份
select * from infobak
----------对信息表stuInfo备份到一个新表InfoBak
select * into InfoBak from stuInfo
select * from stuMarks
select * from marksBak
----------备份成绩表的结构
selecet into marksbak--新表
from sruMarks
where 1=2
----------将成绩表中的记录添加成绩备份表中
inset into marksbak
select stuNo , writeEaxm from stumark
----------将学号为1005的笔试成绩加4分
select * from stuMarks
update stuMarks set writeEaxm = writeEaxm - 4
where stuNo = 1005
----------对所有学员的机试和笔试均加5分
update stuMarks
set writeExam = writEaxm+5 ,labEaxm = labEaxm+5
update stuMarks
set writeEaxm=100
where writeEaxm >= 95
update stuMarks
set writeEaxm=writeEaxm+5
where writeEaxm<95
update stuMarks
set labExam=100
where labExam>=95
update stuMarks
set labExam=labExam+5
where labExam<95
---------删除infobak表中的所有记录
方法1:delete from InfoBak
方法2:truncate table infobak
---------将信息表中的记录添加infoBak表中
insert into InfoBak
select * from stuInfo
---------删除年龄为空的记录
delete from InfoBak
where stuAge is null
--------删除信息表中的所有记录
truncate table stuinfo
select * from stuInfo
select * from stumarks
delete from stuInfo
where stuNo=1004
delete from stuMarks
where stuNo=1004
use MySchool
--------查看学员表中前10%条记录
select top 10 percent * from student
--------添加测试记录
insert into Emp
select '三','张' union
select '比尔','盖茨' union
select '拉里','艾里森' union
select '四','李'
select * from Emp
select id,姓名=lastName+firstName from emp
select id,firstName+lastName as 姓名 from emp
-------查看成绩表的总成绩,要求每列汉化
select 考号=examNo,学号=stuno,
笔试成绩=writeExam,机试成绩=labExam,
writeExam+LabExam as 总成绩
from stumarks
--------查询教员表中登录名最后一位为1-4的教员信息
--方法1:
select * from Teacher
where LoginId like '%[1-4]'
--方法2
select * from Teacher
where LoginId like '%[1234]'
--方法3
select * from Teacher
where LoginId like '%[^5-9,0]'
-------身份证的约束
if exists(select * from sys.tables
where name='stu')
drop table stu
go
create table stu
(
id int identity(100001,1) primary key,sName varchar(50),
sId char(18)
)
------给身份证添一个约束
if exists(select * from sys.objects
where name='stuSid')
alter table stu
drop constraint stuSid
go
alter table stu
add constraint stuSid
check(sid like '[1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]
[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9,X,x]')
insert into stu
select '段平','421023198910242499' union
select '刘汶兵','360732199405184912'
------按教员的年龄升序排列
select * from teacher
order by birthday desc
-----按教员的姓名升序排列
select * from teacher
order by teacherName asc
------五个聚全函数
--Sum :求和
--Avg :平均值
--Count: 计数
--Max :最大值
--Min :最小值
select * from Student
-----统计每一个班的学员人数
select classId,班级人数=COUNT(*)
from student
group by classId
------查询最高笔试成绩,最高机试成绩
select 最高笔试成绩=MAX(writeExam),
最高机试成绩=MAX(labExam) from stumarks
-----显示笔试平均成绩,机试总成绩
select 笔试平均成绩=AVG(writeEXam),
机试总成绩=SUM(labExam) from stuMarks
------显示成绩表中第一名总成绩
select top 1 *,writeExam+labExam from stumarks
order by writeExam+labExam desc
select max(writeExam+labExam) from stumarks
select * from stuinfo
--显示信息表中男女的平均年龄,并且平均年龄在20岁以上
select stuSex,AVG(stuAge) from stuInfo
----where stuAge>=19
group by stuSex
having AVG(stuAge)>=19
1、使用from语句
例如: 对数据库中的" stuinfo " 表进行简单查询,并对"stuInfo"表定义别名为"s"
语法: Select * From StuInfo AS s
2、使用WHERE子句
在SELECT 查询语句中,使用WHERE 子句时
一般语法结构为:SELECT condition FROM table WHERE searchcondition
注释:searchcondition 是指为用户选取所需要查询的数据行的条件,既查询返回的记录的满足条件。
对用户所需要的所有行,search_condition 条件为true;而对其他行,search_condition条件为false
(1)比较运算符( =、< 、> 、>=、 <= 、<>和!=(<>和!=都表示不等于) )
例如:在"student"数据库"stuinfo"表示查询学号为'13540607014'的‘学员姓名’、‘出生日期’以及‘地址’
eg1: SELECT stuNo,stuName,birthday,stuAddress
FROM stuinfo
WHERE stuNo = '13540607014'
例如:查询"学员信息" 表中"年龄"小于30岁的‘学员姓名’、‘出生日期’以及‘地址’
eg2: SELECT stuNo,stuName,birthday,stuAddress
FROM stuinfo
WHERE stuage<30
例如:查询"学员信息" 表中"年龄"不等于30岁的‘学员姓名’、‘出生日期’以及‘地址’
eg3: SELECT stuNo,stuName,birthday,stuAddress
FROM stuinfo
WHERE stuage<>30
(2)逻辑运算符
例如:在"student"数据库查询"学员信息"表中年龄>=20,且<=30的‘学员姓名’、‘出生日期’以及‘地址’
eg1: USE student
SELECT stuNo,stuName,birthday,stuAddress
FROM stuinfo
WHERE stuage>=20 and stuage<= 30
eg2: USE student
SELECT stuNo,stuName,birthday,stuAddress
FROM stuinfo
WHERE stuAddress='珠海' and (stuage>=20 or stuage<= 30 )
(3)使用IN条件
语法:WHERE expression [NOT] IN value_list
注释:value_list是指列表值 , 当值不止一个时需要将这些值用括号括起来,各列表值之间使用逗号隔开。
例如:在"学员信息"表中查询 '学号' 为'2345'、'6786'、'5543'、'9876'的'学员姓名'、'出生日期’以及‘地址’
eg1: USE student
SELECT stuNo,stuName,birthday,stuAddress
FROM stuinfo
WHERE stuno in ('2345'、'6786'、'5543'、'9876')
(4)使用BETWEEN条件
语法:WHERE expression [NOT] BETWEEN values1 AND values2
例如:在"student"数据库查询"学员信息"表中年龄>=20,且<=30的‘学员姓名’、‘出生日期’以及‘地址’
eg1: USE student
SELECT stuNo,stuName,birthday,stuAddress
FROM stuinfo
WHERE stuage between 20 and 30
例如:想要查询"年龄"在20至30以外的所有数据
eg2: USE student
SELECT stuNo,stuName,birthday,stuAddress
FROM stuinfo
WHERE stuage not between 20 and 30
(5)使用LIKRE匹配条件
语法:WHERE expression [NOT] LIKE 'string '
例如:在"学员信息"表中查询'地址为'珠海'的'学员姓名'、'出生日期’'年龄'以及‘地址’
eg: USE student
SELECT stuNo,stuName,birthday,stuAddress
FROM stuinfo
WHERE stuAddress like '%珠海%'
(6)使用IS NULL条件
语法:WHERE column IS [NOT] NULL
例如:在"学员信息"表中查询'出生日期’为NULL的学员信息
eg: USE student
SELECT stuNo,stuName,birthday,stuAddress
FROM stuinfo
WHERE birthday is null
3、使用ORDER BY 子句
(1)语法:ORDER BY order_expression [ASC|DESC]
注释:order_expression表示用于排序列或列的别名及表达式。 ASC是指升序。DESC是指降序。
例如:将‘STUDENT’数据库的"学员信息"表按照'年龄'进行升序排序
eg:USE student
SELECT * FROM stuinfo
ORDER BY stuAge ASC
(2)例如:对学员信息表中的数据查询是先按“性别”进行升序,如果“性别”列中有相同的数据,那么在按“年龄”进行升序 。
语法:SELECT * FROM stuinfo ORDER BY stuSex ASC , stuAge DESC
4、使用GROUP BY 子句
语法:GROUP BY group_by_expression [WITH ROLLUP | CUBE ]
注释:group_by_expression 表示分组所依据的列,ROLLUP 表示只返回第一个分组条件指定的列统计行,若改变列的 顺序就会使返回的结果行数据发生变化。CUBE是ROLLUP 的扩展,表示除了返回由GROU BY 子句指定的列外,还 返回按组统计的行。
例如:要在学员信息表中按照"出生日期"查询出对应每年出生的统计人数
eg: USE STUDENT
selcet YEAR (birthday) year , COUNT (*)as amount
from Stuinfo
group by YEAR (birthday)
5、使用HAVING子句
语法:HAVING search_conditions
注释:search_conditions是指查询所需要的条件,即返回查询结果的满足条件。
eg : USE STUDENT
selcet YEAR (birthday) year , COUNT (*)as amount
from Stuinfo
group by YEAR (birthday)
having count(*)>3
6、高级查询
(1)基本连接
用户再进行基本连接操作时,要遵循的原则
*SELECT 子句列表中,每个目标列前面都要加上基表名称
*FROM 子句应包括所有使用的基表
*WHERE 子句应定义一个同等连接
例如:“STUNDENT”数据库中"学员信息"表和"考试信息"表,都包含了"学号"列,根据该列在WHERE子句中建立同等
连接查询年龄小30岁的学员的学号、姓名、性别、出生日期、机试成绩、笔试成绩。
eg: --------为查询方便,先向考试成绩表exam插入考试成绩数据
--------插入成绩表
insert into Exam values ( '1354865466' , 95 ,56 );
insert into Exam values ( '1324860446' , 65 ,76 );
insert into Exam values ( '1664865876' , 92 ,96 );
insert into Exam values ( '1355332546' , 85 ,76 );
select s.stuno ,s.stuName , s.studSex , s.birthday,s.Written , e.Lab
from StuInfo s , Exam e
where s.stuno = e.stuno
and stuAge<30
(2)JOIN 关键字
语法:SELECT select_list
FROM table join_type JOIN table2 [ON join_conditions]
[WHERE search_conditions]
[ORDER BY order_expression]
注释:Table1与table2为基表; join_type指定连接类型,join_conditions指定连接条件
例如:“student”数据库中"学员信息"表和"考试信息"表,都包含了"学号" 列,可用join关键字将两表建立连接
eg : USE student
select s.stuno ,stuName ,studSex , birthday,s.Written , e.Lab
from StuInfo s , Exam e
on s.stuno = e.stuno
and stuAge<30
(3)内连接
1*、等值连接语法:
SELECT select_list
FROM table INNER JOIN table2 [ON join_conditions]
[WHERE search_conditions]
[ORDER BY order_expression]
eg : USE student
select s.stuno ,stuName ,studSex , birthday,s.Written , e.Lab
from StuInfo s join Exam e
on s.stuno = e.stuno
where stuAge<30
order by s.birthday
2*、非等值连接
例如:在"学员信息"表和"考试信息"表中查询学员的学号、姓名、性别、出生日期、机试成绩、笔试成绩,
同时要求学员的年龄在20-30岁之间的学员信息。
eg: USE student
select s.stuno ,stuName ,studSex , birthday,s.Written , e.Lab
from StuInfo s join Exam e
on s.stuno = e.stuno
and s.stuAge between 20 and 30
order by s.birthday
3*、自然连接
例如:基于表"学员信息"表和"考试成绩"创建一个自然连接查询,限定条件为两个基表中的学员编号,在结果集中显 示学号、姓名、年龄、出生日期、笔试成绩、机试成绩。
eg: USE student
select s.stuno ,stuName ,studSex , birthday,s.Written , e.Lab
from StuInfo s inner join Exam e
on s.stuno = e.stuno
where stuAge<30
order by s.birthday
7、外连接
8、使用子查询
(1)返回多行子查询
1、使用in关键字
语法:SELECT select_list
FROM table_courcde
WHERE expression IN/NOT IN (subquery)
注释:subquery表示子查询,括号外围的查询结果作为限定条件,进行查询。
eg: USE student
SELECT * FROM stuInfo
WHERE stuno IN (select stuno from exam where Written >=60 and Lab>=60 )
2、使用EXISTS关键字
语法: SELECT select_list
FROM table_courcde
WHERE EXISTS/NOT EXISTS (subquery)
例如:以上面案例为例,查询没有考试成绩的学员信息
eg: USE student
SELECT * FROM stuInfo s
WHERE NOT EXISTS (select stuno from exam e where e.stuno=s.stuno )
3、比较运算符
语法:SELECT select_list
FROM table_courcde
WHERE expression operator [ANY|ALL|SOME](subquery)
注释: operator指运算符 , ANY|ALL|SOME 比较的关键字
eg: USE student
SELECT * FROM stuInfo s
WHERE stuno=ANY
(select stuno from exam e where Written >=60 and Lab>=60 )
(2)返回单行的子查询
语法: SELECT select_list
FROM table_courcde
WHERE expression operator (subquery)
eg: USE student
SELECT * FROM stuInfo s
WHERE stuno=ANY
(select stuno from exam e where examno=10 )
(3)嵌套子查询
语法:eg:USE student
SELECT * FROM stuinfo
WHERE stuno IN (select stuno from exam e where Written >=60 and Lab>=60 )