数据库系统概论第三单元基础知识(一)
mysql基础操作
mysql8.0 workbench
/* ----------------------------基础知识------------------------------ */
# 例3.1创建模式S-T
CREATE SCHEMA `S-T`;
/* `
事实上还可以通过如下语句进行创建
create database `S-T`;
如果想删除一个模式可以通过如下语句来进行实现
drop schema `S-T`;
或者drop database `S-T`;
*/
# 例3.2使用模式`S-T`;
USE `S-T`;
# 例3.3 关闭外键约束
SET FOREIGN_KEY_CHECKS = 0;
/*
Mysql中如果表和表之间建立的外键约束
则插入数据可能会失败
解决方法是在Mysql中先取消外键约束
SET FOREIGN_KEY_CHECKS = 0;
*/
# 例3.4建立student表
CREATE TABLE student (
sno CHAR(20) ,
sname CHAR(10) UNIQUE,
ssex CHAR(2),
sage SMALLINT,
sdept CHAR(20)
);
# 3.4 补添加主键约束
alter table student add PRIMARY KEY(sno);
/*
给Sno与Sname分别添加列级完整性约束
其中primary key 代表为主属性,unique key代表取值唯一可以简写为unique,但primary key不能简写
二者虽然都是唯一但也有明显区别
primary key 不能取空值,但后者可以,后者多用于索引相关内容,以后讨论
*/
# 例3.5建立课程表
CREATE TABLE course (
cno CHAR(4) PRIMARY KEY,
canme CHAR(40) ,
cpno CHAR(4),
ccredit SMALLINT,
FOREIGN KEY (cpno)
REFERENCES course (cno)
);
/*
foreign key是外码的意思,Cpno是外码
course既是参照关系也是被参照关系,参照的属性试试Cno
*/
# 例3.6修改属性名
alter table course change canme cname char(40) not null;
/*
缺点是需要修改属性
*/
# 补3.6 补添加用户定义完整性约束not null
alter table course modify column cname char(40) not null;
/*
column可以省略,如下做法均是错误:
alter table course add cname not null;
alter table course add not null (cname);
*/
# 例3.7显示course表的结构
desc course;
# 补3.7 显示数据库中已有的schema
show schemas;
show tables; # 列出当前模式下的所有表名
show columns from course; # 列出表中列的信息,等价与desc course;
# 补3.7 显示某张表上的各种键
show keys in course;
# 例3.8创建表sc
CREATE TABLE sc (
sno CHAR(20),
cno CHAR(4),
grade SMALLINT,
PRIMARY KEY (sno , cno), # 主键中含有多个属性,只能如此声明
FOREIGN KEY (sno)
REFERENCES student (sno)
);
/*
在属性之后添加的约束称为表级约束
一个关系中可以有多个主属性,同时也可以有多个外码
*/
# 补3.8 对表sc添加外键(建表后添加);
alter table sc add FOREIGN KEY (cno) REFERENCES course (cno);
# 3.9创建表test
CREATE TABLE test (
name CHAR(20)
/* , age SMALLINT,
id CHAR(20) */
);
# 补3.9 对表test添加列age、id、happy
alter table test add age SMALLint;
alter table test add id char(20) primary key;
alter table test add column happy date; # happy的数据类型为日期类型,column可以去除
# 补3.9 删除表test中的某一个属性
alter table test drop column happy ; # 删除属性列happy
# 例3.10向student、course、sc中插入数据
INSERT INTO student VALUES ('201215121','李勇','男',20,'CS');
INSERT INTO student VALUES ('201215122','刘晨','女',19,'CS');
INSERT INTO student VALUES ('201215123','王敏','女',18,'MA');
INSERT INTO student VALUES ('201215125','张立','男',19,'IS');
INSERT INTO course VALUES ('1','数据库','5',4);
INSERT INTO course VALUES ('2','数学',NULL,2);
INSERT INTO course VALUES ('3','信息系统','1',4);
INSERT INTO course VALUES ('4','操作系统','6',3);
INSERT INTO course VALUES ('5','数据结构','7',4);
INSERT INTO course VALUES ('6','数据处理',NULL,2);
INSERT INTO course VALUES ('7','PASCAL语言','6',4);
INSERT INTO course VALUES ('8','PASCAL语言',NULL,4);
INSERT INTO sc VALUE
('201215121','1',92),
('201215121','2',85),
('201215121','3',81),
('201215122','2',90),
('201215122','3',80);
/*
在进行插入操作时基本语法结构
insert into <表名>(属性) values/value (具体数据)
其中插入的数据默认情况下时按照建表时的顺序进行插入的
以test为例
insert into test values ('陈海',20,'192210501210');
上述操作方法等价于如下写法:
insert into test(name,age,id) values ('陈海',20,'192210501210');
如果只插入name和20,可以按照
insert into test(name,age) values ('陈海',20);
按照如下书写会报错!!!
insert into test values ('陈海',20);
insert into test values ('陈海',20,);
insert into test(name,age,id) values ('陈海',20,);
insert into test(name,age,id) values ('陈海',20);
以上四种书写全部会报错
value与values均可用于插入,但value插入多行效率更高,values插入单行效率更高。
插入还可以插入子查询,如下例:
insert into test(name,age) select sname,sage from student;
!!! 这里并没有values
*/
# 例3.11向test中添加新的属性
alter table test add column grade FLOAT;
/*
也可以按照如下的方式进行书写
ALTER TABLE test add grade double;
*/
# 补3.11修改test中的某个属性的类型
alter table student modify sage smallint;
# 例3.12向test中添加新的数据
INSERT INTO test VALUES ('张三',20,'192210501210',88);
INSERT INTO test VALUES (null,20,'192210501288',88);
INSERT INTO test VALUES ('李四',20,'192210501285',88);
INSERT INTO test(name,age,id) SELECT sname,sage,sno FROM student;
/*
mysql 中一些常用的数据类型
char(n) character(n) 长度为n的定长字符串
verchar(n) charactervarying(n) 最大长度为n的变长字符串
clob 字符串大对象
blob 二进制大对象
int integer 4字节
smallint 2字节
bigint 8字节
numric(p,d) 定点数,由p位数字组成<不包括符号、小数点>小数点有d位有效数字
decimal(p,d) dec(p,d) 定点数,由p位数字组成<不包括符号、小数点>小数点有d位有效数字
double 双精度浮点数
date 日期,包含年、月、日'%Y-%c-%d'
time 时间,包含时、分、秒
*/
# 例3.13即将表test的名字改为test1,然后再改回test
ALTER TABLE test RENAME test1;
ALTER TABLE test1 RENAME TO test;
/*
RENAME TABLE `S-T`.test TO `S-T`.test1;
RENAME TABLE `S-T`.test1 TO `S-T`.test;
上述两种方式都是修改表名的方法但是方法一更容易理解与掌握,建议使用第一种
*/
/*
可以通过alter简单的来修改表名,关键字rename to
下面顺代说一下模式名与属性名的修改
模式名的修改已经!!!!不再支持
RENAME database olddbname TO newdbname
在以前的版本种可以通过上述方法进行修改,但在mysql8.0中已经不再支持
只能在shell中通过比较复杂的方式进行.
*/
# 例3.14修改属性id
ALTER TABLE test MODIFY id CHAR(25);
/*
修改表中的某个属性的类型要使用modify
另外需要修改属的性必须在表中已经存在否则会报错
还可以写作如下形式:
ALTER TABLE test MODIFY COLUMN id char(25);
*/
# 例3.15对表中的name属性添加唯一性约束
ALTER TABLE test ADD UNIQUE(name);
/*
add还可以向表中的某个属性添加列级完整性约束
*/
/*
drop table <表名> [restrict | cascade];
使用restrict在删除表时,是存在条件限制的,如果存在引用,视图,和触发器等就不能删除。
使用cascade可以实现强制删除,是一种级联式的删除,会将建立在该表上的相关视图,参照表全部删除
但是在mysql是不会进行级联删除的,例如基本表删除后视图依然存在,但无法使用,会报错,可以参看课本87页
*/
# 例3.16 为学生表中的学号添加索引,默认升序
CREATE UNIQUE INDEX stusno ON student(sno);
/*
创建索引默认为升序建立索引,当你将上述语句再执行一次,并不会报错,
但是会有警告,因为这样做本身没有什么意义。
索引本质上是一种加快查询的数据结构,能够极大的加快查询效率,索引分很多种,
一般采用B+树;可以使用show keys in sc 查看sc上的索引及其类型。
*/
# 例3.17 为课程表中的课程号添加索引,升序
CREATE UNIQUE INDEX Coucno ON Course(Cno);
# 例3.18同时为两个属性建立唯一索引
CREATE UNIQUE INDEX SCno ON SC( Sno ASC,Cno DESC);
/*
创建索引 按照学号升序,以及课程号降序
*/
/*
ALTER TABLE tbl_name RENAME INDEX old_index_name TO new_index_name;
这种方法是用来修改索引名的
*/
# 例3.19删除某个索引
DROP INDEX stusno ON student;
/*
用来删除索引
*/
/* ------------------------查询操作-------------------------------- */
# 例3.20查询全体学生的学号和姓名
SELECT
sno, sname
FROM
student;
# 例3.21查询全体学生的学号和姓名
SELECT
sname, sno, sdept
FROM
student;
# 例3.22查询全体学生的详细记录
SELECT
*
FROM
student;
# 例3.23查询全体学生的姓名、出生年月、和所在院系,要求小写字母表示
SELECT
sname, 2014 - sage as birthday, LOWER(sdept)
FROM
student;
/* 可以利用as为显示的属性起别名,同时as可以省略
2014-sage为一个表达式,mysql中是支持表达式的,即将sage中的每个值都带如表达式中参与运算,并作为结果输出
lower 为mysql内置的字符串函数,
还有upper、concat、substr、trim、instr等具体实例以后更新
*/
# 例3.24查询选修了课程的学号
SELECT
sno
FROM
sc;
# 3.25查询选修了课程的学号(不重复)
SELECT DISTINCT
sno
FROM
sc;
SELECT
name
FROM
test;
# 例3.26查询计算机科学系全体学生名单
SELECT
sname
FROM
student
WHERE
sdept = 'CS';
# 例3.27查询所有考试不及格学生的学号
SELECT
sno
FROM
sc
WHERE
grade < 60;
# 例3.27查询所有年龄在20到23之间的学生
SELECT
sname
FROM
student
WHERE
sage BETWEEN 20 AND 23;
参考 《数据库系统概论(第五版)》作者王珊
我蒟蒻 有些地方可能有点乱,将就看看唉
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
二维码