Mysql第四天

數(shù)據(jù)庫管理

新建數(shù)據(jù)庫

CREATE DATABASE  [IF NOT EXISTS] 數(shù)據(jù)庫名

示例

CREATE DATABASE IF NOT EXISTS MySQLDB;

數(shù)據(jù)類型


數(shù)值類型



日期類型



字符串類型

特殊字符序列

約束

重要,記下

非空約束(NOT NULL)

強制列不能為 NULL 值脑蠕,約束強制字段始終包含值。這意味著脾歧,如果不向字段添加值譬胎,就無法插入新記錄或者更新記錄磕蛇。
唯一約束(UNIQUE)

  • 唯一約束可以保證記錄的唯一性,即就是同一個表中囱桨,相同字段的值不會出現(xiàn)重復(fù)仓犬。
  • 唯一約束的字段可以為空值(NULL)。
  • 每一張數(shù)據(jù)表可以存在多個唯一約束字段舍肠。

主鍵約束(PRIMARY KEY)

數(shù)據(jù)庫表要求表中的每一行記錄都必須是唯一的搀继,即在同一張表中不允許出現(xiàn)完全相同的兩條記錄窘面。在設(shè)計數(shù)據(jù)庫時,為了保證記錄的“唯一性”叽躯,最為普遍财边、最為推薦的做法是為表定義一個主鍵(primary key)。數(shù)據(jù)庫表中主鍵有以下兩個特征:
表的主鍵可以由一個字段構(gòu)成点骑,也可以由多個字段構(gòu)成(這種情況稱為復(fù)合主鍵)酣难。
數(shù)據(jù)庫表中主鍵的值具有唯一性且不能取空值(NULL),當數(shù)據(jù)庫表中的主鍵由多個字段構(gòu)成時畔况,每個字段的值不能取NULL值

CREATE TABLE classes (
    classes_id INT PRIMARY KEY,
    classes_name VARCHAR (10),
    classes_dept VARCHAR (10)
);

外鍵約束(FOREIGN KEY)

班級實體和班主任實體之間為一對一關(guān)系鲸鹦,班級實體和學(xué)生實體之間為一對多關(guān)系,學(xué)生實體和課程實體之間為多對多關(guān)系跷跪。
實體間的關(guān)系可以通過外鍵來表示馋嗜。如果表A中的一個字段a對應(yīng)于表B的主鍵b,則字段a稱為表A的外鍵吵瞻。此時存儲在表A中字段a的值葛菇,同時這個字段值也是表B主鍵b的值。

CREATE TABLE teacher (
    teacher_id INT PRIMARY KEY,
    teacher_name VARCHAR (10),
    cid INT,
    FOREIGN KEY (cid) REFERENCES classes (classes_id)
);

練習(xí):

學(xué)校想做一個選課系統(tǒng)橡羞,其中涉及到課程表眯停,學(xué)生表,請分別創(chuàng)建這兩個表卿泽,自己思考表中應(yīng)有的列及數(shù)據(jù)類型莺债。
學(xué)校有一個選課系統(tǒng),其中包括如下關(guān)系模式:
系(系編號: 主鍵签夭,系名稱: 唯一鍵齐邦,系主任: 非空約束,系所在校去:默認為渾南區(qū))
班級(班級編號: 主鍵第租,班級名稱: 唯一鍵措拇,所屬系: 外鍵)
創(chuàng)建學(xué)生表,包含如下屬性:
學(xué)號 定長字符型 10位 主鍵
姓名 變長字符型 20位 非空
性別 定長字符型 2位
出生日期 日期型
所在班級

