MySQL學習筆記一

MySQL目錄結構

這裏寫圖片描述

配置my.ini

MySQL5.7的my.ini位於\ProgramData\MySQL\MySQL Server 5.7目錄下(可能有的版本的my.ini就在安裝目錄下),該該目錄下還有一個data目錄存放咱們的建立的數據庫。 
打開my.ini文件[client]用於配置客戶端,主要就是3306端口。[mysqld]配置的是服務端。 mysql

這裏寫圖片描述

特別要注意一點:編碼方式是utf8而不是utf-8。 
Linux系統中該配置文件在/etc/mysql/my.cnf。linux

 

啓動、關閉重啓MySQL

service mysql start|stop|restart

 

登陸與退出MySQL

root@ubuntu:/etc/mysql# mysql -v    # 查看mysql版本       
mysql  Ver 14.14 Distrib 5.5.35, for debian-linux-gnu (i686) using readline 6.2
root@ubuntu:/etc/mysql# mysql -uroot -p123456 -P3306 -h192.168.132.128 # -u用戶名 -p密碼(爲了安全能夠不寫,會提示輸入) -P端口 -h主機名
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 330
Server version: 5.5.35-0ubuntu0.12.04.2 (Ubuntu)

mysql> \q|exit|quit # 退出mysql

 

修改mysql提示符

一、鏈接mysql時經過--prompt參數指定 sql

這裏寫圖片描述

二、鏈接上客戶端的時候經過prompt命令指定 數據庫

這裏寫圖片描述

MySQL提示符以下表:ubuntu

參數 描述
\D 完整日期
\d 當前數據庫
\h 服務器名
\u 當前用戶

以上的提示符還能連用,例如:安全

mysql> prompt \u@\h \d> # 用戶名@主機名 數據庫名
PROMPT set to '\u@\h \d>'
root@localhost demo>

 

MySQL經常使用命令

SET NAMES gbk; -- 客戶端以GBK的編碼形式呈現數據
mysql> SELECT VERSION();    # 顯示mysql版本,至關於登陸數據庫以前輸入mysql -V
+-------------------------+
| VERSION()               |
+-------------------------+
| 5.5.35-0ubuntu0.12.04.2 |
+-------------------------+
1 row in set (0.00 sec)

mysql> SELECT USER();       #   顯示當前用戶
+----------------+
| USER()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

mysql> SELECT NOW();        # 顯示系統時間
+---------------------+
| NOW()               |
+---------------------+
| 2015-04-05 21:02:31 |
+---------------------+
1 row in set (0.00 sec)

mysql>                      # 在Linux的mysql中也可使用Ctrl+L清屏

 

MySQL語句規範

  • 關鍵字和函數名稱所有大寫;
  • 數據庫名、表名、字段名稱所有小寫;
  • SQL語句必須以分號結束。

 

操做數據庫

建立數據庫服務器

-- 說明:花括號表示必選項,豎線表示多選一,方括號表示可選
CREATE {DATABASE|SCHEMA} [IF NOT EXISTS] db_name [DEFAULT] CHARACTER SET [=] character_name

mysql> CREATE DATABASE t1;
Query OK, 1 row affected (0.00 sec)

mysql>

咱們可使用source命令運行sql腳本。登陸mysql數據庫。函數

source 數據庫腳本名

查看當前服務器中的數據庫列表ui

SHOW {DATABASES | SCHEMAS} [LIKE 'pattern' | WHERE expr]

正確安裝mysql後有4個數據庫: 編碼

這裏寫圖片描述

這裏寫圖片描述

mysql> SHOW CREATE DATABASE t1; # 查看建立數據庫使用的命令
+----------+-------------------------------------------------------------+
| Database | Create Database                                             |
+----------+-------------------------------------------------------------+
| t1       | CREATE DATABASE `t1` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+-------------------------------------------------------------+
1 row in set (0.00 sec)

mysql>

mysql> CREATE DATABASE IF NOT EXISTS t2 CHARACTER SET GBK; # 使用gbk編碼方式建立數據庫
Query OK, 1 row affected (0.00 sec)

mysql> SHOW CREATE DATABASE t2;
+----------+------------------------------------------------------------+
| Database | Create Database                                            |
+----------+------------------------------------------------------------+
| t2       | CREATE DATABASE `t2` /*!40100 DEFAULT CHARACTER SET gbk */ |
+----------+------------------------------------------------------------+
1 row in set (0.00 sec)

mysql>

修改數據庫

ALTER {DATABASE | SCHEMA} [db_name] [DEFAULT] CHARACTER SET [=] character_name

這裏寫圖片描述

刪除數據庫

DROP {DATABASE | SCHEMA} [IF EXISTS] db_name

 

數據類型和操做數據表

數據類型決定了數據的存儲格式,表明了不一樣的信息類型。

1.整型 

這裏寫圖片描述

2.浮點型 (項目開發中以float居多 )

這裏寫圖片描述

3.日期型 

這裏寫圖片描述

項目開發中該類型用得並很少,由於涉及到時區的問題,多用數字表示。 
4.字符型 

這裏寫圖片描述

VARCHAR,TEXT,DATE,TIME,ENUM等類型的數據也須要單引號修飾,而INT,FLOAT,DOUBLE等則不須要。 
使用某個數據庫

