數據庫(二):初識sql語句


進擊の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,而且是文件夾的形式吧!

數據庫的命名也是有規范的:

  1. 可以由字母、數字、下划線、@、#、$
  2. 區分大小寫
  3. 唯一性
  4. 不能使用關鍵字如 create select
  5. 不能單獨使用數字
  6. 最長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 類型[(寬度) 約束條件]
);

注意:

  1. 在同一張表中,字段名是不能相同
  2. 寬度和約束條件可選
  3. 字段名和類型是必須的
  4. 最后一個數據之后不要加'',''

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)


*****
*****


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM