创建库:
create database school --库名
on primary
(
name = 'school_dat', --逻辑名
filename = 'G:\school.mdf', --文件路径
size = 5, --初始大小
filegrowth = 10%, --文件增长大小
maxsize = 10 --文件最大大小
)
log on
(
name = 'school_log',
filename = 'G:\school.ldf',
size = 3,
filegrowth = 10%,
maxsize = 10
)
--删除库
drop database school
创建表
use school
create table Student
(
Sno char(5) not null unique, --非空、唯一
Sname nvarchar(20),
Sage int default 20, --默认值20
Sdept nvarchar(15),
-- Sgender char(1) default'男',
Sgender char(1) constraint c1 check(Sgender in ('男','女')), --指定约束名c1
-- Sgender char(1) check(Sgender in ('男','女')) 不指定约束名
Cno char(5),
constraint c2 primary key(Sno), --设置主键
constraint c3 foreign key(Cno) references Class(Cno) --设主外键
)
修改表
--添加新列
alter table student add S_entrance datetime
--修改数据类型
alter table student alter column S_entrance varchar
--添加唯一值约束条件
alter table classInfo add unique(cTitle)
--添加范围限制
alter table userInfo add constraint test1 check(birth_year > 2006 and birth_year < 2012)
alter table userInfo add constraint test1 check(birth_year between 2006 and 2012) --包含2006 2012
--删除名为c1的限制
alter table userInfo drop constraint c1
简单查询1
--求数学系学生学号、姓名
select sno, sname
from student
where Sdept = '数学系'
--求选修了课程的学生
select distinct sno --distinct消除取值相同的记录
from select_course
--求选修了C1课程的学生学号、成绩;按照成绩降序排列,成绩相同按学号升序排列
select sno, grade
from select_course
where cno = 'C1'
order by grade desc, sno asc --order by:按某种顺序显示。asc升序,desc降序
--求选修了C3且成绩在80到90分的学生学号及成绩,成绩以系数0.8输出
select sno, grade*0.8
from select_course
where cno = 'C3' and Grade between 80 and 90 --between and 查找值在指定范围内的元组
简单查询2(通配符)
--求数学系和计算机系里姓张的学生的信息
select *from student
where Sdept in('数学系','计算机系') and Sname like '张%'
--like:用于查找指定列中与匹配串常量匹配的元组
--_(下划线):匹配任意一个字符
--%(百分号):匹配0个或多个字符
--[]指定范围内的任意一个字符
--[^]不再指定范围内的任意一个字符
e.g:
like '%een' 返回以enn结尾
like '%en%' 返回包含en的任意字符
like '_en' 返回以en结束三个字符的字符串
like '[CK]%' 返回以C或K开始的任意字符串
like '[S-V]ing' 返回长度为四个字符,以ing结尾,开始是从C到V的字符串
like 'M[^c]%' 返回以M开始,第二个字符不是c的任意字符串
--查找对象名称为SQL_M开头,il结尾,中间有一个不确定字符的对象
select*
from objects
where object_name like 'SQL#_M_il' escape'#'
说明:这里使用了两个下划线符号,前一个由于有escape字符作标识,
因而被认为是实际存在的下划线符号字符;后一个没有此标识,故被作为通配符。
使用[]来将通配符指定为普通字符
SELECT *
FROM object
WHERE column1 LIKE '%54[%]%'
--它将返回所有包含54%的字符串。
--求缺少了成绩的学生学号及课程号
SELECT Sno,Cno
FROM 选课
WHERE Grade IS NULL;
简单查询3
--通过日期求年龄
select stu_id,stu_name
from student
where datediff(year,birthday,getdate())<30
--输出列明,获取日期年份
select stu_name as STUDENT_NAME, year(Birthday) as BIRTHDAY_YEAR
from student
--获取前百分十的元素
select top 10 percent stu_id, grade
from studentgrade
where course_id = 0511
order by grade desc
--分组求平均值
select stu_id, avg(grade) as '平均分'
from studentgrade
group by stu_id having avg(grade)>80
连接查询
select courseTeacher.course_id
from CourseTeacher, Teacher
where teacher.teac_id = courseTeacher.teac_id and teacher.teac_name like '艾%'
-- 等价的嵌套查询
select course_id
from courseteacher
where teac_id in
(select teac_id
from teacher
where teac_name like '艾%')
外部连接查询:
左外部连接(*=):
SELECT 职工.*,部门名称,电话
FROM 职工,部门
WHERE 职工.所在部门 *= 部门.部门号;
嵌套查询1:
--查询与刘晨在同一个系的学生
SELECT *
FROM 学生
WHERE sdept in --此处in可用 =(等号)代替
(SELECT sdept
FROM 学生
WHERE sname='刘晨')
--求选修了数据库的学生学号和姓名
SELECT sno,sname
FROM 学生 --通过学生学号查询信息
WHERE sno IN (SELECT sno --此处IN不能用=代替
FROM 选课 --通过课程号求选修了数据库的学生学号
WHERE cno IN (SELECT cno --此处IN可用=代替
FROM 课程 --先求出数据库的课程号
WHERE cname = ‘数据库’))
--连接查询来表达
SELECT 学生.Sno,Sname
FROM 学生,课程,选课
WHERE 学生.Sno = 选课.Sno AND 课程.Cno = 选课.Cno AND 课程.Cname = '数据库'
注:1、嵌套查询中,子查询不能使用 order by 子句
2、使用嵌套查询进行比较测试时,要求嵌套语句必须是返回单值的查询语句(>,<,=,>=,<=,!=或<>)
嵌套查询2(比较符与ANY/ALL,EXISTS):
--求C1课程的成绩高于刘晨的C1课程成绩的学生学号和成绩
SELECT sno,Grade
FROM 选课 --找出大于该成绩分数及学号
WHERE cno='C1' AND Grade > (SELECT Grade
FROM 选课 --通过学号找出该同学成绩
WHERE cno = 'C1' AND Sno =
(SELECT Sno
FROM 学生 --找出学号
WHERE sname='刘晨'))
--求其他系中比计算机系某一学生年龄小的学生
SELECT *
FROM 学生
WHERE Sage < ANY (SELECT Sage --找出计算机系学生年龄
FROM 学生
WHERE Sdept='计算机系') AND Sdept<>'计算机系';
--求其他系中比计算机系学生年龄都小的学生
SELECT *
FROM 学生
WHERE Sage < All (SELECT Sage
FROM 学生
WHERE Sdept='计算机系') AND Sdept<>'计算机系'; --非计算机系
--求没有选修C2课程的学生姓名
SELECT Sname
FROM 学生
WHERE NOT EXISTS (SELECT * --求选修了C2的去掉NOT
FROM 选课
WHERE 学生.Sno=Sno AND Cno='C2')
--查询选修了全部课程的学生的姓名
SELECT Sname
FROM 学生
WHERE NOT EXISTS (SELECT *
FROM 课程
WHERE NOT EXISTS (SELECT *
FROM 选课
WHERE 学生.Sno=Sno AND 课程.Cno=Cno))
函数查询(AVG、SUM、MIN、MAX、COUNT())
--求学生的总人数
SELECT COUNT (*)
FROM 学生;
--求选修了课程的学生人数
SELECT COUNT(DISTINCT Sno)
FROM 选课
--求课程和选修该课程的人数
SELECT cno,COUNT(sno)
FROM 选课
GROUP BY Cno
--求选修课超过3门课的学生学号
SELECT Sno
FROM 选课
GROUP BY Sno HAVING COUNT(*)>3
--求“C1”课程的平均成绩
SELECT Cno,AVG(Grade)
FROM 选课
WHERE Cno='C1'
GROUP BY Cno
--求学生“0101”的总成绩
SELECT SUM(ALL(Grade))
FROM 选课
WHERE Sno='0101'
--求学生“0101”的平均成绩
SELECT AVG(ALL(Grade))
FROM 选课
WHERE Sno='0101'
数据更新
--插入:
insert into <表名>(列名,列名...)
values(数据,数据)
--更新:
update <表名>
set ...
where ...
--删除:
delete
from <表名>
where ...