mysql> USE test;            # 使用數據庫
Database changed
mysql> SELECT DATABASE();   #查看當前使用的數據庫
+------------+
| DATABASE() |
+------------+
| test       |
+------------+
1 row in set (0.00 sec)

建立表

CREATE TABLE [IF NOT EXISTS] table_name(
    column_name data_type,
    ……
)

--建立用戶表tb_user
CREATE TABLE tb_user(
    username VARCHAR(20),       -- 【用戶名】
    age TINYINT UNSIGNED,       -- 【年齡】     無符號微整數(0~255)
    salary FLOAT(8,2) UNSIGNED  -- 【工資】     一共有8位,小數部分有2位
);

查看錶

SHOW TABLES [FROM da_name] [LIKE 'pattern'|WHERE expr]


mysql> CREATE TABLE tb_user(            # 建立表
    -> username VARCHAR(20),
    -> age TINYINT UNSIGNED,
    -> salary FLOAT(8,2) UNSIGNED
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql> SHOW TABLES;                     # 查看錶
+----------------+
| Tables_in_test |
+----------------+
| tb_user        |
+----------------+
1 row in set (0.00 sec)

查看錶結構

SHOW COLUMNS FROM tb_name # 或者
DESC tb_name

這裏寫圖片描述

重命名錶

RENAME TABLE 原名 TO 新名;
ALTER TABLE 原名 RENAME 新名;
ALTER TABLE 原名 RENAME TO 新名;

插入記錄

INSERT [INTO] tb_name [(col_name,...)] VALUES(val,...)


mysql> INSERT tb_user VALUES('Tom',22,3658.32); # 當咱們省略字段名的時候全部的字段都要賦值!
Query OK, 1 row affected (0.03 sec)

mysql> INSERT tb_user VALUES('Tom',22);
ERROR 1136 (21S01): Column count doesn't match value count at row 1
mysql> 
mysql> INSERT tb_user(username,age) VALUES('Kitty',18); # 爲指定字段賦值
Query OK, 1 row affected (0.03 sec)

記錄的查詢

SELECT expr,... FROM tb_name

mysql> SELECT * FROM tb_user; # 這裏的*表示的是字段的過濾
+----------+------+---------+
| username | age  | salary  |
+----------+------+---------+
| Tom      |   22 | 3658.32 |
| Kitty    |   18 |    NULL |
+----------+------+---------+
2 rows in set (0.00 sec)

空值與非空 

NULL容許空值(默認),NOT NULL禁止非空。例如: 

這裏寫圖片描述

字段的自動編號 
AUTO_INCREMENT該字段要麼是整數,要麼小數位數爲0,且必須和主鍵組合使用,默認狀況下初始值爲1,增量爲1.——保證記錄的惟一性。 
主鍵約束(PRIMARY KEY): 
每張表只能有一個主鍵,可以保證記錄的惟一性,主鍵自動爲NOT NULL,並自動建立索引。 
主鍵咱們能夠寫成KEY或者PRIMARY KEY。 

這裏寫圖片描述

這裏寫圖片描述

 

惟一約束——UNIQUE KEY

  • 惟一約束也能夠保證記錄的惟一性
  • 惟一約束的字段能夠爲NULL
  • 一張表能夠有多個惟一約束
mysql> CREATE TABLE tb_user(
    ->id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
    ->username VARCHAR(20) NOT NULL UNIQUE KEY, age TINYINT UNSIGNED 
    ->);
Query OK, 0 rows affected (0.08 sec)

mysql> DESC tb_user;
+----------+----------------------+------+-----+---------+----------------+
| Field    | Type                 | Null | Key | Default | Extra          |
+----------+----------------------+------+-----+---------+----------------+
| id       | smallint(5) unsigned | NO   | PRI | NULL    | auto_increment |
| username | varchar(20)          | NO   | UNI | NULL    |                |
| age      | tinyint(3) unsigned  | YES  |     | NULL    |                |
+----------+----------------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)

mysql>

這裏寫圖片描述

默認約束-DEFAULT 
當插入記錄時,若是沒有明確爲字段賦值,則自動賦予默認值。

mysql> CREATE TABLE tb_user(
    -> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, -- 主鍵約束,自動編號
    -> username VARCHAR(20) NOT NULL UNIQUE KEY,        -- 惟一約束
    -> sex ENUM('1','2','3') DEFAULT '3'                -- 性別是枚舉值,默認是3(保密)
    -> );
Query OK, 0 rows affected (0.12 sec)

mysql> DESC tb_user;
+----------+----------------------+------+-----+---------+----------------+
| Field    | Type                 | Null | Key | Default | Extra          |
+----------+----------------------+------+-----+---------+----------------+
| id       | smallint(5) unsigned | NO   | PRI | NULL    | auto_increment |
| username | varchar(20)          | NO   | UNI | NULL    |                |
| sex      | enum('1','2','3')    | YES  |     | 3       |                |
+----------+----------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

mysql> INSERT tb_user(username) VALUES('Tom');              # 沒有指定性別時,默認是3
Query OK, 1 row affected (0.08 sec)

mysql> INSERT tb_user(username,sex) VALUES('Kitty','2');    # 指定性別
Query OK, 1 row affected (0.08 sec)

