零、
select x from y where z
x输出条件: \(\color{#f00}{avg()}\) | \(\color{#f00}{min()}\) | \(\color{#f00}{max()}\) | \(\color{#f00}{sum()}\) | \(\color{#f00}{count()}\)
y表名: group by \(\color{#f00}{ \_ }\)(任意单个字符) | \(\color{#f00}{\%}\)(任意0个或多个字符) | \(\color{#f00}{[]}\)(括号内所列字符中的一个(类似与正则表达式))
z限制条件:
\(\color{#f00}{----}\)
- select x from y;x两种命名:... as 命名/命名=... | y的命名 ... a(随便字母) // --具体例子查看sql server 复习的连接查询
- 不等于三种形式: not | != | <>
- 连接: select ... from a表,b表 where a表.学号=b表.学号 --(where后更多表连接用 and)
一、数据类型
\(\color{#f00}{Int}\) | \(\color{#f00}{Float}\) | \(\color{#f00}{ Varchar(value)/Char }\) | \(\color{#f00}{ Date/dateTime }\)
char | varchar |
---|---|
是一种固定长度的类型,char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于M,MySQL就会在它的右边用空格字符补足.(在检索操作中那些填补出来的空格字符将被去掉) | 是一种可变长度的类型,varchar(M)类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为L+1字节). |
date | dateTime |
是SQL Server 2008新引进的数据类型。它表示一个日子,不包含时间部分,可以表示的日期范围从公元元年1月1日到9999年12月31日。只需要3个字节的存储空间 | 日期和时间部分,可以表示的日期范围从公元1753年1月1日00:00:00.000 到9999年12月31日23:59:59.997 ,精确到3.33 毫秒 ,它需要8个字节的存储空间 |
二、 order by ... desc/asc
order by score desc/asc -- desc(按倒序排序,即:从大到小排序) | asc(按正序排序,即:从小到大排序)
例:求1号课成绩大于80分的学生的学号及成绩,并按成绩由高到低列出。
select 学号,成绩 from 选课 where 课号="1" and 成绩>80 order by 成绩 desc
三、库
1. 库|表 : create | drop | alter 数据库create database 数据库名称 --(创建库,如下库名为stuDB)
drop database 数据库名称 --(删除库)
use 数据库名称 --(打开该库)
例:
create database stuDB
- 数据 insert into | delete from | update set | select | distinct(过滤掉多余的重复记录只保留一条,如select distinct 课号 from 必修)
四、表
①. 修改
alter table 表名 add/drop/alter (column) 修改的列 ( 字段 数据类型 列的特征 ) --column 为列(sql server 复习——六.1)
修改表结构例子:
- 为“课程1”表添加一个开课学期字段,字段类型为数值型,长度为1。
ALTER TABLE 课程1 ADD COLUMN 开课学期 N(1)
- 修改开课学期字段为字符型,合法值为1或2。
ALTER TABLE 课程1 ALTER COLUMN 开课学期 C(1) CHECK 开课学期="1" OR 开课学期="2"
- 删除“课程1”表中对开课学期字段的合法值约束,设置默认值为1。
ALTER TABLE 课程1 ALTER 开课学期 DROP CHECK
ALTER TABLE 课程1 ALTER 开课学期 SET DEFAULT "1"
- 删除“课程1”表中的开课学期字段。修改课程名字段为“课名”字段。
ALTER TABLE 课程1 DROP 开课学期 RENAME 课程名 TO 课名
- 在“学生1”表的“年龄”字段上建立候选索引。
ALTER TABLE 学生1 ADD UNIQUE 年龄 TAG 年龄
- 在“学生1”表中添加一个出生日期字段,删除年龄字段。
ALTER TABLE 学生1 ADD 出生日期 D ALTER TABLE 学生1 DROP UNIQUE TAG 年龄 DROP 年龄
②. 创建
create table 表名(
字段1 数据类型 列的特征, --列的特征:包括该列是是否为空(NULL)、是否是标识列(自动编号)、是否有默认值、是否为主键等
字段2 数据类型 列的特征,
)
例子:
create table stuMarks
(
ExamNo CHAR(7) NOT NULL identity(1,1), -- 考号 => 自动编号: 从1(第一个1)开始,每次添加的时候,自动加1(第二个1是说每次加1个)
stuNo CHAR(6) NOT NULL PRIMARY KEY , -- 学号 => 主键约束
writtenExam INT(3,2) NOT NULL, -- 笔试成绩 => INT(3,2)参数2为保留两位小数
LabExam INT NULL -- 机试成绩 => NULL 允许为空
)
五、约束(constraint)
主键与唯一: 对一个表来说主键只能一个,且字段不能为空,但唯一性约束可以有好几个,允许字段为空。alter table stuInfo
add constraint PK_stuNo primaty key ( stuNo ) -- 主键: primary key
alter table stuInfo
add constraint UQ_stuID unique ( stuID ) -- 唯一: unique
alter table stuInfo
add constraint DF_stuAddress
default (' 地址不详 ') for stuAddress -- 默认( 约束用于向列中插入默认值 ): default for
alter table stuInfo
add constraint CK_stuAge
check ( stuAge between 15 and 40) -- 检查( 约束用于限制列中的值的范围 ): check ( ... between ... and ...)
alter table stuMarks
add constraint FK_stuNo
foeign key ( stuNo ) references stuInfo ( stuNo ) -- 外键: foreign key (列名) references 引用外键表(列名)
GO
约束扩展 -- 检查约束 :
age int(3) check age>10 and age<45 error "年龄必须大于10小于45 " , --check. ... and ... error "": error是不在范围内提示的字符串
默认约束: admissionDate date default {`1991-1-1} --default: 字符串——"" 和当前的时间格式——{`0000-00-00}
外键约束:
create table 部门信息表(
部门号 char(10) primary key ,
)
create table 员工信息表(
员工的部门号 char(10) , --另一种方法: 员工的部门号 char(10) references 部门信息表
foreign key (员工的部门号) references 部门信息表(部门号)
)
删除约束条件:
alter table 表名
drop constraint 约束名
例:删除 stuInfo 表中地址 默认约束
alter tables stuInfo
drop constraint DF_stuAddress
③. 插入数据:
insert into table_name (列1, 列2,...) VALUES (值1, 值2,....)
视图view
inner join...on(内连接——内部连接的INNER短语可以省略)
select * from a inner join b on a.classno=b.classno b inner join c b.class=c.class
例1:
create view v_student
as
SELECT departname FROM Class INNER JOIN Department ON Class.DepartNo = Department.DepartNo INNER JOIN Student ON Class.ClassNo = Student.ClassNo
例2:
超连接
1、列出选修1号课的学生姓名及成绩。
SELECT 姓名,成绩 FROM 学生,选课 WHERE 学生.学号=选课.学号 AND 课号="1" -- 方法一:(使用简单连接查询格式)
SELECT 姓名,成绩 FROM 学生 INNER JOIN 选课 ON 学生.学号=选课.学号 WHERE 课号="1" -- 方法二:(使用内部连接格式)
T-SQL
declare @in int -- declare:声明 int:类型
set @in=(select count(*) as 信息技术类课程数量 from course where kind='信息技术') -- set:赋值
if @in>0
begin
select @in as 信息技术类课程数量 -- select:以表格形式输出 ,一条语句时可省略begin和end
end
else
print '没有此类课程' -- prin t:z直接返回结果
检索stucou表中同时选修了001及002课程的学生人数
select @num=count(*) from stucou where couno=‘002 ’ and stuno in (select stuno from stucou where couno=‘001’)
case(11.1)
语文=
case course.fame
where '语文' then score
trigger
CREATE TRIGGER UpdateWillNum ON StuCou
FOR INSERT, UPDATE, DELETE
instead of/for
AS
UPDATE Course SET WillNum=(SELECT COUNT(*) FROM StuCou WHERE CouNo=Course.CouNo)