1. 程式人生 > 資料庫 >資料庫複習-2

資料庫複習-2

資料庫複習-2

SQL語法學習

建立表

--字串使用用''


create table if not exists `student`(
	`id` int(4) not null auto_increment comment '學號',
	`name` varchar(30) not null default '匿名' comment '姓名',
    `pwd`  varchar(20) not null default '123456' comment '密碼',
    `sex`  varchar(2) not null default '女' comment '性別',
    `birthday` datetime default null comment  '出生日期',
    `address`  varchar(100) default null comment  '地址',
    `email`   varchar(100) default null comment  '郵箱',
    primary key(`id`)
    
) ENGINE=INNODB DEFAULT CHARSET=utf8

--show create table student檢視創表語句
--desc student 顯示錶結構

資料庫引擎

MyISAM和InnoDB(預設使用)的區別

MyISAMInnoDB
事務支援noyes
資料行鎖定noyes
外來鍵約束noyes
全文索引yesno
表空間大小較小較大約為MyISAM兩倍

常規操作

MyISAM:節約空間 速度快

InnoDB :安全性高 事務的處理 多表多使用者

在物理的儲存位置

所有資料庫檔案都在data目錄下 一個資料夾就對應一個數據庫

本質還是檔案儲存!

Mysql引擎在物理檔案上的區別

​ InnoDB 在資料表中只有一個*.frm檔案,以及上級目錄下的ibdata1檔案

​ MyISAM對應的檔案 *.frm --表結構的定義檔案

​ *.MYD --資料檔案

​ *.MYI --索引檔案

設定資料庫表的字符集編碼

CHARSET=utf8

不設定會出問題,它預設的Latin1是不支援中文

修改和刪除表

ALTER TABLE  student RENAME  student1 --修改表名
ALTER TABLE  student1 add age INT(11) --新增表字段
ALTER TABLE  student1 MODIFY age VARCHAR(11) --修改約束
ALTER TABLE  student1 CHANGE age age1 INT(11) --重新命名


ALTER TABLE  student1 DROP age1 --刪除欄位

drop table if exists student1 --刪除表

mysql資料管理

外來鍵

最佳實踐

資料庫就是單純的表,只用來存資料,其他實現用程式實現

以下操作是物理外來鍵,資料庫級別的外來鍵,不建議使用

一、基本概念

1、MySQL中“鍵”和“索引”的定義相同,所以外來鍵和主鍵一樣也是索引的一種。不同的是MySQL會自動為所有表的主鍵進行索引,但是外來鍵欄位必須由使用者進行明確的索引。用於外來鍵關係的欄位必須在所有的參照表中進行明確地索引,InnoDB不能自動地建立索引。

2、外來鍵可以是一對一的,一個表的記錄只能與另一個表的一條記錄連線,或者是一對多的,一個表的記錄與另一個表的多條記錄連線。

3、如果需要更好的效能,並且不需要完整性檢查,可以選擇使用MyISAM表型別,如果想要在MySQL中根據參照完整性來建立表並且希望在此基礎上保持良好的效能,最好選擇表結構為innoDB型別。

4、外來鍵的使用條件

① 兩個表必須是InnoDB表,MyISAM表暫時不支援外來鍵

② 外來鍵列必須建立了索引,MySQL 4.1.2以後的版本在建立外來鍵時會自動建立索引,但如果在較早的版本則需要顯式建立;

③ 外來鍵關係的兩個表的列必須是資料型別相似,也就是可以相互轉換型別的列,比如int和tinyint可以,而int和char則不可以;

5、外來鍵的好處:可以使得兩張表關聯,保證資料的一致性和實現一些級聯操作

mysql> CREATE TABLE tb_dept1
    -> (
    -> id INT(11) PRIMARY KEY,
    -> name VARCHAR(22) NOT NULL,
    -> location VARCHAR(50)
    -> );
Query OK, 0 rows affected (0.37 sec)


mysql> CREATE TABLE tb_emp6
    -> (
    -> id INT(11) PRIMARY KEY,
    -> name VARCHAR(25),
    -> deptId INT(11),
    -> salary FLOAT,
    -> CONSTRAINT fk_emp_dept1
    -> FOREIGN KEY(deptId) REFERENCES tb_dept1(id)
    -> );
Query OK, 0 rows affected (0.37 sec)

mysql> DESC tb_emp6;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(11)     | NO   | PRI | NULL    |       |
| name   | varchar(25) | YES  |     | NULL    |       |
| deptId | int(11)     | YES  | MUL | NULL    |       |
| salary | float       | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
4 rows in set (1.33 sec)

DML語言

資料操作語言:insert update delete

新增

mysql> use RUNOOB;
Database changed
mysql> INSERT INTO runoob_tbl 
    -> (runoob_title, runoob_author, submission_date)
    -> VALUES
    -> ("學習 PHP", "菜鳥教程", NOW());
Query OK, 1 rows affected, 1 warnings (0.01 sec)
mysql> INSERT INTO runoob_tbl
    -> (runoob_title, runoob_author, submission_date)
    -> VALUES
    -> ("學習 MySQL", "菜鳥教程", NOW());
Query OK, 1 rows affected, 1 warnings (0.01 sec)
mysql> INSERT INTO runoob_tbl
    -> (runoob_title, runoob_author, submission_date)
    -> VALUES
    -> ("JAVA 教程", "RUNOOB.COM", '2016-05-06');
Query OK, 1 rows affected (0.00 sec)
--資料和欄位要一一對應
--主鍵自增可以省略 如果不寫表的欄位他就會一一匹配
--欄位和欄位之間要用逗號隔開

修改

--在 tb_courses_new 表中,更新所有行的 course_grade 欄位值為 4
mysql> UPDATE tb_courses_new
    -> SET course_grade=4;
--在 tb_courses 表中,更新 course_id 值為 2 的記錄,將 course_grade 欄位值改為 3.5,將 course_name 欄位值改為“DB”
mysql> UPDATE tb_courses_new
    -> SET course_name='DB',course_grade=3.5
    -> WHERE course_id=2;

刪除

--刪除 tb_courses_new 表中的全部資料
DELETE FROM tb_courses_new;
--在 tb_courses_new 表中,刪除 course_id 為 4 的記錄、
mysql> DELETE FROM tb_courses
    -> WHERE course_id=4;

TRUNCATE

完全清空一個數據表資料,表的結構和約束不會變

TRUNCATE   `student`

DELETE和TRUNCATE區別

相同點:都能刪除資料,都不會刪除表結構

不同:

​ TRUNCATE 重新設定自增列 計數器會歸零

​ TRUNCATE不會影響事務

DELETE刪除的問題,重啟資料庫,現象

​ InnoDB 自增會從1開始(存在記憶體中斷電即失)

​ MyISAM 繼續上一個增量開始 (存在檔案中不會丟失)