mysql> SELECT * FROM tb_user;
+----+----------+------+
| id | username | sex  |
+----+----------+------+
|  1 | Tom      | 3    |
|  3 | Kitty    | 2    |
+----+----------+------+
2 rows in set (0.00 sec)

 

約束和修改表

外鍵約束和惟一約束

  1. 約束保證了數據的完整性一致性
  2. 約束分爲表級約束和列級約束。
  3. 約束類型包括 
    • NOT NULL(非空約束)
    • PRIMARY KEY(主鍵約束)
    • UNIQUE KEY(惟一約束)
    • DEFAULT(默認約束)
    • FOREIGN KEY(外鍵約束)

外鍵約束:保證數據的完整性、一致性,實現表的一對一或者一對多關係。

外鍵約束的要求

  1. 父表(子表所參照的表)和子表(具備外鍵列的表)使用相同的存儲引擎,禁止使用臨時表。
  2. 表的存儲引擎只能是InnoDB。
  3. 外鍵列(加過FOREIGN關鍵字的列)和參照列(外鍵列所參照的列)必須具備類似的數據類型。其中數字的長度或者是否有符號位必須相同;而字符的長度能夠不一樣。
  4. 外鍵列和參照列必須創建索引。若是外鍵列不存在索引,MySQL將自動建立索引。

編輯表的存儲引擎 
MySQL配置文件default-storage-engine=INNODB 

這裏寫圖片描述

如今咱們要建立一張users表,users表中有省份,只須要在user表中保存省份id就好了,這樣兩張表就聯繫起來了!目前的子表就是users 

這裏寫圖片描述

以上的命令中咱們並無顯式建立索引,可是有了外鍵約束,MySQL會自動建立索引。 

這裏寫圖片描述

這裏寫圖片描述

外鍵約束的參照操做

  1. CASCADE:從父表刪除或更新且自動刪除或更新子表中匹配的行。
  2. SET NULL:從父表刪除或更新行,並設置子表中的外鍵列爲NULL。若是使用該項,必須保證子表列沒有指定NOT NULL
  3. RESTRICT:拒絕對父表刪除或更新操做。
  4. NO ACTION:標準SQL關鍵字,在MYSQL中與RESTRICT相同。

從新創建users表:

# 建表
mysql> CREATE TABLE users(
    -> id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    -> username VARCHAR(10) NOT NULL,
    -> pid SMALLINT UNSIGNED,
    -> FOREIGN KEY (pid) REFERENCES provinces(id) ON DELETE CASCADE -- 在父表中刪除或者更新記錄,同時更新子表中的相應行
    -> );
Query OK, 0 rows affected (0.01 sec)

# 向父表(省份表)中插入記錄
mysql> INSERT provinces(pname) VALUES('A');
Query OK, 1 row affected (0.01 sec)

mysql> INSERT provinces(pname) VALUES('B');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT provinces(pname) VALUES('C');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM provinces;
+----+-------+
| id | pname |
+----+-------+
|  1 | A     |
|  2 | B     |
|  3 | C     |
+----+-------+
3 rows in set (0.07 sec)
mysql>

這裏寫圖片描述

刪除父表(province表中的記錄後) 

這裏寫圖片描述

在實際的開發中咱們不多使用物理的外鍵約束,由於它只支持InnoDB這一種引擎。所謂邏輯的外鍵約束指的是咱們在定義2張表的時候肯定兩張表的關係而不去使用FOREIGN KEY這個關鍵字。

表級約束和列級約束

  • 對一個數據列創建的約束,稱爲列級約束。
  • 對多個數據列創建的約束,稱爲表級約束。
  • 列級約束既能夠在列定義時聲明,也能夠在列定義後聲明。
  • 表級約束只能在列定義後聲明。
  • 在實際的開發中常用的是列級約束。

修改數據表

增長列

-- 添加單列
ALTER TABLE tb_name ADD [COLUMN] col_name column_definition [FIRST|AFTER col_name]

-- 添加多列,不能指定列的位置關係
ALTER TABLE tb_name ADD [COLUMN] (col_name col_definition,...)

這裏寫圖片描述

這裏寫圖片描述

刪除列

-- 刪除列
 ALTER TABLE tb_name DROP [COLUMN] col_name

刪除列的同時能夠新增列,同理新增列的同時能夠刪除列,操做之間以逗號分隔。

添加約束

-- 添加主鍵約束
ALTER TABLE tb_name ADD [CONSTRAINT[symbol]] PRIMARY KEY [index_type] (index_col_name,...)

-- 添加惟一約束
ALTER TABLE tb_name ADD [CONSTRAINT[symbol]] UNIQUE [INDEX|KEY] [index_name] [index_type] (index_col_name,...)

-- 添加外鍵約束
ALTER TABLE tb_name ADD [CONSTRAINT[symbol]] FOREIGN KEY [index_name] [index_type] (index_col_name,...) reference_definiton

-- 添加/刪除默認約束
ALTER TABLE tb_name ALTER [CONSTRAINT] col_name {SET DEFAULT literal|DROP DEFAULT}

例如:爲users表的id字段添加主鍵: 

這裏寫圖片描述

這裏寫圖片描述

爲username字段添加惟一約束: 

