内容过多,请看往期链接:
代码:
create database educ7
on primary
( name='view', -- 逻辑文件名
filename='e:\sql_data\view.mdf', --物理文件名
size=5mb, --数据库大小
maxsize=10mb, -- 最大可达
filegrowth=1% --增长方式 /或 filegrowth =1mb
)
log on
(name='view_log',
filename='e:\sql_data\view_log.ldf',
size=4mb,
maxsize=6mb,
filegrowth=1%
)
请看往期学习链接:
SQL中:check与 contriate语句约束的区别
代码:
use educ7 --使用数据库educ7, 否则到默认数据库,其中有表student则会冲突报错
create table student -- 创建学生表
( sno char(8) primary key, -- 主外键,默认不为空,不用写not null ; 单个主键这样写即可
sname char(8) not null,
ssex char(2) null
constraint ssex1 CHECK(ssex in ('男', '女')) default '男' , --创建constrain 约束,可自定义约束名
sage int null
check( sage between 18 and 20 ), --创建constrain 约束
sdept char(10) null
);
create table course --课程表
( cno char(2) primary key,
cname char(30) null,
credit int null,
cpno char(3) null
);
create table sc --选课表
( sno char(8) ,
cno char(2) ,
primary key(sno,cno), --- 多个主键写法
foreign key (sno) references student(sno), -- 外键 (外键列名 ) 参考 外键基表(即该外键所在的表为主键)
foreign key (cno) references course(cno),
grade int null
);
禁用/启用约束
-- 禁用约束
ALTER TABLE 项目表 NOCHECK CONSTRAINT FK__项目表__项目主管__2F10007B
-- 启用外键约束
ALTER TABLE 项目表 WITH CHECK CHECK CONSTRAINT FK__项目表__项目主管__2F10007B
作用:修改表结构,给表添加新的字段
例:
Alter table s --s为表名
add sname --sname 为字段名或列名
ALTER TABLE s --s为表名
DROP CONSTRAINT 外键约束名;
drop 删除表的命令
代码举例:
DROP TABLE s --从数据库中删除s表
注意点
int / null(空值) ,无需单引号
其他的 , 一般都用单引号 ( 若后续遇到例外, 再更新)
向表中添加数据
例:
insert into
student -- 若不写列名, 则默认为表中的的列名顺序、数量; 若仅指定添加某列数据, 例: student (sname, sage) 等
values --字段值,也仅仅出现一次
('95001','李勇','男',20,'CS'), -- 插入多条数据,用逗号,隔开
('95002','刘晨','女',19,'IS'),
('95003','王敏','女',18,'MA'),
('95004','张立','男',19,'IS'),
('95005','刘云云','女',18,'CS');
insert into
course
values
( '1','数据库', 4, 5),
( '2','数学', 6, null), --为空, 无需用单引号
('3','信息系统',3, 1),
('4','操作系统', 4, 6),
('5','数据结构', 4, 7),
('6','数据处理', 3, null),
('7' ,'PASCAL语言',4, 6);
insert into
sc
values
('95001', '2', 69),
('95001', '3', 88),
('95002', '2', 10),
('95003', '2', 10),
('95001', '1', 92),
('95004', '1', 58),
('95004', '2', 85);
从 from 表中删除一行数据
代码举例:
DELETE -- 只写delete
FROM student -- 要删除哪个表中的内容,删除删的是记录
WHERE age=20 --条件
功能:更新update 表
例:
UPDATE student -- 要更新哪个表中的内容
SET CLASS='95091' -- 设置set 字段名= 新的内容
WHERE CLASS='95101' --条件
查询过程
1.查询条件:
2.查询表:
3.查询列:
执行过程
正常情况下, 输入代码,计算机执行,我们都会;
然而重要的是: 你需要脑中想象自己手动查询并执行该表的操作,才能更好的掌握计算机SQL命令的执行过程;
基本查询语法:
select distinct 或 all 或 top 列名
from 表名
where 条件
group by 列名 having 条件
order by 列名 asc 或 desc
分为:
外层查询 与 内层查询
代码举例:
select * /* 查询所有列 ,此select为 外层查询 */
from student
where sno in
(
select sno /* 此select为内层查询 ,不可使用order by子句 */
from student
sno=1 or sno =2
)
内层查询 与 外层查询中:
where **列名1** < any
(
select **列名1**
from sc
where ssex=‘男’
)
列名一样
特点:
子查询的查询条件不依赖于父查询
过程:
由里向外逐层处理
即每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件。
技巧:
通常给的题目中,最后一个词 就是连接外查询与内查询的关键列名
代码举例1:
-- 查询与红星商店在同一地区的商店信息。
select *
from SHOP
where ShopAddress in
(
select ShopAddress
from SHOP
where ShopName='红星'
)
结果:

