数据库系统概论第三单元基础知识(一)

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
分享
二维码
< <上一篇
下一篇>>