這裏寫圖片描述

爲users表添加外鍵:

這裏寫圖片描述

這裏寫圖片描述

爲age字段添加默認值: 

這裏寫圖片描述

刪除age字段的默認值: 

這裏寫圖片描述

刪除約束

-- 刪除主鍵約束
ALTER TABLE tb_name DROP PRIMARY KEY

-- 刪除惟一約束(首先要知道索引的名字SHOW INDEXES FROM tb_name\G命令)
ALTER TABLE tb_name DROP {INDEX|KEY} inedx_name

-- 刪除外鍵約束(須要知道外鍵約束的名稱:SHOW CREATE TABLE tb_name命令)
ALTER TABLE tb_name DROP FOREIGN KEY fk_symbol

例: 
刪除users表的id字段的主鍵約束: 

這裏寫圖片描述

刪除users表的username字段的惟一約束: 

這裏寫圖片描述

這裏寫圖片描述

刪除users表的pid字段的外鍵約束: 

這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

修改列定義和列名稱

-- 修改列定義(由大類型改成小類型的時候可能會丟失數據)
ALTER TABLE tb_name MODIFY [COLUMN] col_name column_definition [FIRST|AFTER col_name]

-- 修改列名稱
ALTER TABLE tb_name CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST|AFTER col_name]

例: 
將users表的id字段變爲第一列: 

這裏寫圖片描述

將users表的pid字段的名稱和類型同時修改: 

這裏寫圖片描述

修改表名

-- 方法一
ALTER TABLE tb_name RENAME [TO|AS] new_tb_name

-- 方法二,能夠爲多張數據表改名
RENAME TABLE tb_name TO new_tb_name [,tb_name2 TO new_tb_name2]...

例: 
將users表改名爲user: 

這裏寫圖片描述

這裏寫圖片描述

在實際的開發中應該儘可能避免數據列和表的改名——可能致使某些視圖或者存儲過程沒法工做!

記錄的操做

插入記錄——INSERT

-- 若是省略了列名,表示全部的字段都要賦值;插入語句能夠一次性插入多條記錄
INSERT [INTO] tb_name [(col_name,...)] {VALUES|VALUE} ({expr|DEFAULT},...),(...),...


--首先建立一張user表:
CREATE TABLE user(
    id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(20) NOT NULL,
    password VARCHAR(32) NOT NULL,
    age TINYINT UNSIGNED NOT NULL DEFAULT 10,
    sex BOOLEAN
);


--向user表中插入記錄:
INSERT user VALUES(NULL,'A','111',11,1);            -- id字段爲了保持自增可使用NULL或者DEFAULT
INSERT user VALUE(DEFAULT,'B','222',31,2);
INSERT user(username,password) VALUES ('C','333');  -- 指定插入的字段
INSERT user VALUES(8,'D','444',36,2);               -- 人爲指定id,該id必須不存在,後面記錄的編號以此爲基準
INSERT user VALUES(NULL,'G','555',DEFAULT,2);       -- 保持age字段的默認值

-- 同時插入多條記錄(中間用逗號分隔),列能夠是函數或者表達式,md5()是MySQL內置函數
INSERT user VALUES(NULL,'E',md5('666'),3*5-6,2),(NULL,'F','777',18,2); 

SELECT * FROM user;                                 -- 運行結果

+----+----------+----------------------------------+-----+------+
| id | username | password                         | age | sex  |
+----+----------+----------------------------------+-----+------+
|  1 | A        | 111                              |  11 |    1 |
|  2 | B        | 222                              |  31 |    2 |
|  3 | C        | 333                              |  10 | NULL |
|  8 | D        | 444                              |  36 |    2 |
|  9 | G        | 555                              |  10 |    2 |
| 10 | E        | fae0b27c451c728867a567e8c1bb4e53 |   9 |    2 |
| 11 | F        | 777                              |  18 |    2 |
+----+----------+----------------------------------+-----+------+
7 rows in set (0.00 sec)

INSERT SET-SELECT

-- INSERT SET方式。可使用子查詢(SubQuery),只能一次插入一條記錄;用得較少
INSERT [INTO] tb_name SET col_name={expr|DEFAULT},...

-- INSERT SELECT方式(將查詢結果寫入到表)
INSERT [INTO] tb_name [(col_name,...)] SELECT ...

--使用INSERT-SET 方式向表中插入記錄:
INSERT user SET username='G',password=md5('888');

SELECT * FROM user;
+----+----------+----------------------------------+-----+------+
| id | username | password                         | age | sex  |
+----+----------+----------------------------------+-----+------+
|  1 | A        | 111                              |  11 |    1 |
|  2 | B        | 222                              |  31 |    2 |
|  3 | C        | 333                              |  10 | NULL |
|  8 | D        | 444                              |  36 |    2 |
|  9 | G        | 555                              |  10 |    2 |
| 10 | E        | fae0b27c451c728867a567e8c1bb4e53 |   9 |    2 |
| 11 | F        | 777                              |  18 |    2 |
| 12 | G        | 0a113ef6b61820daa5611c870ed8d5ee |  10 | NULL |
+----+----------+----------------------------------+-----+------+
8 rows in set (0.00 sec)

有子查詢的插入操做 
1.創建一張test表:

