Ⅰ.定义关系模式
1.1 使用CREATE TABLE
定义关系模式
[https://img.codelin.xyz/blog/20191118/4fGylQ5fRFHX.JPG]
nchar
中的n代表Unicode编码
1.2 定义主键约束
1.3 定义唯一值约束
- UNIQUE约束:在该列的取值必须唯一,但可以取空值
- PRIMARY KEY约束:在该列的取值必须唯一,不能取空值
1.4 定义空值约束
1.5 基于属性的CHECK约束
CHECK约束时当该属性获得新值时被检查
CHECK(gender = 'F' OR gender ='M')也可以
或者最后写约束
1.6 基于元组的CHECK约束
与属性相似
1.7 设置默认值
一行最后加入DEFAULT '...'
比如
gender CHAR(1) DEFAULT 'M'
当不赋予gender值时默认为M
1.8 修改关系模式
-
使用
DROP TABLE
语句删除关系模式DROP TABLE MovieStars
表示从数据库模式中删除MovieStars模式,包括里面的元组也一起删除。 -
使用
ALTER TABLE
语句更改关系模式-
使用
ADD
子句添加属性和约束ALTER TABLE MovieStars ADD mobile NCHAR(11) DEFALUT 'unlisted';
\ -
使用
DROP
子句删除属性和约束ALTER TABLE MovieStars DROP mobile;
-
Ⅱ.简单查询
SELECT-FROM-WHERE查询语句
- FROM子句:查询所引用的关系。
- WHERE子句:表达查询满足条件的元组。
- SELECT子句:关系中满足条件的属性在结果中显示出来。
例:查找Disney公司,在2019年制作的所有电影的有关信息。
SELECT *
FROM Movies
WHERE studioName = 'Disney' AND year = 2019
投影
例:查找Disney公式,在2019年制作的所有电影的片名和影片长度。
SELECT title AS name, length duration --AS 或者 空格可重命名
FROM Movies
WHERE studioName = 'Disney' AND year = 2019
也可用表达式取代属性:
SELECT title name, length/60.0 lengthinHours --用表达式表示 .0表示结果为小数
FROM Movies
WHERE studioName = 'Disney' AND year = 2019
WHERE子句(选择操作)
表达查询满足条件的元组
运算符/关键字:
- 比较 =,>,<,>=,<=,<>,!>,!<
- 确定范围 [NOT] BETWEEN...AND...
- 确定集合 [NOT] IN
- 字符匹配 [NOT] LIKE
- 空值 IS [NOT] NULL
- 逻辑 AND OR NOT
- 串的拼接 +
例:查找Disney公司,在2015年和2019年之间制作的所有电影片名和影片长度。
SELECT title,length
FROM Movies
WHERE studioName = 'Disney' AND year BETWEEN 2015 AND 2019
--BETWEEN 2015 AND 2019相当于
year >=2015 AND year <= 2019
--也等于集合形式
year in (2015,2016,2017,2018,2019)
- 日期的格式:'yyyy-mm-dd','mm/dd/yyyy'
- 时间的格式:"hh:mm:ss.ssss"
- 日期时间的格式:'yyyy-mm-dd hh:mm:ss.ssss'
--例:查询1990年以后出生的男演员
SELECT name
FROM MovieStars
WHERE birthdate >= '1990-01-01' AND gender = 'M'
--例:查询1980年到1990年间出生的男演员
SELECT name
FROM MovieStars
WHERE gender = 'M' AND
birthdata >= '1980-01-01' AND birthdata < '1991-01-01'
/*不要写成birthdate BETWEEN '1980-01-01' AND '1990-12-31'
或者birthdata >= '1980-01-01' AND < '1991-01-01'*/
输出排序
-
对查询结果的元组以某种顺序表示
ORDER BY
属性列表ASC/DESC
,前者表示升序,后者表示降序- 排序实在
FROM
、WHERE
等子句的结果上进行的,排序之后再执行SELECT
子句 - 排序列可以是表达式:
ORDER BY A+B DESC
- 排序默认升序
ASC
,也可以指定按降序DESC
排序
- 排序实在
--例:查询Disney公司2019年拍摄的影片信息,以片长的升序排列,同样片长的,以片名字母的降序排列
SELECT *
FROM Movies
WHERE studioName = 'Disney' AND year = 2019
ORDER BY length, title DESC
Ⅲ. 字符串的比较
-
按字典顺序和字母表顺序从前往后
'fodder' < 'foo'
'bar' < 'bargin'
-
字符串匹配
s LIKE p
s是字符串,p是通配符表示的模式,有:- % 任意长度为n的字符串
- _ 单个字符
- [ ] 指定范围内的任意单个字符
- [^] 不在指定范围内的任意单个字符
字符串模糊匹配
/*带通配符_的模糊匹配
例1:查找片名“以Star开头,后面的单词是四个字符”的电影名称。*/
SELECT title
FROM Movies
WHERE title LIKE 'STAR____';
/*带通配符%的模糊匹配
例2:查找片名中“含有s”的电影*/
SELECT title
FROM Movies
WHERE title LIKE '%s%';
/*注意区分:
s%:以s开头的字符串
%s:以s结尾的字符串
%s%:含有s的字符串*/
/*带单引号的模糊匹配
例3:查找片名中“含有所有格's”的电影*/
SELECT title
FROM Movies
WHERE title LIKE '%''s%';--SQL中约定两个连续的单引号表示一个单引号
/*带%或_的模糊匹配
方法:SQL中用ESCAPE 'x'来指定任意字符x临时担任转义字符
例3:查找片名中“含有所有格's”的电影*/
SELECT title
FROM Movies
WHERE title LIKE '%''s%';--SQL中约定两个连续的单引号表示一个单引号
- 带%或_的模糊匹配
方法:SQL中用ESCAPE 'x'来指定任意字符x临时担任转义字符
上图中例子表示:以%开头,以_结尾,中间任意多个字符的字符串
--例:查询片名中带“中国”或“中华”两个字的影片信息。
SELECT *
FROM Movies
WHERE title LIKE '%中国%' OR title LIKE '%中华%';
--或者
SELECT *
FROM Movies
WHERE title LIKE '%中[国华]%';
字符串拼接
- '+'拼接,要求运算符两边均是字符串
- 拼接时左右两边的空格均保留
空值和涉及空值的比较
SQL中的空值NULL,有许多不同的解释,NULL的运算规则:
- NULL和其他任何值的算术运算结果都是NULL
- NULL是一个特殊值,但又不算是一个常量,所以不能直接将NULL作为操作数
- 判断x的值是否为空值
- x IS NULL x为空时,结果为TRUE
- x IS NOT NULL x不为空时,结果为TRUE
--例:查询Studios表中没有登记地址的电影公司
SELECT name
FROM Studios
WHERE address IS NULL
--不能写成address = NULL