特点:
子查询的查询条件依赖于父查询
过程:
1.首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若where子句返回值为真,则取此元组放入结果表
2.再取外层表的下一个元组
3.重复这一过程,直至外层表全部检查完为止
查询的过程抽象为: 先外查询、再内查询、最后外查询
使用的谓词
1.in谓词 (专用于不相关子查询 )
问题:
为什么不用等号= ?
解:
等号=, 仅仅一个结果; 而in谓词,可在子查询中匹配多个结果
2.比较运算符
不等于:
!= 或 <>
结果:
true 或 false
3.exist / not exitst (专用于相关子查询 )
使用:
exists 存在true ,子查询中存在,结果:true
exists 存在true,子查询中不存在,结果:false
not exists 不存在false,子查询中存在true,结果:false
not exists 不存在false,子查询中不存在false,在结果:true
结果:
true 或 false
4.谓词: any(some)或all
any(some):
子查询中某个值
all:
子查询中所有值
使用条件: 列数相同,数据类型相同
功能:将两个表进行并集操作
中文: union, 联合
union 与 union all的区别:
UNION: 将多个查询结果合并起来时,系统自动去掉重复元组
UNION ALL: 将多个查询结果合并起来时,保留重复元组
例:
-- 结果 实则为 R 并(U) T 的结果,R/T为关系名
select *
from R
UNION
select *
from T
中文: intercept, 拦截
中文: except ; 除了,不包括
区别子查询:
子查询出现在 where 后
派生表的查询出现在 from 后
例1:
select 1
-- 从数据库中选择数字 1,通常用于检查查询是否成功或返回一个常量值。在某些情况下,它也可以用于返回一个虚拟的列。
结果:

对表中某列属性成组划分,一个列中按其属性可划分成多个组
或
按指定的一列或多列值分组,值相等的为一组
代码举例:
select sage as 年龄
from STUDENT
group by sage
having sage<19
原本表:

结果:

表2:

扩展:
sex 性别,可划分为:男、女 两组
以此类推:
上表
也可以按 sage 年龄分组,分为17、18、19三组
也可以按 sno 学号分组,分为95001、95002等等五组,但这样分就没有意义了
第二个就写聚集函数,那肯定和上面的group by有点关联了;
group by:
一般聚集函数 常与group by 连用;
若对查询结果group by 分组后,聚集函数将分别作用于每个组
distinct: 聚集函数中可使用distinct 去掉重复值,如count(distinct 列名)等
单独使用: 聚集函数也可按情况单独使用,不用group by分组
指定别名: 聚集函数后一般要指定别名, 如count(sno) 学生人数
例:
原表:

查询结果:

图2
计数,求表中行的个数
用法:
count(列名)
count(distinct 列名)
注意:
嵌套查询的子查询中不能使用order by子句
例:
select *
from student
where sno=1
order by 列名 desc,列名 asc
distinct:
中文意思:不同的;清楚的;有区别的
作用:去掉重复行
用法: select distinct 列名 或 聚集函数(distinct 列名)
判断是否为空值:
is not null
或
is null
由于某些原因不便写,或暂时没有的数据用该语句表示
like常与 百分号%、 下划线 _ 连用
例:
select GETDATE();
结果:

例1:
select GETDATE(), year(GETDATE() );
结果:

例2:
得到出生年份
select YEAR(GETDATE())- sage as 出生年份
from STUDENT
结果:

1.smalldatetime
设置浮点数、时间数据类型并仅仅保留年/月/日 时:分:秒(0:00:00)
请看往期文章:
索引的建立和删除
请看往期文章:
SQL server中内连接和外连接的区别、表达(多表连接)
—————————————————————
以上就是今日博客的全部内容了
创作不易,若对您有帮助,可否点赞、关注一二呢,感谢支持.