CREATE TABLE test(
    id TINYINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, 
    username VARCHAR(20)
);

--user表和test表分別以下:
mysql> SELECT * FROM test;
Empty set (0.00 sec)

mysql> SELECT * FROM user;
+----+----------+----------------------------------+-----+------+
| id | username | password                         | age | sex  |
+----+----------+----------------------------------+-----+------+
|  1 | A        | 111                              |  15 |    0 |
|  3 | C        | 333                              |  12 |    0 |
|  8 | D        | 444                              |  43 |    1 |
|  9 | G        | 555                              |   6 |    0 |
| 10 | E        | fae0b27c451c728867a567e8c1bb4e53 |  14 |    1 |
| 11 | F        | 777                              |  12 |    0 |
| 12 | G        | 0a113ef6b61820daa5611c870ed8d5ee |  13 |    1 |
+----+----------+----------------------------------+-----+------+

--如今須要將user表中年齡大於12的用戶插入到test表:
mysql> INSERT test(username) SELECT username FROM user WHERE age > 12;
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM test;
+----+----------+
| id | username |
+----+----------+
|  1 | A        |
|  2 | D        |
|  3 | E        |
|  4 | G        |
+----+----------+
4 rows in set (0.00 sec)

單表記錄更新——UPDATE

-- 若是省略了WHERE條件全部的記錄將所有更新!
UPDATE [LOW_PRIORITY] [IGNORE] table_reference SET col_name1={expr1|DEFAULT} [,col_name2={expr2|DEFAULT}] ... [WHERE where_condition]




SELECT * FROM user;
+----+----------+----------------------------------+-----+------+
| id | username | password                         | age | sex  |
+----+----------+----------------------------------+-----+------+
|  1 | A        | 111                              |  11 |    1 |
|  2 | B        | 222                              |  31 |    2 |
|  3 | C        | 333                              |  10 | NULL |
|  8 | D        | 444                              |  36 |    2 |
|  9 | G        | 555                              |  10 |    2 |
| 10 | E        | fae0b27c451c728867a567e8c1bb4e53 |   9 |    2 |
| 11 | F        | 777                              |  18 |    2 |
| 12 | G        | 0a113ef6b61820daa5611c870ed8d5ee |  10 | NULL |
+----+----------+----------------------------------+-----+------+
8 rows in set (0.00 sec)
UPDATE user SET age = age + 5;                      -- 讓表中的年齡字段都在各自的基礎上加5
Query OK, 8 rows affected (0.11 sec)
Rows matched: 8  Changed: 8  Warnings: 0

SELECT * FROM user; 
+----+----------+----------------------------------+-----+------+
| id | username | password                         | age | sex  |
+----+----------+----------------------------------+-----+------+
|  1 | A        | 111                              |  16 |    1 |
|  2 | B        | 222                              |  36 |    2 |
|  3 | C        | 333                              |  15 | NULL |
|  8 | D        | 444                              |  41 |    2 |
|  9 | G        | 555                              |  15 |    2 |
| 10 | E        | fae0b27c451c728867a567e8c1bb4e53 |  14 |    2 |
| 11 | F        | 777                              |  23 |    2 |
| 12 | G        | 0a113ef6b61820daa5611c870ed8d5ee |  15 | NULL |
+----+----------+----------------------------------+-----+------+
8 rows in set (0.01 sec)

UPDATE user SET age = age - id,sex = 0;             -- 將年齡字段改成各自的年齡減去id,性別都變成0
Query OK, 8 rows affected (0.00 sec)
Rows matched: 8  Changed: 8  Warnings: 0

SELECT * FROM user; 
+----+----------+----------------------------------+-----+------+
| id | username | password                         | age | sex  |
+----+----------+----------------------------------+-----+------+
|  1 | A        | 111                              |  15 |    0 |
|  2 | B        | 222                              |  34 |    0 |
|  3 | C        | 333                              |  12 |    0 |
|  8 | D        | 444                              |  33 |    0 |
|  9 | G        | 555                              |   6 |    0 |
| 10 | E        | fae0b27c451c728867a567e8c1bb4e53 |   4 |    0 |
| 11 | F        | 777                              |  12 |    0 |
| 12 | G        | 0a113ef6b61820daa5611c870ed8d5ee |   3 |    0 |
+----+----------+----------------------------------+-----+------+
8 rows in set (0.00 sec)

UPDATE user SET age = age + 10 WHERE id % 2 = 0;    -- 讓全部的id爲偶數的用戶年齡在原來的基礎上加10(注意是一個等號)
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4  Changed: 4  Warnings: 0

SELECT * FROM user; 
+----+----------+----------------------------------+-----+------+
| id | username | password                         | age | sex  |
+----+----------+----------------------------------+-----+------+
|  1 | A        | 111                              |  15 |    0 |
|  2 | B        | 222                              |  44 |    0 |
|  3 | C        | 333                              |  12 |    0 |
|  8 | D        | 444                              |  43 |    0 |
|  9 | G        | 555                              |   6 |    0 |
| 10 | E        | fae0b27c451c728867a567e8c1bb4e53 |  14 |    0 |
| 11 | F        | 777                              |  12 |    0 |
| 12 | G        | 0a113ef6b61820daa5611c870ed8d5ee |  13 |    0 |
+----+----------+----------------------------------+-----+------+
8 rows in set (0.00 sec)

 

