其實對不少人來講對於SQL語句已經忘了不少,或者說是不懂不少,由於有數據庫圖形操做軟件,方便了你們,可是咱們不能忘記最根本的東西,特別是一些細節上的東西,可能你用慣了Hibernate,不用寫SQL語句,可是不是任何項目都要用到大框架的,若是不用,那你是否是就不會操做數據庫了呢,因此咱們最好仍是熟悉一點好,對咱們之後找工做和工做都有幫助。mysql
在說建立、修改和刪除表前,咱們仍是要進行一個操做的簡單說明:sql
1.登錄數據庫系統數據庫
在命令行中登錄MySQL數據庫管理系統,輸入一下內容:安全
mysql -h localhost -u root -p
不少人都知道這個,可是其中參數的具體表示什麼咱們仍是要了解的,其中,「-h」參數指鏈接的主機名,因此後面是localhost;「-u」參數表示用戶名,此處的用戶名爲root;「-p」參數表示用戶的密碼,按下Enter鍵後就顯示「Enter password:」,輸入密碼便可登陸進去了。併發
2.建立數據庫app
在建立數據庫以前,咱們能夠查看已經存在的數據庫:框架
mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | community | | community_test | | data | | mydata | | mysql | | performance_schema | | test | +--------------------+ 8 rows in set (0.04 sec)
建立數據庫的格式:CREATE DATABASE 數據庫名;分佈式
示例:建立一個名爲example的數據庫ide
mysql> CREATE DATABASE example; Query OK, 1 row affected (0.00 sec) mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | community | | community_test | | data | | example | | mydata | | mysql | | performance_schema | | test | +--------------------+ 9 rows in set (0.00 sec)
3.刪除數據庫:編碼
格式:DROP DATABASE 數據庫名;
示例:刪除example數據庫
mysql> DROP DATABASE example; Query OK, 0 rows affected (0.07 sec) mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | community | | community_test | | data | | mydata | | mysql | | performance_schema | | test | +--------------------+ 8 rows in set (0.00 sec)
4.數據庫存儲引擎
存儲引擎就是指表的類型,數據庫存儲引擎決定了表在計算機的存儲方式。
MySQL中查詢存儲引擎的類型命令:SHOW ENGINES;
mysql> SHOW ENGINES; +--------------------+---------+------------------------------------------------ ----------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +--------------------+---------+------------------------------------------------ ----------------+--------------+------+------------+ | FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL | | MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO | | MyISAM | YES | MyISAM storage engine | NO | NO | NO | | BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO | | CSV | YES | CSV storage engine | NO | NO | NO | | MEMORY | YES | Hash based, stored in memory, useful for tempor ary tables | NO | NO | NO | | ARCHIVE | YES | Archive storage engine | NO | NO | NO | | InnoDB | DEFAULT | Supports transactions, row-level locking, and f oreign keys | YES | YES | YES | | PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO | +--------------------+---------+------------------------------------------------ ----------------+--------------+------+------------+ 9 rows in set (0.00 sec)
查詢結果中,Engine參數指存儲引擎名稱;Support參數說明MySQL是否支持該類型引擎;Comment參數表示對該引擎的評論;Transaction參數表示是否支持事務處理;XA參數表示是否分佈式交易處理的XA規範;Savepoints參數表示是否支持保存點,以方便事務的回滾操做;由上面咱們看到InnoDB存儲引擎是default的,也就是數據庫默認的存儲引擎,下面咱們簡單介紹一下InnoDB。
InnoDB是MySQL的一種存儲引擎,InnoDB給MySQL提供了事務、回滾、崩潰修復能力和多版本併發控制的事務安全。InnoDB是MySQL上第一個提供外鍵約束的表引擎,並且對事務處理的能力,也是其餘存儲引擎不能比擬的。不過這種引擎的缺點就是讀寫效率稍差,佔用的數據空間相對比較大。
下面就是正式的內容:
建立表:
1)建立表的形式:
CREATE TABLE 表名 ( 屬性名 數據類型 [完整約束條件], 屬性名 數據類型 [完整約束條件], ... ... 屬性名 數據類型 [完整約束條件] );
若是你很急的登錄進去就建立表,恭喜你,你會出現「No database selected」的錯誤,由於你沒有告訴別人你要選擇在哪一個數據庫建立表,因此在建立以前要選擇數據庫,格式:USE 數據庫名;
示例建立一個student表:
mysql> use example; Database changed mysql> CREATE TABLE student ( -> id int, -> name varchar(20) -> ); Query OK, 0 rows affected (0.09 sec)
上面建立表的時候涉及到一個完整性約束條件,下面就列出一個完整性約束條件表:
約束條件 |
說明 |
PRIMARY KEY |
標識該屬性爲該表的主鍵,能夠惟一的標識對應的元組 |
FOREIGN KEY |
標識該屬性爲該表的外鍵,是與之聯繫某表的主鍵 |
NOT NULL | 標識該屬性不能爲空 |
UNIQUE |
標識該屬性的值是惟一的 |
AUTO_INCREMENT | 標識該屬性的值是自動增長,這是MySQL的SQL語句的特點 |
DEFAULT | 爲該屬性設置默認值 |
下面講解一下上面完整性約束條件的應用:
2)設置表的主鍵
單字段主鍵格式:屬性名 數據類型 PRIMARY KEY
示例:
mysql> CREATE TABLE student1 ( -> id int PRIMARY KEY, -> name varchar(20) -> ); Query OK, 0 rows affected (0.06 sec)
多字段主鍵格式:PRIMARY KEY(屬性名1,屬性名2....屬性名n)
示例:
mysql> CREATE TABLE student2 ( -> id int, -> stu_id int, -> name varchar(20), -> PRIMARY KEY(id,stu_id) -> ); Query OK, 0 rows affected (0.00 sec)
3)設置表的外鍵
格式:CONSTRAINT 外鍵別名 FOREIGN KEY(屬性1,屬性2,....屬性n) REFERENCES 表名(屬性1',屬性2',...屬性n')
示例:
mysql> CREATE TABLE teacher ( -> id int PRIMARY KEY, -> stu_id int, -> name varchar(20), -> CONSTRAINT STUID FOREIGN KEY(stu_id) REFERENCES student1(id) -> ); Query OK, 0 rows affected (0.00 sec)
4)設置表的非空約束
簡單的說就是不讓這個屬性的值爲空,不填的話就會報錯
格式:屬性名 數據類型 NOT NULL
5)設置表的惟一性約束
就是這個屬性的值是不能重複的
格式:屬性名 數據類型 UNIQUE
6)設置表的屬性值自動增長
AUTO_INCREMENT約束的字段能夠是任何整數類型(TINYINT、SMALLINT、INT和BIGINT),在默認的狀況下,該字段的值是從1開始自增
格式:屬性名 數據類型 AUTO_INCREMENT
7)設置表的屬性的默認值
格式:屬性名 數據類型 DEFAULT 默認值
下面對4-7進行綜合示例:
mysql> CREATE TABLE student3 ( -> id int PRIMARY KEY AUTO_INCREMENT, -> teacher_id int UNIQUE, -> name varchar(20) NOT NULL, -> sex varchar(10) DEFAULT 'male' -> ); Query OK, 0 rows affected (0.01 sec)
查看錶結構
查看錶基本結構語句DESCRIBE
格式:DESCRIBE 表名;
經過查看錶的結構,就很明確的對錶進行解讀,並且能夠查看一下本身建立的表有沒錯誤,這個SQL語句必須會用啊
示例:
mysql> desc student3; +------------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+-------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | teacher_id | int(11) | YES | UNI | NULL | | | name | varchar(20) | NO | | NULL | | | sex | varchar(10) | YES | | male | | +------------+-------------+------+-----+---------+----------------+ 4 rows in set (0.01 sec)
查看錶詳細結構語句SHOW CREATE TABLE
經過這個SQL語句能夠查看錶的詳細定義,除了字段名、字段的數據類型、約束條件外,還能夠查看錶的默認存儲引擎和字符編碼
格式:SHOW CREATE TABLE 表名;
示例:
mysql> SHOW CREATE TABLE student3; +----------+----------------------------------- ----------------------------------------------- ----------------------------------------------- ---------------------------------------------+ | Table | Create Table | +----------+----------------------------------- ----------------------------------------------- ----------------------------------------------- ---------------------------------------------+ | student3 | CREATE TABLE `student3` ( `id` int(11) NOT NULL AUTO_INCREMENT, `teacher_id` int(11) DEFAULT NULL, `name` varchar(20) NOT NULL, `sex` varchar(10) DEFAULT 'male', PRIMARY KEY (`id`), UNIQUE KEY `teacher_id` (`teacher_id`) ) ENGINE=InnoDB DEFAULT CHARSET=gb2312 | +----------+----------------------------------- ----------------------------------------------- ----------------------------------------------- ---------------------------------------------+ 1 row in set (0.00 sec)
修改表:
1)修改表名
表名能夠在一個數據庫中惟一的肯定一張表。
格式:ALTER TABLE 舊錶名 RENAME 新表名;
示例:
mysql> ALTER TABLE student RENAME student4; Query OK, 0 rows affected (0.11 sec) mysql> DESCRIBE student; ERROR 1146 (42S02): Table 'example.student' doesn't exist
由上面能夠看出,更名後的表已經不存在了。
2)修改字段的數據類型
格式:ALTER TABLE 表名 MODIFY 屬性名 數據類型;
示例:
mysql> DESCRIBE student1; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(20) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 2 rows in set (0.08 sec) mysql> ALTER TABLE student1 MODIFY name varchar(30); Query OK, 0 rows affected (0.06 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> DESCRIBE student1; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(30) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 2 rows in set (0.01 sec)
3)修改字段名:
格式:ALTER TABLE 表名 CHANGE 舊屬性名 新屬性名 新數據類型;
示例:
mysql> DESCRIBE student1; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(30) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql> ALTER TABLE student1 CHANGE name stu_name varchar(40); Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> DESCRIBE student1; +----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | stu_name | varchar(40) | YES | | NULL | | +----------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
這裏我修改的字段名的同時也修改了數據類型了,若是你不想修改數據類型的話就按照原來的寫就好了。
4)增長字段
格式:ALTER TABLE 表名 ADD 屬性名1 數據類型 [完整性約束條件] [FIRST | AFTER 屬性名2];
其中,「屬性名1」參數指須要增長的字段的名稱;「FIRST」參數是可選參數,其做用是將新增字段設置爲表的第一個字段;「AFTER」參數也是可選的參數,其做用是將新增字段添加到「屬性名2」後面;「屬性名2」固然就是指表中已經有的字段
示例:
mysql> DESCRIBE student1; +----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | stu_name | varchar(40) | YES | | NULL | | +----------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql> ALTER TABLE student1 ADD teacher_name varchar(20) NOT NULL AFTER id; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> DESCRIBE student1; +--------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | teacher_name | varchar(20) | NO | | NULL | | | stu_name | varchar(40) | YES | | NULL | | +--------------+-------------+------+-----+---------+-------+ 3 rows in set (0.01 sec)
5)刪除字段
格式:ALTER TABLE 表名 DROP 屬性名;
示例:
mysql> DESCRIBE student1; +--------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | teacher_name | varchar(20) | NO | | NULL | | | stu_name | varchar(40) | YES | | NULL | | +--------------+-------------+------+-----+---------+-------+ 3 rows in set (0.01 sec) mysql> ALTER TABLE student1 DROP teacher_name; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> DESCRIBE student1; +----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | stu_name | varchar(40) | YES | | NULL | | +----------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
6)更改表的存儲引擎
格式:ALTER TABLE 表名 ENGINE = 存儲引擎名;
示例:
mysql> SHOW CREATE TABLE student2; +----------+---------------------------------------- ---------------------------------------------------- ---------------------------------------------------- | Table | Create Table +----------+---------------------------------------- ---------------------------------------------------- ---------------------------------------------------- | student2 | CREATE TABLE `student2` ( `id` int(11) NOT NULL DEFAULT '0', `stu_id` int(11) NOT NULL DEFAULT '0', `name` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`,`stu_id`) ) ENGINE=InnoDB DEFAULT CHARSET=gb2312 | +----------+---------------------------------------- ---------------------------------------------------- ---------------------------------------------------- 1 row in set (0.05 sec) mysql> ALTER TABLE student2 ENGINE = MYISAM; Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> SHOW CREATE TABLE student2; +----------+---------------------------------------- ---------------------------------------------------- ---------------------------------------------------- | Table | Create Table +----------+---------------------------------------- ---------------------------------------------------- ---------------------------------------------------- | student2 | CREATE TABLE `student2` ( `id` int(11) NOT NULL DEFAULT '0', `stu_id` int(11) NOT NULL DEFAULT '0', `name` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`,`stu_id`) ) ENGINE=MyISAM DEFAULT CHARSET=gb2312 | +----------+---------------------------------------- ---------------------------------------------------- ---------------------------------------------------- 1 row in set (0.00 sec)
7)刪除表的外鍵約束
格式:ALTER TABLE 表名 DROP FOREIGN KEY 外鍵別名;
示例:
mysql> SHOW CREATE TABLE teacher; +---------+------------------------------------------------ ----------------------------------------------------------- ----------------------------------------------------------- --------------------------------------------------+ | Table | Create Table | +---------+------------------------------------------------ ----------------------------------------------------------- ----------------------------------------------------------- --------------------------------------------------+ | teacher | CREATE TABLE `teacher` ( `id` int(11) NOT NULL, `stu_id` int(11) DEFAULT NULL, `name` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`), KEY `STUID` (`stu_id`), CONSTRAINT `STUID` FOREIGN KEY (`stu_id`) REFERENCES `stu ) ENGINE=InnoDB DEFAULT CHARSET=gb2312 | +---------+------------------------------------------------ ----------------------------------------------------------- ----------------------------------------------------------- --------------------------------------------------+ 1 row in set (0.08 sec) mysql> ALTER TABLE teacher DROP FOREIGN KEY STUID; Query OK, 0 rows affected (0.04 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> SHOW CREATE TABLE teacher; +---------+------------------------------------------------ ----------------------------------------------------------- --------------------------------------------------------+ | Table | Create Table | +---------+------------------------------------------------ ----------------------------------------------------------- --------------------------------------------------------+ | teacher | CREATE TABLE `teacher` ( `id` int(11) NOT NULL, `stu_id` int(11) DEFAULT NULL, `name` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`), KEY `STUID` (`stu_id`) ) ENGINE=InnoDB DEFAULT CHARSET=gb2312 | +---------+------------------------------------------------ ----------------------------------------------------------- --------------------------------------------------------+ 1 row in set (0.00 sec)
刪除表:
格式:DROP TABLE 表名;
刪除沒有被關聯的普通表:直接上面的SQL語句就好了
刪除被其餘表關聯的父表:
方法一:先刪除子表,在刪除父表
方法二:刪除父表的外鍵約束(上面有介紹),再刪該表