資料庫複習-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(預設使用)的區別
MyISAM | InnoDB | |
---|---|---|
事務支援 | no | yes |
資料行鎖定 | no | yes |
外來鍵約束 | no | yes |
全文索引 | yes | no |
表空間大小 | 較小 | 較大約為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 繼續上一個增量開始 (存在檔案中不會丟失)