單表刪除記錄

-- 注意:若是省略WHERE條件將刪除數據表中的所有記錄!
DELETE FROM tb_name [WHERE where_condition]


DELETE FROM user WHERE id = 2;  -- 刪除id爲2的記錄,刪除以後該id不會重用
DELETE FROM user;               -- 刪除全表記錄

 

查詢表達式解析

--
SELECT select_expr [,select_expr ...]
[
    FROM table_references
    [WHERE where_condition]
    [GROUP BY {col_name | position} [ASC|DESC], ...]
    [HAVING where_condition]
    [ORDER BY {col_name | expr | position} [ASC|DESC], ...]
    [LIMIT {[offest,] row_count | row_count OFFEST offest}]
]

--SELECT語句最基本要有SELECT關鍵字和查詢表達式,例如:
mysql> SELECT 9.9 + 1.1;
+-----------+
| 9.9 + 1.1 |
+-----------+
|      11.0 |
+-----------+
1 row in set (0.00 sec)

mysql> SELECT NOW();
+---------------------+
| NOW()               |
+---------------------+
| 2015-04-08 18:56:56 |
+---------------------+
1 row in set (0.09 sec)

mysql>

查詢表達式

  • 每個表達式表示想要的一列,至少要有一個。
  • 多個列之間以逗號分隔。
  • 星號(*)表示全部列。tb_name.*表示命名錶的全部列。
  • 查詢表達式可使用[AS] alias_name爲其賦予別名。
  • 別名能夠用於GROUP BY,ORDER BY或者HAVING子句。

例:

mysql> SHOW COLUMNS FROM user;
+----------+----------------------+------+-----+---------+----------------+
| Field    | Type                 | Null | Key | Default | Extra          |
+----------+----------------------+------+-----+---------+----------------+
| id       | smallint(5) unsigned | NO   | PRI | NULL    | auto_increment |
| username | varchar(20)          | NO   |     | NULL    |                |
| password | varchar(32)          | NO   |     | NULL    |                |
| age      | tinyint(3) unsigned  | NO   |     | 10      |                |
| sex      | tinyint(1)           | YES  |     | NULL    |                |
+----------+----------------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

mysql> SELECT password,username FROM user;          -- 查詢表達式的列的順序決定結果集的順序
mysql> SELECT user.password,user.username FROM user;-- 該語句與上面的等效,使用多表鏈接的時候可能兩張表的字段相同
+----------------------------------+----------+
| password                         | username |
+----------------------------------+----------+
| 111                              | A        |
| 333                              | C        |
| 444                              | D        |
| 555                              | G        |
| fae0b27c451c728867a567e8c1bb4e53 | E        |
| 777                              | F        |
| 0a113ef6b61820daa5611c870ed8d5ee | G        |
+----------------------------------+----------+
7 rows in set (0.00 sec)

mysql> SELECT id AS user_id,username AS user_name FROM user;-- 使用別名(影響結果集的列名)
+---------+-----------+
| user_id | user_name |
+---------+-----------+
|       1 | A         |
|       3 | C         |
|       8 | D         |
|       9 | G         |
|      10 | E         |
|      11 | F         |
|      12 | G         |
+---------+-----------+
7 rows in set (0.00 sec)

mysql> SELECT id username FROM user; -- 別名的使用能夠省略AS關鍵字,下面的username就做爲了id的別名
+----------+
| username |                         -- 強烈建議使用別名的時候加上AS關鍵字,上面的語句很容易讓人抽風
+----------+
|        1 |
|        3 |
|        8 |
|        9 |
|       10 |
|       11 |
|       12 |
+----------+
7 rows in set (0.00 sec)

使用WHERE語句進行條件查詢

  • WHERE語句的做用是對記錄進行過濾,若是沒有指定WHERE子句,則顯示全部記錄。
  • 在WHERE表達式中,可使用MySQL支持的函數或者運算符。

使用GROUP BY對結果集進行分組

[GROUP BY {col_name | position} [ASC|DESC], ... ]

--例
mysql> SELECT * FROM user;
+----+----------+----------------------------------+-----+------+
| id | username | password                         | age | sex  |
+----+----------+----------------------------------+-----+------+
|  1 | A        | 111                              |  15 |    0 |
|  3 | C        | 333                              |  12 |    0 |
|  8 | D        | 444                              |  43 |    1 |
|  9 | G        | 555                              |   6 |    0 |
| 10 | E        | fae0b27c451c728867a567e8c1bb4e53 |  14 |    1 |
| 11 | F        | 777                              |  12 |    0 |
| 12 | G        | 0a113ef6b61820daa5611c870ed8d5ee |  13 |    1 |
+----+----------+----------------------------------+-----+------+
7 rows in set (0.00 sec)

mysql> SELECT sex FROM user GROUP BY sex;   -- 結果集按照性別分組
+------+
| sex  |
+------+
|    0 |
|    1 |
+------+
2 rows in set (0.13 sec)

使用HAVING語句設置分組條件

注意:HAVING子句後面要麼是聚合函數,要麼HAVING後面的字段出如今查找字段內。

