SQL語法基礎
Create database語句
- Create database語句是在MySQL實例上創建一個指定名稱的數據 庫,create schema語句的語義和create database是一樣的
- 當創建的數據庫本身存在而且沒有寫明if not exists子句時,則創 建數據庫的語句會報錯
Create database語句
- create_specification子句指明創建的數據庫的屬性,並存儲在db.opt文 件中
- Character set屬性指明此數據庫的默認字符集
- Collate屬性指明此數據庫的默認排序規則
- 創建后的數據庫在數據文件所在目錄會創建一個自己的文件目錄,用 來包含后續創建的表文件
- 也可以直接通過mkdir在數據目錄創建目錄, 則MySQL會識別為一個數據庫,並在執行show databases命令時可以看 到
mysql> create database test3; -- 創建數據庫成功
Query OK, 1 row affected (0.00 sec)
mysql> create database test3; -- 再次創建數據庫失敗
ERROR 1007 (HY000): Can't create database 'test3'; database exists
mysql> create database if not exists test3; -- 語句執行成功
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> use test3; -- 切換到test3數據庫
create table語句
- tbl_name表示被創建的表名,默認在當前數據庫下創建此表,當 然也可以指定在某個數據庫下創建表
- if not exists表示當相同的表名存在時,則不執行此創建語句,避 免語句執行錯誤
create table students2(sid int,sname varchar(10));
create table test3.students2(sid int,sname varchar(10)); --在test3這個數據庫下創建students2表
create table if not exists students2(sid int,sname varchar(10));
Temporary關鍵詞
- 表示創建的是臨時表,臨時表僅對本鏈接可見,另外的數據庫鏈接不可見, 當本鏈接斷開時,臨時表也自動被drop掉
mysql> create temporary table temp1(sid int,sname varchar(10));
Query OK, 0 rows affected (0.00 sec)
mysql> insert into temp1 values(1,'a');
Query OK, 1 row affected (0.00 sec)
mysql> select * from temp1;
+------+-------+
|sid |sname|
+------+-------+
| 1 |a |
+------+-------+
1 row in set (0.00 sec)
mysql> select * from temp1;
ERROR 1146 (42S02): Table 'test.temp1' doesn't exist -- 本數據庫鏈接斷開后再鏈接,臨時表也不存在
mysql> select * from temp1;
ERROR 1146 (42S02): Table 'test.temp1' doesn't exist
Like關鍵詞
- 表示基於另外一個表的定義復制一個新的空表,空表上的字段屬性和索 引都和原表相同
mysql>create table students_copy like students;
Query OK, 0 rows affected (0.01 sec)
mysql> show create table students_copy;
CREATE TABLE `students_copy` (
`sid` int(11) DEFAULT NULL,
`sname` varchar(20) DEFAULT NULL,
`sex` int(11) DEFAULT NULL,
UNIQUE KEY `idx_st_sid` (`sid`),
KEY `idx_st_union` (`sname`,`sex`)
)ENGINE=InnoDB DEFAULT CHAR SET=latin1
Create table ... as select語句
- 表示創建表的同時將select的查詢結果數據 插入到表中,但索引和主外鍵信息都不會同步過來
mysql> create table students_copy2 as select * from students;
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc students_copy2;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| sid | int(11) | YES | | NULL | |
| sname | varchar(20) | YES | | NULL
| sex | int(11) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
Ignore和replace
- 表示在插入數據的過程中如果新表中碰到違反唯一約束 的情況下怎么處理
- ignore表示不插入,replace表示替換已有的數據, 默認兩個關鍵詞都不寫則碰到違反的情況會報錯
Data_type
Not null/null
- 表示字段是否允許為空,默認為null表示允許為空,
- not null表示需要對此字段明確數值,或者要有默認值,否則報錯
mysql> create table students2(sid int not null,sname varchar(10));
Query OK, 0 rows affected (0.00 sec)
mysql> insert into students2(sname) values('eee');
ERROR 1364 (HY000): Field 'sid' doesn't have a default value
Default表示設置字段的默認值
create table students3(sid int,sname varchar(10),gender int default 0);
insert into students3 values(1,'a',default);
insert into students3(sid,sname) values(2,'b');
mysql> select * from students3;
+------+-------+--------+
|sid |sname |gender |
+------+-------+--------+
|1|a|0|
|2|b|0|
Auto_increment
- 表示字段為整數或者浮點數類型的value+1遞增數值,value為當前表 中該字段最大的值,默認是從1開始遞增
- 一個表中只容許有一個自增字段,且該字段必須有key屬性,不能含有default屬性,且插入負值會被當成很大的正數
mysql>create table students4(sid int auto_increment,sname varchar(10));
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a
key
mysql>create table students4(sid int primary key auto_increment,sname varchar(10));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into students4(sname) values('a');
Query OK, 1 row affected (0.00 sec)
mysql> insert into students4(sid,sname) values(3,'b');
Query OK, 1 row affected (0.01 sec)
mysql> insert into students4(sname) values('c');
Query OK, 1 row affected (0.00 sec)
mysql> select * from students4;
+-----+-------+
|sid |sname |
+-----+-------+
|1|a|
|3|b|
|4|c|
Constraint
- 表示為主鍵、唯一鍵、外鍵等約束條件命名,如果沒有命名則MySQL會默認給一個
Primary key
- 表示該字段為主鍵,主鍵字段必須唯一,必須非空,
- 一個表中只能有一個主鍵,主鍵可以包含一個或多個字段
Key/index
Unique
- 表示該字段為唯一屬性字段,且允許包含多個null值
Foreign key
CREATE TABLE `gender` (
gender_id int(11) NOT NULL,
name varchar(10) DEFAULT NULL,
PRIMARY KEY (gender_id)
);
create table students5(sid int not null primary key auto_increment,sname varchar(10) unique,gender int,constraint for_1 foreign key (gender) references gender(gender_id));
設計選課數據庫系統
- 創建一個名為course的數據庫
- 在該數據庫下創建以下幾個表:
- Students表:sid整型自增主鍵,sname字符串64位,gender字符串12位,dept_id整型並外鍵到dept表的id字段
- Dept表:id整型自增主鍵,dept_name字符串64位
- Course表:id整型自增字段主鍵,course_name字符串64位,teacher_id整型外鍵到teacher表的id字段
- Teacher表:id整型自增字段主鍵,name字符串64位,dept_id整型外鍵到dept表的id字段
- Students表和teacher表的dept_id為非空
mysql> create database course;
mysql> use course;
mysql> create table dept(id int auto_increment primary key,dept_name varchar(64));
mysql> create table students(sid int auto_increment primary key,sname varchar(54),gender varchar(12),dept_id int not null,constraint for_1 foreign key(dept_id) references dept(id));
mysql> create table teacher(id int auto_increment primary key,name varchar(64),dept_id int not null, constraint for_2 foreign key(dept_id) references dept(id));
mysql> create table course(id int auto_increment primary key,course_name varchar(64),teacher_id int,constraint for_3 foreign key(teacher_id) references teacher(id));