進擊のpython
數據庫——初識sql語句
前面提到了說,數據庫管理系統就像我們曾經做過的輸入命令返回結果的socket通信差不多
那既然提到了命令,在MySQL中,有一些基本的語句,就應該被知道
剛開始學的時候可能覺得這些這么多的英語單詞,我記不住怎么辦?
其實你會發現,好多的語句其實跟我們說話的方式很像(我會在介紹語句的時候說),記憶起來就不是很困難
如果是單詞的問題,就只能建議你多敲多聯系了,“無他,唯手熟爾”
數據庫本質也就只是個文件對吧,那是個文件就有:增 查 改 刪
所以我們會針對庫,表,記錄的這四個方法來進行介紹,一定注意,多敲!
庫(操作文件夾)
增
create database db1 charset utf8;
(創建 數據庫 db1 編碼設置 utf8)
mysql> create database db1 charset utf8;
Query OK, 1 row affected (0.05 sec)
這樣就相當於建一個文件夾,其實也真的建立了一個文件夾
現在我們是在本機的數據庫操作,所以數據都存放在了本地,那我們看看我們新建的數據庫文件
找到你的數據庫安裝目錄,能看到一個叫做data的文件夾,看名字也知道這個名字是數據的意思
我們打開它,是不是發現了我們新建的庫:db1,而且是文件夾的形式吧!
數據庫的命名也是有規范的:
可以由字母、數字、下划線、@、#、$
區分大小寫
唯一性
不能使用關鍵字如 create select
不能單獨使用數字
最長128位
表也可以復制
復制表結構+記錄 (key不會復制: 主鍵、外鍵和索引)
create table new_service select * from t1;
mysql> create table new_service select * from t1;
Query OK, 2 rows affected (1.07 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> show
-> tables;
+---------------+
| Tables_in_db1 |
+---------------+
| new_service |
| t1 |
+---------------+
2 rows in set (0.00 sec)
mysql> desc new_service;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| num | char(1) | YES | | NULL | |
| id | int(11) | YES | | NULL | |
| name | char(1) | YES | | NULL | |
| sex | char(1) | YES | | NULL | |
| hobby | char(1) | YES | | NULL | |
| job | char(1) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
6 rows in set (0.01 sec)
mysql> select * from new_service;
+------+------+------+------+-------+------+
| num | id | name | sex | hobby | job |
+------+------+------+------+-------+------+
| NULL | 1 | 1 | 1 | 男 | 無 |
| NULL | 1 | 1 | 1 | 男 | 無 |
+------+------+------+------+-------+------+
2 rows in set (0.00 sec)
只復制表結構
create table t2 select * from t1 where 1=2; //條件為假,查不到任何記錄
mysql> create table t2 select * from t1 where 1=2;
Query OK, 0 rows affected (1.07 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| new_service |
| t1 |
| t2 |
+---------------+
3 rows in set (0.00 sec)
mysql> desc t2;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| num | char(1) | YES | | NULL | |
| id | int(11) | YES | | NULL | |
| name | char(1) | YES | | NULL | |
| sex | char(1) | YES | | NULL | |
| hobby | char(1) | YES | | NULL | |
| job | char(1) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
6 rows in set (0.01 sec)
mysql> select * from t2;
Empty set (0.00 sec)
還有種簡單的:
create table t3 like t1;
mysql> create table t3 like t1;
Query OK, 0 rows affected (1.03 sec)
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| new_service |
| t1 |
| t2 |
| t3 |
+---------------+
4 rows in set (0.00 sec)
mysql> desc t3;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| num | char(1) | YES | | NULL | |
| id | int(11) | YES | | NULL | |
| name | char(1) | YES | | NULL | |
| sex | char(1) | YES | | NULL | |
| hobby | char(1) | YES | | NULL | |
| job | char(1) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
6 rows in set (0.01 sec)
mysql> select * from t3;
Empty set (0.00 sec)
查
show create database db1;
(展示 創建 數據庫 db1)
mysql> show create database db1;
+----------+--------------------------------------------------------------+
| Database | Create Database |
+----------+--------------------------------------------------------------+
| db1 | CREATE DATABASE `db1` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+--------------------------------------------------------------+
1 row in set (0.00 sec)
show databases;
(展示 所有數據庫)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| db1 |
| mysql |
| performance_schema |
| test |
+--------------------+
6 rows in set (0.00 sec)
改
改其實無非就是改編碼格式
alter database db1 charset gbk;
(修改 數據庫 db1 編碼格式 gbk)
mysql> alter database db1 charset gbk;
Query OK, 1 row affected (0.34 sec)
mysql> show create database db1;
+----------+-------------------------------------------------------------+
| Database | Create Database |
+----------+-------------------------------------------------------------+
| db1 | CREATE DATABASE `db1` /*!40100 DEFAULT CHARACTER SET gbk */ |
+----------+-------------------------------------------------------------+
1 row in set (0.00 sec)
是不是編碼格式被修改了!
刪
drop database db1;
(刪掉 數據庫 db1)
mysql> drop database db1;
Query OK, 0 rows affected (0.41 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.00 sec)
這回所有的數據庫中就不再有db1了
那你猜猜在data文件夾里還有db1這個文件夾了嗎??
表(文件)
首先表(文件)必須要在庫(文件夾)下,所以操作之前先建一個庫db1(文件夾)
然后切換到這個文件夾下:
use db1;
(使用 db1)
mysql> use db1;
Database changed
其實這里可以提一句,你可以通過select database();
來看你目前在哪個數據庫下(文件夾里)
mysql> select database();
+------------+
| database() |
+------------+
| db1 |
+------------+
1 row in set (0.00 sec)
增
要創建一個表,是不是應該有相應字段(比如前一節例子的 姓名,性別之類的),同時要給每一個字段的類型
create table t1(id int,name char,age int,sex char,hobby char,job char);
(創建 表 t1(id int型,name char型,... ...))
mysql> create table t1(id int,name char,age int,sex char,hobby char,job char);
Query OK, 0 rows affected (1.17 sec)
那我們去找一下db1文件夾,看看里面是不是新建了表(自己去看)
那總結起來,其實就是如下的格式:
create table 表名(
字段名1 類型[(寬度) 約束條件],
字段名2 類型[(寬度) 約束條件],
字段名3 類型[(寬度) 約束條件]
);
注意:
- 在同一張表中,字段名是不能相同
- 寬度和約束條件可選
- 字段名和類型是必須的
- 最后一個數據之后不要加'',''
aletr table t1 add times char;
(修改 表 t1 加 times 字符串類型)
mysql> desc t1;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | char(1) | YES | | NULL | |
| sex | char(1) | YES | | NULL | |
| hobby | char(1) | YES | | NULL | |
| job | char(1) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
5 rows in set (0.01 sec)
mysql> alter table t1
-> add times char;
Query OK, 0 rows affected (1.29 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc t1;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | char(1) | YES | | NULL | |
| sex | char(1) | YES | | NULL | |
| hobby | char(1) | YES | | NULL | |
| job | char(1) | YES | | NULL | |
| times | char(1) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
6 rows in set (0.01 sec)
默認添加在最后,當然你也可以添加到開頭
aletr table t1 add times char first;
mysql> alter table t1
-> add num char first;
Query OK, 0 rows affected (1.45 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc t1;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| num | char(1) | YES | | NULL | |
| id | int(11) | YES | | NULL | |
| name | char(1) | YES | | NULL | |
| sex | char(1) | YES | | NULL | |
| hobby | char(1) | YES | | NULL | |
| job | char(1) | YES | | NULL | |
| times | char(1) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
7 rows in set (0.01 sec)
查
show create table t1;
(展示 創建 表 t1)
mysql> show create table t1;
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t1 | CREATE TABLE `t1` (
`id` int(11) DEFAULT NULL,
`name` char(1) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`sex` char(1) DEFAULT NULL,
`hobby` char(1) DEFAULT NULL,
`job` char(1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
可能是會拿到這種亂七八糟的,就是因為他想給你拼個表格出來,但是太多了,就拼錯了
但是關鍵的信息我們還是能看到的對吧
show tables;
(展示 所有表)
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| t1 |
+---------------+
1 row in set (0.00 sec)
desc t1;
(查看列和數據類型 t1)
mysql> desc t1;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| num | char(1) | YES | | NULL | |
| id | int(11) | YES | | NULL | |
| name | char(1) | YES | | NULL | |
| sex | char(1) | YES | | NULL | |
| hobby | char(1) | YES | | NULL | |
| job | char(1) | YES | | NULL | |
| times | char(1) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
6 rows in set (0.35 sec)
看着舒服點了吧~~~
改
alter table t1 rename t2;
(修改 表 t1 重命名 t2)
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| t1 |
+---------------+
1 row in set (0.06 sec)
mysql> alter table t1
-> rename t2;
Query OK, 0 rows affected (0.57 sec)
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| t2 |
+---------------+
1 row in set (0.00 sec)
alter table t1 modify name char(5);
(修改 表 t1 修改 name字段 char(5))
mysql> alter table t1 modify name char(5);
Query OK, 0 rows affected (1.57 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc t1;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| num | char(1) | YES | | NULL | |
| id | int(11) | YES | | NULL | |
| name | char(5) | YES | | NULL | |
| sex | char(1) | YES | | NULL | |
| hobby | char(1) | YES | | NULL | |
| job | char(1) | YES | | NULL | |
| times | char(1) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
6 rows in set (0.01 sec)
除了改字符長度,還可以修改字段
alter table t1 change name NAME char(5);
(修改 表 t1 改變 name 為 NAME char(5))
mysql> alter table t1 change name NAME char(5);
Query OK, 0 rows affected (0.51 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc t1;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| num | char(1) | YES | | NULL | |
| id | int(11) | YES | | NULL | |
| NAME | char(5) | YES | | NULL | |
| sex | char(1) | YES | | NULL | |
| hobby | char(1) | YES | | NULL | |
| job | char(1) | YES | | NULL | |
| times | char(1) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
6 rows in set (0.01 sec)
刪
drop table t1;
(刪掉 表 t1)
mysql> drop table t1;
Query OK, 0 rows affected (0.55 sec)
mysql> show tables;
Empty set (0.00 sec)
看看你的data文件夾下的db1還有文件了嗎?
alter table t1 drop times;
(修改 表 t1 刪掉 times)
mysql> desc t1;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| num | char(1) | YES | | NULL | |
| id | int(11) | YES | | NULL | |
| name | char(1) | YES | | NULL | |
| sex | char(1) | YES | | NULL | |
| hobby | char(1) | YES | | NULL | |
| job | char(1) | YES | | NULL | |
| times | char(1) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
7 rows in set (0.01 sec)
mysql> alter table t1
-> drop times;
Query OK, 0 rows affected (1.48 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc t1;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| num | char(1) | YES | | NULL | |
| id | int(11) | YES | | NULL | |
| name | char(1) | YES | | NULL | |
| sex | char(1) | YES | | NULL | |
| hobby | char(1) | YES | | NULL | |
| job | char(1) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
6 rows in set (0.01 sec)
接下來的這些寫法,你現在可能不知道什么意思,但是要記下來
1.修改存儲引擎
mysql> alter table t1
他
-> engine=innodb;
2.添加stu_num到name字段之后
mysql> alter table t1
-> add stu_num int after name;
3.修改字段類型
mysql> alter table t1
-> modify age int(3);
4.增加約束(針對已有的主鍵增加auto_increment)
mysql> alter table t1 modify id int(11) not null primary key auto_increment;
ERROR 1068 (42000): Multiple primary key defined
mysql> alter table t1 modify id int(11) not null auto_increment;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
5.對已經存在的表增加復合主鍵
mysql> alter table t1
-> add primary key(host_ip,port);
6.增加主鍵
mysql> alter table t1
-> modify name char primary key;
7.增加主鍵和自動增長
mysql> alter table t1
-> modify id int primary key auto_increment;
8.刪除主鍵
mysql> alter table t1 modify id int(11) not null; #刪除自增約束
mysql> alter table t1
-> drop primary key; #刪除主鍵
記錄
對記錄的操作首先要有庫和表對吧
mysql> desc t1;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | char(1) | YES | | NULL | |
| sex | char(1) | YES | | NULL | |
| hobby | char(1) | YES | | NULL | |
| job | char(1) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
5 rows in set (0.44 sec)
增
insert t1(id,name,sex,hobby,job)values(1,'張三',18,'男','無業');
(插入 t1... ...)
mysql> insert t1(id,name,sex,hobby,job)values(1,'張三',18,'男','無業');
Query OK, 1 row affected, 3 warnings (0.44 sec)
多個添加:
insert t1(id,name,sex,hobby,job)values(1,'張三',18,'男','無業'),(2,'李四',20,'女','學生');
mysql> insert t1(id,name,sex,hobby,job)values(1,'張三',18,'男','無業'),(2,'李四',20,'女','學生');
Query OK, 2 rows affected, 6 warnings (0.38 sec)
Records: 2 Duplicates: 0 Warnings: 6
mysql> select * from t1;
+------+------+------+-------+------+
| id | name | sex | hobby | job |
+------+------+------+-------+------+
| 1 | 1 | 1 | 男 | 無 |
| 1 | 張 | 1 | 男 | 無 |
| 2 | 李 | 2 | 女 | 學 |
+------+------+------+-------+------+
3 rows in set (0.00 sec)
查
select * from t1;
(查找 所有 從 t1)
mysql> select * from t1;
+------+------+------+-------+------+
| id | name | sex | hobby | job |
+------+------+------+-------+------+
| 1 | 張 | 1 | 男 | 無 |
+------+------+------+-------+------+
1 row in set (0.00 sec)
這么寫的前提是你已經在db1下面了,如果不在 后面的t1 就改寫成db1.t1就好了
如果我只查姓名,就把*改成字段name 如果查姓名年齡,就改成 name,age
然后你就會發現,少字了
其實到這就該跟你說,char(數字)代表着這個字段容納的字符個數,因為都是1,所以只留一個
我們可以修改一下!
改
update db1.t1 set name = '1';
(更新 db1里面的t1表 設置 name 為 1)
一旦是這么寫的會發生什么呢?
mysql> update db1.t1 set name = '1';
Query OK, 2 rows affected (0.38 sec)
Rows matched: 3 Changed: 2 Warnings: 0
mysql> select * from t1;
+------+------+------+-------+------+
| id | name | sex | hobby | job |
+------+------+------+-------+------+
| 1 | 1 | 1 | 男 | 無 |
| 1 | 1 | 1 | 男 | 無 |
| 2 | 1 | 2 | 女 | 學 |
+------+------+------+-------+------+
3 rows in set (0.00 sec)
我會發現我把所有的name都改掉了,那我要是只想改id=2的name呢?
update db1.t1 set name = '1' where id = 2;
mysql> update db1.t1 set name = 'haha' where id = 2;
Query OK, 1 row affected, 1 warning (0.38 sec)
Rows matched: 1 Changed: 1 Warnings: 1
mysql> select * from t1;
+------+------+------+-------+------+
| id | name | sex | hobby | job |
+------+------+------+-------+------+
| 1 | 1 | 1 | 男 | 無 |
| 1 | 1 | 1 | 男 | 無 |
| 2 | h | 2 | 女 | 學 |
+------+------+------+-------+------+
3 rows in set (0.00 sec)
刪
delete from t1 where id = 2;
(刪除 從t1 ... ...)
mysql> delete from t1 where id = 2;
Query OK, 1 row affected (0.38 sec)
mysql> select * from t1;
+------+------+------+-------+------+
| id | name | sex | hobby | job |
+------+------+------+-------+------+
| 1 | 1 | 1 | 男 | 無 |
| 1 | 1 | 1 | 男 | 無 |
+------+------+------+-------+------+
2 rows in set (0.00 sec)