mysql> SELECT * FROM user;
+----+----------+----------------------------------+-----+------+
| id | username | password                         | age | sex  |
+----+----------+----------------------------------+-----+------+
|  1 | A        | 111                              |  15 |    0 |
|  3 | C        | 333                              |  12 |    0 |
|  8 | D        | 444                              |  43 |    1 |
|  9 | G        | 555                              |   6 |    0 |
| 10 | E        | fae0b27c451c728867a567e8c1bb4e53 |  14 |    1 |
| 11 | F        | 777                              |  12 |    0 |
| 12 | G        | 0a113ef6b61820daa5611c870ed8d5ee |  13 |    1 |
+----+----------+----------------------------------+-----+------+
7 rows in set (0.00 sec)

mysql> SELECT sex FROM user GROUP BY sex HAVING count(id) > 3; -- HAVING後面跟的是聚合函數
+------+
| sex  |
+------+
|    0 |
+------+
1 row in set (0.10 sec)

mysql> SELECT sex,age FROM user GROUP BY sex HAVING age > 15; -- HAVING後面出現的字段在查詢字段中
+------+-----+
| sex  | age |
+------+-----+
|    1 |  43 |
+------+-----+
1 row in set (0.00 sec)

使用ORDER BY對結果集進行排序

[ORDER BY {col_name | expr | position} [ASC | DESC], ... ]

--例
mysql> SELECT * FROM user; -- 默認是按照id升序排列
+----+----------+----------------------------------+-----+------+
| id | username | password                         | age | sex  |
+----+----------+----------------------------------+-----+------+
|  1 | A        | 111                              |  15 |    0 |
|  3 | C        | 333                              |  12 |    0 |
|  8 | D        | 444                              |  43 |    1 |
|  9 | G        | 555                              |   6 |    0 |
| 10 | E        | fae0b27c451c728867a567e8c1bb4e53 |  14 |    1 |
| 11 | F        | 777                              |  12 |    0 |
| 12 | G        | 0a113ef6b61820daa5611c870ed8d5ee |  13 |    1 |
+----+----------+----------------------------------+-----+------+
7 rows in set (0.00 sec)

mysql> SELECT * FROM user ORDER BY id DESC; -- 按照id降序排列
+----+----------+----------------------------------+-----+------+
| id | username | password                         | age | sex  |
+----+----------+----------------------------------+-----+------+
| 12 | G        | 0a113ef6b61820daa5611c870ed8d5ee |  13 |    1 |
| 11 | F        | 777                              |  12 |    0 |
| 10 | E        | fae0b27c451c728867a567e8c1bb4e53 |  14 |    1 |
|  9 | G        | 555                              |   6 |    0 |
|  8 | D        | 444                              |  43 |    1 |
|  3 | C        | 333                              |  12 |    0 |
|  1 | A        | 111                              |  15 |    0 |
+----+----------+----------------------------------+-----+------+
7 rows in set (0.00 sec)

mysql> SELECT * FROM user ORDER BY age ASC,id DESC; -- 按照年齡升序、id降序。權重年齡大於id
+----+----------+----------------------------------+-----+------+
| id | username | password                         | age | sex  |
+----+----------+----------------------------------+-----+------+
|  9 | G        | 555                              |   6 |    0 |
| 11 | F        | 777                              |  12 |    0 |
|  3 | C        | 333                              |  12 |    0 |
| 12 | G        | 0a113ef6b61820daa5611c870ed8d5ee |  13 |    1 |
| 10 | E        | fae0b27c451c728867a567e8c1bb4e53 |  14 |    1 |
|  1 | A        | 111                              |  15 |    0 |
|  8 | D        | 444                              |  43 |    1 |
+----+----------+----------------------------------+-----+------+
7 rows in set (0.00 sec)

使用LIMIT語句限制結果集的數量

-- OFFSET經常使用於PHP中的分頁(當前頁面-1)* 每頁顯示的記錄數
[LIMIT {[offset,] row_count | row_count OFFSET offset}]

子查詢與鏈接

數據準備

--  建立商品表
  CREATE TABLE IF NOT EXISTS tdb_goods(
    goods_id    SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    goods_name  VARCHAR(150) NOT NULL,
    goods_cate  VARCHAR(40)  NOT NULL,
    brand_name  VARCHAR(40)  NOT NULL,
    goods_price DECIMAL(15,3) UNSIGNED NOT NULL DEFAULT 0,
    is_show     BOOLEAN NOT NULL DEFAULT 1,
    is_saleoff  BOOLEAN NOT NULL DEFAULT 0
  );

-- 向商品表中插入22條記錄
INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('R510VC 15.6英寸筆記本','筆記本','華碩','3399',DEFAULT,DEFAULT) ENGINE=InnoDB DEFAULT CHARSET=utf8;;

-- 省略

INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('商務雙肩揹包','筆記本配件','索尼','99',DEFAULT,DEFAULT);
  • 子查詢必須嵌套在循環內部,其必須出如今圓括號內。
  • 子查詢能夠包含多個關鍵字或者條件,如:DISTINCT、GROUP BY、ORDER BY、LIMIT,函數等。
  • 子查詢的外層查詢能夠是:SELECT 、INSERT、 UPDATE 、SET、 或者DO。【這裏的查詢並非指查找,是全部SQL語句的統稱】。

