SQL
PK 主键约束 CK 检查约束 UQ 唯一约束 FK 完整性约束
表一(学员信息表StudInfo)
表二(科目表 Course)
表三(学员成绩表Score)
[( )] (下面用这种中括号和小括号一起括起来的是可以不写的) * (星号默认为全部)
插入数据(一行)
一.插入一行数据,如下:
Insert into 表名(列名1,列名2… / *)
Values(列值1,列值2…)
二.简单的查询语句,如下:
Select (列名1,列名2… / *) from 表名
插入数据(多行)
三.增加多行数据,如下:
Insert into 表名 [(列名)]
Select ’A’ , ’B’ union (A,B代表要插入的数据) Select ‘A’ , ‘B’ union Select ‘A’ ,’B’ union
…………
(如果不写列名则要把该表的内容全部一一对应的填上)
四.插入多行数据,如下:
(1.把源表数据查出来后插入到目标表中
2.注:目标表必须存在,此语句根据查询的记录自动创建该表,但无法创建相应的约束)
Select(列名 / * )from(目标表名)from(源表名) 插入多行数据的另一种方法:
(1. 把源表数据查出来后插入到目标表中 2.注:目标表必须是首先存在数据库中的) Insert into (目标表名)(列名)
Select (列名/ *) from 源表名
a. 先将studInfo表中的两列数据插入StudInfo_New表并创建该表: Select StudNo,StudName into studInfo_New from studInfo b. 在将studInfo表中同样两列数据插入已在的studInfo_New表。
Insert into StudInfo_New (StudNo,StudName)
select StudNo,StudName from studinto
更新(修改)
五.更新数据库中的记录(update),如下:
(更新的内容)
Update 表名 set 列名1 = 列值1,列名2 = 列值2
Where 更新的条件
(条件一般为 列名1=列值1 OR/AND 列名2=列值2) 实例一:
Update StudInfo set Sex=’男’, Age=’18’
Where StudName = ’张三’
(在带有‘张三’名称的那一行进行更新或修改)
实例二:
Update StudInfo Set Age = 25
Where StudName like ‘张%’
(在姓名列中带有‘张’字的就会被更新或修改) 实例三:
Update StudInfo set Age = 25
Where StudName like ‘张%’ AND Sex=’男’
(在姓名中带有‘张’字的并且性别为‘男’的行就会被更新或修改) 实例四:
1.把所有学生的C课程的成绩都提高5% Update Score set Score=Score*(1+0.05) where Course=’C’
2.把张三的成绩提高5%
Update Score set Score=Score*(1+0.05) where StudName=’张三’
3.把姓张的成绩提高5% (重点)
Update Score set Score=Score*(1+0.05)
From Score , StudInfo (这一步是要确认借用几个表(这里只需借用两个)) where Score.StudID=StudInfo.StudID and StudInfo.StudName like ‘张%’
删除
六.删除数据库中的记录
1. delete * from(目标表名) from (源表名)
2. delete from 表名 (删除所有记录) 3. trop table 表名
七.带条件删除记录
delete from 表名 where 条件 实例:
Delete from表名 where StudName=‘李四’ (删除了该表中名为‘李四’的记录)
查询
八.查询语句
Select * from 表名
(显示整个表)
Select * from 表名 where Sex=‘男’AND Age<25
(显示该表中性别为‘男’并且年龄小于‘25’的列)
Select StudName,StudNO from 表名 可以写入更多的列名
(显示该表中的StudName和StudNO 两列)
Select StudInfo.StudName , StudInfo.StudNO from StudInfo
(表名+‘ . ’+列名)
1. 查询中的 As 语句
a. 用 As 语句给列起别名(中文名称)
Select Sname As 学生姓名 , SNO As 学号 from StudInfo
(逗号必须为英文字母的逗号)
执行之前的结果如下: 执行之后的结果如下:
另一种给列起别名的方法:
Select 学号=SNO ,姓名=Sname from StudInfo
b. 用 As 语句给表起别名
Select Sname , SNO from StudInfo As s
(综合a、b两种写法: Select s.Sname As 学生姓名,s.SNO As 学号 from StudInfo As s)
C. As 是可以省略的
Select Sname 学生姓名,SNO 学号 from studInfo s
d.将多个列的数据组成一个列(同一个表)
Select 列名1+‘ ’+列名2 As 中文名称 from 表名 里面是一个空格
Select Sname+’ ’+SNO As 名称 ,Age As 年龄 from 表名 e. 查询 空列 和 非空列
非空列 空列 select * from 表名 where 列名 Is not null Is null select * from StudentInfo where Age Is not null 或 Is null
f. 给结果集添加常量列 添加了这个列
select ‘火云邪神’ As 状态 ,Sname As 名称 ,Age As 年龄
from studentInfo
g. 条件里面可以用表达式
select * from StudentInfo where Age+5>25
(在该表中所有的年龄都加上5 ,年龄加上5之后大于25的就显示出来)
h.查询结果的行数
只把该表的前两行给显示出来 Select top 2 * from studentInfo 表名 Select top 2 * from studentInfo where Sex=’男’
(就是只显示该表中两位姓别为‘男’的学生)
Select top 34 percent * from studentInfo
(例如:该表中有三行,34% 就是显示两行。该表有5行,50%就是显示三行)
2.排序(升序(ASC)和降序(DESC))
a. 学员成绩表按成绩升序排序
表名 列名
Select * from Score order by Score asc (默认也是升序) b.学员成绩表对Java成绩进行排序
Select * from Score where Course=’Java’ order by Score desc c. 按课程与成绩排序
Select * from Score order by Course desc,Score
d. 查 Java 前两名的成绩(降序)
Select top 2* from Score where Course=’Java’ order by Score desc e. 根据源表创建一个新表(不包括数据) Select top 0 * into StudentInfo_New from StudentInfo Select * into StudentInfo_New_1 from studentInfo where 1=2
3查询中的函数
字符串函数
格式 (从第几个数开始找) Select charindex(‘谁’ , ’你是谁’, 1 )
(从第二个参数的第一个数(也就是‘你’字)开始找第一个参数里的‘谁’字)
Select len(‘计算字符串的长度’)
(返回的结果数:8)
Select upper (‘把字符串转换为大写’) Select lower (‘把字符串转换为小写’) Select ltrim(‘ 清除左边的空格’)
Select rtrim(‘清除右边的空格 ’) (得到多少个字符) Select right (‘得到右边的三个字符’, 3 )
(得出的结果是: ’个字符’ )
Select left (‘得到左边的三个字符’, 3 ) (把‘钟’替换为‘中’) Select replace (‘替换一个字符串钟的字符’,‘钟’ ,‘中’)
(返回的结果是:‘替换一个字符串中的字符’)
Select stuff(‘删除指定字符串,并在该位置插入新的字符串’2,3,‘好的’)
(从第二个字开始数,长度为三(也就是’ 除指定’ 三个字)删除,并替换为‘好的’两个字)
日期函数
Select getdate( ) 重点
(返回结果是:今天的日期)
Select dateadd(month,4,’01/05/99’)
(返回的结果是:01/01/09 (也就是月份减去4))
Select datediff (mm,’日期1’,’日期2’) 重点
(返回的结果是:日期2减去日期1)
Select dateName(month,’日期’)
(返回的结果是:写出的日期是星期几)
Select datePart(day,’日期’) 重点
(返回的结果是:将日期转换为整形的)
数学函数
Select abs(-2) 求绝对值
Select ceiling(43.5) 取大于或等于指定数值,表达式的最小整数
输出的结果是(44)
Select floor(43.5) 取小于或等于指定数值,表达式的最大整数
输出的结果是(43)
Select power(5,2) 求幂(5的2次幂是25) Select round(23.2) 将数值表达式四舍五入为指定精度
Select sign(-43) 负数就返回(-1)正数就返回(1)零则返回(0) Select sqrt(9) 求平方根(9的平方根为 3) Select rand() 得到随机数
系统函数
Select Convert (varchar , 12345) 用来转换数据类型 (重点) Select datalength(‘中国A联盟’) 返回指定表达式的字节数
数据查询(二)
(比如说查询‘成绩’的个数) (用‘*’号表示计算所有的行数) (也可以说是‘统计数量’) 求记录数 select count(列名/ * )from 表名 求最大值 select max(列名) from 表名 求最小值 select min(列名) from 表名 求平均值 select avg(列名) from 表名 求总和 select sum(列名) from 表名 分组查询 group by 实例:
按姓名统计每个职员一共完成了多少笔销售业务
select tbemp.eName as 姓名,sum(tbSales.pQty)as 销售单from tbSales,tbemp where tbemp.eID = tbSales.eID
group by eName
只能和 group by语句使用的条件语句 having(只能加在group后面)
Where 和 having 的区别
Where 是先过滤源表, 先执行条件在分组(必须放在group by 的前面) Having 先分组在执行条件(必须放在 group by 的后面)
多表连接
(内连接) 方法一:
Select 表名1 . 列名,表名2 . 列名 。。。 from 表名1,表名2 Where 表名1 . ID = 表名2 . ID and 。。。 方法二:
Select 表名1 . 列名,表名2 . 列名 。。。 from 表名1(或表名2) Inner join 表名2(或表名1) On 表名1 . ID = 表名2 . ID (外连接)
1. 左外链接:left join 或 left outer join
SELECT StudInfo.StudName,Score.Course,Score.Score
FROM StudInfo LEFT JOIN Score (一般是主键表名) ON StudInfo.StudId = score.StudId (外键表名)
(即使表联接没有匹配的数据,左边的表数据,都会被查询出来,没匹配的数据填充NULL)
2. 交叉连接:cross left
SELECT Stud.StudName,Src.Course,Src.Score
FROM StudInfo Stud CROSS JOIN Score Src
不管有没有匹配的数据他都会显示出来,只是没有匹配的数据他都会用NULL填充
Use 数据库名称 Go
一.为表添加约束
--主键约束
alter table 表名 go
--设置标识列 alter table 表名 go
--默认约束
alter table 表名
add constraint 给约束起名称(如:DF_表名)
default 默认值for 字段名
go
--唯一约束
alter table 表名 go
--检查约束
alter table 表名 go
--外键约束
alter table 从表名 go
--删除约束
alter table 表名 go
drop constraint 约束名称
add constraint 给约束起名称(如:FK_从表明_主表名_主表字段) foreign key(从表字段) references 主表表名(主表字段) add constraint 给约束起名称(如:CK_表名)
check 字段名
add constraint 给约束起名称(如:UQ_表名)
unique 字段名
add constraint 给约束起名称(如:ID_表名) identity(1,1) 字段名
add constraint 给约束起名称(如:PK_表名)
primary key
字段名
--判断约束是否存在
if exists(select * from sys.sysobjects where name = '约束名称') go
alter table 表名
drop constraint 约束名称
二.数据库的安全管理
--为数据库添加登录用户和登录账号
exec sp_addlogin '登录用户','登录密码' go
--给刚创建的登录用户授予访问数据库的权力但是不给予访问表的权力 exec sp_grantdbaccess '账号名'
--授予登录用户有访问表的权力
grant insert\\select\\delete\\update on 表名to 登录用户名称
--禁用权限
deny insert\\select\\delete\\update 表名to 登录用户名称
--修改登录名称
alter login 登录名称with name = '新的登录名称'
--修改密码
alter login 登录名称with password = '新密码'
--同时修改登录名和密码
alter login 登录名称with name = '新的登录名称',password = '新密码'