-- 學(xué)校想做一個選課系統(tǒng)慎宾,其中涉及到課程表丐吓,學(xué)生表,
-- 請分別創(chuàng)建這兩個表趟据,自己思考表中應(yīng)有的列及數(shù)據(jù)類型券犁。
-- 學(xué)校有一個選課系統(tǒng),其中包括如下關(guān)系模式:
-- 系(系編號: 主鍵汹碱,系名稱: 唯一鍵族操,系主任: 非空約束,系所在校去:默認為渾南區(qū))
-- 班級(班級編號: 主鍵,班級名稱: 唯一鍵色难,所屬系: 外鍵)
-- 創(chuàng)建學(xué)生表泼舱,包含如下屬性:
-- 學(xué)號 定長字符型 10位 主鍵
-- 姓名 變長字符型 20位 非空
-- 性別 定長字符型 2位
-- 出生日期 日期型
-- 所在班級
CREATE TABLE
IF NOT EXISTS xi (
    XINumber VARCHAR (20) NOT NULL PRIMARY KEY,
    XIName VARCHAR (20) NOT NULL UNIQUE,
    XIZhuren VARCHAR (20) NOT NULL,
    Xiaoqu enum ('渾南區(qū)')
);

CREATE TABLE
IF NOT EXISTS class (
    classid VARCHAR (20) NOT NULL PRIMARY KEY,
    cname VARCHAR (20) NOT NULL UNIQUE,
    xiname VARCHAR (10) NOT NULL,
    FOREIGN KEY (xiname) REFERENCES xi (xiname)
);

CREATE TABLE
IF NOT EXISTS student (
    xh VARCHAR (20) NOT NULL PRIMARY KEY,
    xm VARCHAR (20) NOT NULL,
    gender CHAR (2),
    birthday DATE,
    cname VARCHAR (20) NOT NULL UNIQUE,
    FOREIGN KEY (cname) REFERENCES class (cname)
);

刪除數(shù)據(jù)庫

DROP DATABASE 數(shù)據(jù)庫名

復(fù)制表

CREATE TABLE 新表名  LIKE 源表

方法二

CREATE TABLE 新表名 SELECT - FROM 源表
CREATE TABLE emphaha SELECT  *   FROM emp

刪除表

DROP TABLE 表名

表的重命名

RENAME TABLE 舊表名 TO 新表名

等效

ALTER TABLE person RENAME human;

創(chuàng)建與dept表相同表結(jié)構(gòu)的表dtest,將dept表中部門編號在40之前的信息插入該表枷莉。

CREATE TABLE dtest SELECT * from dept WHERE DEPTNO < 40;

創(chuàng)建與emp表結(jié)構(gòu)相同的表empl娇昙,并將其部門編號為前30號的員工信息復(fù)制到empl表。

CREATE TABLE empl SELECT * from emp WHERE DEPTNO < 30;

數(shù)據(jù)操作與事務(wù)控制

Data Manipulation Language ,簡稱DML笤妙,主要用來實現(xiàn)對數(shù)據(jù)庫表中的數(shù)據(jù)進行操作冒掌。
數(shù)據(jù)操作語言主要包括如下幾種:
增加行數(shù)據(jù):使用INSERT語句實現(xiàn)
修改行數(shù)據(jù):使用UPDATE語句實現(xiàn)
刪除行數(shù)據(jù):使用DELETE語句實現(xiàn)

插入數(shù)據(jù)

INSERT INTO    table [(column [, column...])]
VALUES        (value [, value...]);
  • 采用這種語法一次只能追加一條記錄;
  • column部分叫做列名列表蹲盘,value部分叫做值列表股毫,列名列表和值列表必須在個數(shù)及數(shù)據(jù)類型上保持一致;
  • 列名列表部分可以省略召衔,如果省略铃诬,默認包括該表的所有列,列的順序為使用 desc 表名 命令所查看的順序苍凛;
  • 列名列表部分也可以指定部分非空的列趣席,注意值列表必須和列名列表對應(yīng);
    字符和日期型數(shù)據(jù)必須要用單引號括起來
INSERT into dept VALUES(50, 'IT', '北京')

插入空值NULL

INSERT into dept VALUES(6
0, 'Test', null);

向部門表新增一個部門醇蝴,部門編號為50宣肚,部門名稱為HR,工作地點為SY悠栓。

 insert into dept values(50,"HR","SY"); 

向部門表新增一個部門霉涨,部門編號為60,部門名稱為MARKET惭适。

 insert into dept values(60,"MARKET","");

插入日期值

SYSDATE()

insert into emp values(8888,'haha','該溜子',null,SYSDATE(),4000,12,50  );

插入日期值