子查詢的返回值: 
子查詢能夠返回標量、一行、一列或者子查詢。

使用比較運算符的子查詢

= ,>,>= , < ,<=,<> !=,<=>,經常使用ANY,SOME,ALL來修飾,語法:

operand comparison_operator subquery

operand comparision_operator ANY (subquery)
operand comparision_operator SOME (subquery)
operand comparision_operator ALL (subquery)

這裏寫圖片描述

例:

mysql> SELECT AVG(goods_price) FROM tdb_goods; -- 查詢全部商品價格的平均值
+------------------+
| AVG(goods_price) |
+------------------+
|     5636.3636364 |
+------------------+
1 row in set (0.00 sec)

mysql> SELECT ROUND(AVG(goods_price),2) FROM tdb_goods; -- 查詢商品價格平均值四捨五入保留2位小數
+---------------------------+
| ROUND(AVG(goods_price),2) |
+---------------------------+
|                   5636.36 |
+---------------------------+
1 row in set (0.00 sec)

mysql> SELECT goods_id,goods_name,goods_price FROM tdb_goods -- 查看商品價格大於等於平均價格的商品id,名稱和價格
    -> WHERE goods_price >= ( SELECT ROUND(AVG(goods_price),2) FROM tdb_goods ); -- 子查詢
+----------+-----------------------------------------+-------------+
| goods_id | goods_name                              | goods_price |
+----------+-----------------------------------------+-------------+
|        3 | G150TH 15.6英寸遊戲本                   |    8499.000 |
|        7 | SVP13226SCB 13.3英寸觸控超極本          |    7999.000 |
|       13 | iMac ME086CH/A 21.5英寸一體電腦         |    9188.000 |
|       17 | Mac Pro MD878CH/A 專業級臺式電腦        |   28888.000 |
|       18 |  HMZ-T3W 頭戴顯示設備                   |    6999.000 |
|       20 | X3250 M4機架式服務器 2583i14            |    6888.000 |
|       21 |  HMZ-T3W 頭戴顯示設備                   |    6999.000 |
+----------+-----------------------------------------+-------------+
7 rows in set (0.00 sec)

mysql> SELECT goods_id,goods_price FROM tdb_goods  -- 查詢商品價格大於【全部】超極本的商品的id,價格
    -> WHERE goods_price > ALL ( SELECT goods_price FROM tdb_goods WHERE goods_cate = '超級本' );
+----------+-------------+
| goods_id | goods_price |
+----------+-------------+
|        3 |    8499.000 |
|       13 |    9188.000 |
|       17 |   28888.000 |
+----------+-------------+
3 rows in set (0.00 sec)

mysql>

使用[NOT]IN的子查詢

語法

operand comparison_operator [NOT] IN (subquery)
  • = ANY 運算符與IN等效
  • != ALL 或者<>ALL和NOT IN等效

使用[NOT]EXISTS的子查詢

若是子查詢返回任何行,EXISTS將返回true;不然返回false。

使用INSERT-SELECT插入記錄和多表更新

-- 插入記錄
INSERT [INTO] tb_name[(col_name, ... )] SELECT ...

-- 多表更新
UPDATE table_references SET col_name1 = {expr1|DEFAULT} [,col_name2 = {expr2|DEFAULT}] [WHERE where_condition]

例: 
查看以上的tdb_goods表咱們發現有不少的重複,例如: 

這裏寫圖片描述

爲此,咱們須要另外建立一張商品分類表tdb_goods_cates

-- 商品分類表
CREATE TABLE IF NOT EXISTS tdb_goods_cates(
    cate_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    cate_name VARCHAR(40)

);

咱們須要向上面的表中插入記錄。

INSERT tdb_goods_cates(cate_name)  -- 將分組信息寫入商品分類表
SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;

表的參照關係——表的鏈接

table_reference {[INNER|CROSS] JOIN {LEFT|RIGHT} [OUTER] JOIN} table_reference ON condition_expr
  • INNER JOIN,內鏈接。在MYSQL中,JOIN,CROSS JOIN和INNER JOIN等價。
  • LEFT [OUTER] JOIN,左外鏈接。
  • RIGHT [OUTER] JOIN,右外鏈接 。
UPDATE tdb_goods INNER JOIN tdb_goods_cates
    ON goods_cate = cate_name
    SET goods_cate = cate_id; -- 參照tdb_goods_cates表更新tdb_goods的記錄

修改表

修改列(表結構的修改)

# 增長列
ALTER TABLE 表名 ADD COLUMN 列名 數據類型 約束;
或者
ALTER TABLE 表名 ADD 列名 數據類型 約束;

# 刪除列
ALTER TABLE 表名 DROP COLUMN 列名;
或
ALTER TABLE 表名 DROP 列名;

# 對原有的列進行修改
ALTER TABLE 表名字 CHANGE 原列名 新列名 數據類型 約束;

# 修改某一列的數據類型
ALTER TABLE 表名字 MODIFY 列名字 新數據類型;

新增長的列默認是在最後,若是想要在第一列加入列,請參考如下的寫法:

ALTER TABLE employee ADD test INT(10) DEFAULT 11 FIRST;

 

索引

相關文章
相關標籤/搜索