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可以省略,
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;
參考 《資料庫系統概論(第五版)》作者王珊
我蒟蒻 有些地方可能有點亂,將就看看唉
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/394018.html
標籤:其他