insert into emp values(8889,'李會長','小青年',null,'1888-01-01
',4000,12,50  );

向員工表中新增一個員工嵌纲,員工編號為8888,姓名為BOB腥沽,崗位為CLERK,經(jīng)理為號7788鸠蚪,入職日期為1985-03-03今阳,薪資3000,獎金和部門為空茅信。

insert into emp values(8899, 'BOB', 'clerk', 7788, '1985-03-03', 3000, null, null);

批量插入數(shù)據(jù)

INSERT INTO EMP(EMPNO, ENAME, JOB, SAL) 
VALUES 
('8881', '張三', '部門經(jīng)理', 6000),
('8882', '李四', '職員', 3000),
('8883', '王五', '職員', 3500),
('8884' ,'趙六', '部門經(jīng)理', 6500),
('8885', '高七', '職員', 2500),
('8886', '馬八', '職員', 3100),
('8887', '錢九', '部門經(jīng)理', 5000),
('8888', '孫十',  '職員', 2800);

通過子查詢插入多行數(shù)據(jù)

  • INSERT子句和數(shù)據(jù)類型必須和子查詢中列的數(shù)量和類型相匹配中列的數(shù)量
    創(chuàng)建一個manager表
create table manager as select * from emp where 1=0;

插入數(shù)據(jù)盾舌, 全部工作為salesman的數(shù)據(jù)

insert into manager select * from emp where job='SALESMAN';

使用CREATE TABLE emp_back as SELECT - FROM EMP WHERE 1=0,創(chuàng)建emp_back表,拷貝下來即可蘸鲸。

create table emp_back as select * from emp where 1=0;

把emp表1982年1月1日之前的員工信息復(fù)制到emp_back表中

insert into manager select * from emp where hiredate <'1982-01-01';

修改數(shù)據(jù)

UPDATE        table
SET        column = value [, column = value]
[WHERE         condition];

Mysql日期計算

DATE_ADD(date,INTERVAL expr unit) 返回一個日期加上指定的時間單元
DATE_SUB(date,INTERVAL expr unit) 返回一個日期減去指定的時間單元

SELECT DATEDIFF('2020-08-05','2020-08-02') AS 相差時間;  -- 3天

unit 可選字段



修改部門20的員工信息妖谴,把82年之后入職的員工入職日期向后調(diào)整10天

UPDATE emp
SET HIREDATE = DATE_ADD(HIREDATE,INTERVAL 10 DAY)
WHERE
    DEPTNO = 20
AND HIREDATE > '1982-01-01';

修改獎金為null的員工,獎金設(shè)置為0

update emp set comm=0 where comm is null;

修改工作地點在NEW YORK或CHICAGO的員工工資,工資增加500

UPDATE emp e,
 dept d
SET e.sal = e.sal + 500
WHERE
    e.deptno = d.deptno
AND d.loc IN ('NEW YORK', 'CHICAGO');

刪除數(shù)據(jù)語法

DELETE FROM      table
[WHERE      condition];
DELETE FROM      empl
WHERE empl.EMPNO = 7902;

截斷表語法

TRUNCATE TABLE table; 

TRUNCATE和DELETE區(qū)別

  • TRUNCATE是DDL膝舅,只能刪除表中所有記錄嗡载,釋放存儲空間,使用ROLLBACK不可以回滾仍稀。
  • DELETE是DML洼滚,可以刪除指定記錄,不釋放存儲空間技潘,使用ROLLBACK可以回滾遥巴。
    刪除經(jīng)理編號為7566的員工記錄
delete from emp_copy where mgr=7566;

刪除工作在NEW YORK的員工記錄

DELETE
FROM
    emp_copy
WHERE
    deptno IN (
        SELECT
            DEPTNO
        FROM
            dept
        WHERE
            loc = 'NEW YORK'
    )

刪除工資大于所在部門平均工資的員工記錄

DELETE FROM emp_copy WHERE empno in (select * from (SELECT
    a.empno
FROM
    emp_copy AS a,
    (
        SELECT
            deptno,
            AVG(sal) AS avgsal
        FROM
            emp_copy
        GROUP BY
            deptno
    ) as b
WHERE 
a.deptno = b.deptno
AND a.sal > b.avgsal) as query)
delete from emp22 where sal>(select avg(sal) from emp e where emp22.deptno=e.deptno);

Mysql 事物

在數(shù)據(jù)庫中,事務(wù)由一組相關(guān)的DML或SELECT語句享幽,加上一個TPL語句(COMMIT铲掐、ROLLBACK)或一個DDL語句(CREATE、ALTER值桩、DROP摆霉、TRUNCATE等)或一個DCL(GRANT、REVOKE)語句颠毙。

事務(wù)特征可用四個字母的縮寫表示:即ACID
原子性(Atomicity)
事務(wù)就像“原子”一樣斯入,不可被分割,組成事務(wù)的DML操作語句要么全成功蛀蜜,要么全失敗刻两,不可能出現(xiàn)部分成功部分失敗的情況。
一致性(Consistency)
一旦事務(wù)完成滴某,不管是成功的磅摹,還是失敗的,整個系統(tǒng)處于數(shù)據(jù)一致的狀態(tài)霎奢。
隔離性(Isolation)
一個事務(wù)的執(zhí)行不會被另一個事務(wù)所干擾户誓。比如兩個人同時從一個賬戶從取錢,通過事務(wù)的隔離性確保賬戶余額的正確性幕侠。
持久性(Durability)
也稱為永久性帝美,指事務(wù)一旦提交,對數(shù)據(jù)的改變就是永久的晤硕,不可以再被回滾悼潭。

存儲引擎

  • InnoDB存儲引擎的特點:
    支持外鍵(Foreign Key)
    支持事務(wù)(Transaction):如果某張表主要提供OLTP支持,需要執(zhí)行大量的增舞箍、刪舰褪、改操作(insert、delete疏橄、update語句)占拍,出于事務(wù)安全方面的考慮,InnoDB存儲引擎是更好的選擇。
    最新版本的MySQL已經(jīng)開始支持全文檢索晃酒。
  • MyISAM存儲引擎的特點:
    MyISAM具有檢查和修復(fù)表的大多數(shù)工具表牢。
    MyISAM表可以被壓縮
    MyISAM表最早支持全文索引
    但MyISAM表不支持事務(wù)
    但MyISAM表不支持外鍵(Foreign Key)。
    如果需要執(zhí)行大量的select語句掖疮,出于性能方面的考慮初茶,MyISAM存儲引擎是更好的選擇。

事務(wù)演示

建立一個account表


CREATE TABLE `account` (
  `id` int(12) NOT NULL,
  `name` varchar(12) NOT NULL,
  `balance` int(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • 1浊闪、手動開啟事務(wù)
start transaction;
  • 2恼布、執(zhí)行一些操作
    給張三賬戶轉(zhuǎn) 50塊錢

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市搁宾,隨后出現(xiàn)的幾起案子折汞,更是在濱河造成了極大的恐慌,老刑警劉巖盖腿,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件爽待,死亡現(xiàn)場離奇詭異,居然都是意外死亡翩腐,警方通過查閱死者的電腦和手機鸟款,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來茂卦,“玉大人何什,你說我怎么就攤上這事〉攘” “怎么了处渣?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蛛砰。 經(jīng)常有香客問我罐栈,道長,這世上最難降的妖魔是什么泥畅? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任荠诬,我火速辦了婚禮,結(jié)果婚禮上位仁,老公的妹妹穿的比我還像新娘柑贞。我一直安慰自己,他們只是感情好障癌,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著辩尊,像睡著了一般涛浙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天轿亮,我揣著相機與錄音疮薇,去河邊找鬼。 笑死我注,一個胖子當著我的面吹牛按咒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播但骨,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼励七,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了奔缠?” 一聲冷哼從身側(cè)響起掠抬,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎校哎,沒想到半個月后两波,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡闷哆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年腰奋,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抱怔。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡劣坊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出野蝇,到底是詐尸還是另有隱情讼稚,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布绕沈,位于F島的核電站锐想,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏乍狐。R本人自食惡果不足惜赠摇,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望浅蚪。 院中可真熱鬧藕帜,春花似錦、人聲如沸惜傲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盗誊。三九已至时甚,卻和暖如春隘弊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背荒适。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工梨熙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人刀诬。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓咽扇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親陕壹。 傳聞我的和親對象是個殘疾皇子质欲,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354