MySQL入門

  • 本文主要內容來自慕課網。配合視頻食用口味更佳
  • 主要是順著已經學習的視頻順序總結一遍,以深化理解和方便日后復習
  • 一些章節介紹不詳細,博主加入了補充
  • 添加了自己的實踐和理解

第一章:初涉MySQL

數據庫

定義

數據庫,可以簡單的解釋為:高效的存儲和處理數據的介質(主要分為磁盤和內存兩種)

分類

根據數據庫存儲介質的不同,可以將其分為兩類,即:關系型數據庫(SQL)和非關系型數據庫(NoSQL,Not Only SQL)。

舉例

關系型數據庫:

  • 大型:Oracle、DB2
  • 中型:SQL Server、MySQL
  • 小型:Access
    非關系型數據庫:
  • Memcached、MongoDB 和 Redis 等。

區別

關系型數據庫:

  • 安全,其將數據保存到磁盤之中,基本不可能出現丟失數據的情況;
  • 比較浪費空間,因為其用二維表的形式存儲數據。
    非關系型數據庫:
  • 存儲數據的效率比較高;
  • 不是特別安全,突然斷電時會導致數據丟失。

MySQL概述

MySQL是一個開源的關系型數據庫管理系統,由瑞典MySQL AB公司開發,后被Oracle收購,主要分為社區版和企業版。
MySQL由于性能高、成本低、可靠性好,已經成為最流行的開源數據庫,因此被廣泛地應用在Internet上的中小型網站中。隨著MySQL的不斷成熟,它也逐漸用于更多大規模網站和應用,比如維基百科、Google和Facebook等網站。非常流行的開源軟件組合LAMP中的“M”指的就是MySQL。

MySQL目錄結構

  • bin:存儲可執行文件
  • data:存儲數據文件(以后創建的數據庫和索引文件都可以放在這里)
  • docs:文檔
  • include:存儲包含的頭文件
  • lib:存儲庫文件
  • share:錯誤消息和字符集文集

啟動與停止MySQL服務

利用cmd開啟和關閉MySQL服務

  1. 用管理員的身份打開cmd(必須是管理員是身份打開,否則會報錯)
  2. 啟動Mysql服務
net start mysql
  1. 停止Mysql服務
net stop mysql

Mysql的常用參數

語法 含義
-p, --password[=name] 密碼
-P, --port=# 端口號
-h, --host=name 服務器名稱
-D, --database=name 打開指定數據庫
--delimiter = name 指定分隔符
--prompt=name 設置提示符
-V,--version 輸出版本信息并退出(必須是大寫V)
-u, --user=name 用戶名

登錄與退出

登陸

mysql -uroot -pmima -P3306 -h127.0.0.1

-u后面是用戶名
-p后面是密碼
-P后面是端口號
-h后面是服務器名稱,127.0.0.1是本地服務器
如果沒有修改端口號,而且是本地服務器,則可以省略-P3306 -h127.0.0.1這兩個參數
在-p后面直接輸入密碼會顯示在當前窗口的標題欄中,這樣是不安全的,我們可以直接輸入mysql -uroot -p
后回車,就可以在密碼框中輸入密碼了。

退出

主要有三種退出方式:

mysql  >  exit;
mysql  >  quit;
mysql > \q;

MySQL常用命令--SELECT

顯示當前服務器版本

SELECT VERSION();

顯示當前日期時間

SELECT NOW();

顯示當前用戶

SELECT USER();
SELECT USER();

MySQL語句規范

  • 關鍵字與函數名稱全部大寫
  • 數據庫名稱、表名稱、字段名稱全部小寫
  • SQL語句必須以分號結尾

操作數據庫

創建數據庫--CREATE

創建數據庫的語法結構:

CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name 
[DEFAULT] CHARACTER SET [=] charset_name

{}是必選項,[]是可選項,|是做選擇項
比如創建一個名為test1的數據庫:

CREATE DATABASE test1;

查看數據庫列表--SHOW

查看當前服務器下的數據庫列表語法結構:

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

比如,查看上面創建的test1數據庫是否成功

SHOW DATABASES;
SHOW DATABASES

修改數據庫--ALTER

修改數據庫的語法結構:

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

比如將剛剛創建的test2的編碼方式修改為utf8

ALTER DATABASE test2 CHARACTER SET utf8;

刪除數據庫--DROP

DROP {DATABASE | SCHEMA} [IF EXISTS] db_name

比如刪除我們上面創建的test2數據庫

 DROP  DATABASE test2;

忽略錯誤產生

  • 有ERROR
    我們創建了一個名為test1數據庫后,如果再次創建一個同名的數據庫:
CREATE DATABASE test1;

會提示ERROR 1007 (HY000): Can't create database 'test1'; database exists錯誤

  • ERROR轉換成WARNINGS
    但是如果加上IF NOT EXISTS,將忽略錯誤的產生,并產生一個警告。
CREATE DATABASE IF NOT EXISTS test1;
  • 查看WARNINGS
SHOW WARNINGS;

編碼信息--SHOW CREATE DATABASE

  • 查看
SHOW CREATE DATABASE 數據庫名字;
SHOW CREATE DATABASE
  • 也可以在創建數據的時候,指定相應的編碼方式
CREATE DATABASE test2 CHARACTER SET 編碼方式;

第二章:數據類型與操作數據表

數據類型

  • 整型
整型
  • 浮點型
浮點型
  • 日期時間型
日期時間型
  • 字符型
字符型

創建數據表---CREATE

數據表TABLE

數據表又稱表,是數據庫最重要的組成部分之一,是其他對象的基礎
行稱之為記錄,列稱之為字段

創建數據表

創建數據表

  1. 打開數據庫--USE
USE 數據庫名;
  1. 檢查打開的數據庫是否正確--SELECT
SELECT DATABASE();
  1. 創建數據表的語法結構--CREATE
CREATE TABLE [IF NOT EXISTS] table_name (
column_name  data_type,   ……)

column_name是列名稱,數據表有多少列需要根據項目分析事先規劃好
data_types是數據類型, 逗號是兩個字段之間的分隔符,最后一個字段不用加逗號

舉例

我們創建一個簡單是數據表,包含以下幾項信息:

用戶名:username ,用戶名一般是字符型

年齡:age ,年齡一般是整型,另外年齡不可能是負值,所以常設置無符號位

工資:salary,工資一般設置為浮點型

mysql> CREATE TABLE tb1(
    -> username VARCHAR(20),
    -> age TINYINT UNSIGNED,
    -> salary FLOAT(8,2) UNSIGNED
    -> );

查看數據表

查看數據表列表--SHOW TABLES

  • 看的是名字
    查看數據表列表語法結構
SHOW TABLES [FROM db_name]
[LIKE 'pattern' | WHERE expr]
SHOW TABLES
  • 查看當前數據庫的數據表列表:
SHOW TABLES;
  • 不僅可以查看當前數據庫下的數據表列表,還可以查看其它數據庫的數據表列表,比如查看MySQL數據庫中所有的數據表列表
SHOW TABLES FROM mysql;

查看數據表結構--SHOW COLUMNS...FROM

  • 看的是具體信息
    查看數據表結構
SHOW COLUMNS FROM tbl_name

比如查看名為tb1這個列的數據表結構

SHOW COLUMNS FROM tb1;
SHOW COLUMNS

記錄的插入與查找

插入記錄--INSERT 表(哪幾列) VALUES()

  • 插入記錄語法結構
INSERT [INTO] tbl_name[(col_name,...)] VALUES(val,...)

tbl_name:表名字。 col_name:列名字。 VALUES:值

  • 如果省略列名,需要對所有的字段都賦值
INSERT tb1 VALUES('datiangou',24,4000);
  • 也可以只給部分字段賦值,比如
INSERT tb1(username,salary) VALUES('cimutongzi',14000);

記錄查找---SELECT 列 FROM 表

記錄查找語句

SELECT expr,... FROM tbl_name

比如:(這里的*是字段的過濾)

SELECT * FROM tb1;

顯示如下:


SELECT * FROM

空值與非空

  • NULL,字段值可以為空
  • NOT NULL,字段值禁止為空
  1. 我們首先創建一個字段,設置username 為NOT NULL
mysql> CREATE TABLE tb2(
    -> username VARCHAR(20) NOT NULL,
    -> age TINYINT UNSIGNED NULL
    -> );
  1. 然后查看這個字段的結構,看到username 為NOT NULL
  2. 我們插入一條數據,嘗試使得該數據username為NULL:
mysql> INSERT tb2 VALUES(NULL,26);
  1. ERROR 1048 (23000): Column 'username' cannot be null。可以看到報錯提示不允許username為NULL
不允許插入NULL到NULL值處

自動編號 AUTO_INCREMENT

  • 自動編號,且必須與主鍵組合使用

  • 默認情況下,起始值為1,每次的增量為1,依次遞增。

所以該字段數據類型一定是數值型:整數,浮點數都可以,浮點數小數位數必須為0

舉例:

mysql> CREATE TABLE tb3(
    -> id SMALLINT UNSIGNED AUTO_INCREMENT,
    -> username VARCHAR(30) NOT NULL
    -> );

ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key

  • 可以看到報錯了,這是因為這里的id,作為自動編號字段必須設置成主鍵才可以

初涉約束

主鍵約束

本節參考MySQL 為什么需要一個主鍵

主鍵原則

  • 主鍵(primary key) :唯一標識表中每行的這個列(或這組列)稱為主鍵。其值能夠唯一區分表中的每個行。
  • 雖然并不總是都需要主鍵,但大多數數據庫設計人員都應保證他們創建的每個表有一個主鍵,以便于以后數據操縱和管理。沒有主鍵,更新或刪除表中特定行很困難,因為沒有安全的方法保證只設計相關的行。
  • 表中的任何列都可以作為主鍵,只要它滿足一下條件:
    • 唯一
      任何兩行都不具有相同的主鍵值
    • 非NULL
      每個行都必須具有一個主鍵值(主鍵列不允許NULL值)
  • AUTO_INCREMENT必須和主鍵一起使用,但是主鍵不一定必須和AUTO_INCREMENT使用

幾個好習慣

  • 不更新主鍵列的值
  • 不重用主鍵列的值
  • 在主鍵列中不使用可能會更改的值(例如,如果使用一個名字作為主鍵以標識某個供應商,應該供應商合并和更改其名字時,必須更改這個主鍵)
  • 總之:不應該使用一個具有意義的column(id 本身并不保存表 有意義信息) 作為主鍵,并且一個表必須要有一個主鍵,為方便擴展、松耦合,高可用的系統做鋪墊。

主鍵其他作用

  • 磁盤存儲
  • InnoDB 存儲引擎采用了聚集(clustered)的方式,因此每張表的存儲都是按主鍵的順序進行存放。如果沒有顯式地在表定義時指定主鍵,InnoDB存儲引擎會為每一行生成一個6字節的ROWID,并一次作為主鍵。
    無特殊需求下Innodb建議使用與業務無關的自增ID作為主鍵

設置主鍵--PRIMARY KEY

我們將上節中的id定義成主鍵

mysql> CREATE TABLE tb3(
    -> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    -> username VARCHAR(30) NOT NULL
    -> );

Query OK, 0 rows affected (0.01 sec)
可以看到,創建成功了,主鍵可以寫PRIMARY KEY,也可以直接寫KEY

現在再來看一下數據表結構:

設置主鍵

可以看到,id不能為空,因為主鍵自動為NOT NULL,Key被定義成了PRI,Extra被定義成了自動編號,則寫入記錄的時候id不需要專門賦值了,我們插入三條記錄:

測試主鍵

然后查看一下記錄:

主鍵自增

可以看到id被設計AUTO_INCREMENT 的主鍵,被自動編號成了123

唯一約束

唯一約束原則

  • 因為主鍵一張表只有一個,如果想保證值的(記錄)唯一性,可以使用UNIQUE KEY(唯一約束)
  • 唯一約束的字段可以為空值(NULL)(存儲的時候,多個空值只會保存一個空值,所以并不違背唯一性)
  • 每張數據表可以存在多個唯一約束

創建唯一約束-- UNIQUE KEY

我們創建一個既有主鍵約束,又有唯一約束的數據表:

mysql> CREATE TABLE tb5(
    -> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    -> username VARCHAR(30) NOT NULL UNIQUE KEY,
    -> age TINYINT UNSIGNED
    -> );

查看一下數據表的結構:

加入唯一約束

可以看到,id為主鍵約束,username為唯一約束,我們寫入一些記錄:

測試唯一約束

可以發現username不能重復

默認約束--DEFAULT

當插入記錄時,如果沒有明確為字段賦值,則自動賦予默認值

我們創建一個數據表:

mysql> CREATE TABLE tb61(
    -> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    -> username VARCHAR(20) NOT NULL UNIQUE KEY,
    -> sex ENUM('1','2','3') DEFAULT '3'
    -> );

查看一下數據表結構:

加入默認值

可以看到sex字段的默認值為3

我們插入一條記錄,僅設置username,不設置sex

mysql> INSERT tb6(username) VALUES('jiutuntongzi');

然后查看一下記錄:

測試默認約束

發現即使我們沒有設置 jiutuntongzi 的性別,但是其sex默認被賦值成了3(DEFAULT 值)

第三章:約束以及修改數據表

約束意義和分類

  • 約束保證數據的完整性和一致性。
  • 約束分為表級約束和列級約束。
  • 分類
    NOT NULL(非空約束)
    PRIMARY KEY(主鍵約束)
    UNIQUE KEY(唯一約束)
    DEFAULT(默認約束)
    FOREIGN KEY(外鍵約束)

外鍵約束-- FOREIGN KEY...REFERENCES

外鍵是表中的一列,其值必須在另一表的主鍵中。即一個表中的 FOREIGN KEY 指向另一個表中的 PRIMARY KEY。

目的

  • 外鍵約束是為了保持數據一致性和完整性。外鍵是保證引用完整性的極其重要的部分。
  • 防止意外刪除

要求

  • 父表和子表必須使用相同的存儲引擎,而且禁止使用臨時表。
  • 數據表的存儲引擎只能為InnoDB
  • 外鍵列和參照列必須具有相似的數據類型,其中數字的長度或是否有符號位必須相同,而字符的長度則可以不同。
  • 外鍵列和參照列必須創建索引。如果外鍵列不存在索引的話,MySQL將自動創建索引( 如果參照列不存在索引的話,mysql不會自動創建索引。但如果參照列為主鍵的話,則會自動創建索引。主鍵在創建的同時會自動創建索引,所以參照列其實已經有了索引。)

表級約束與列級約束

定義

  • 表級約束
    對多個數據列建立的約束,稱為表級約束表級約束只能在列定義后聲明
  • 列級約束
    對一個數據列建立的約束,稱為列級約束列級約束既可以在列定義時聲明,也可以在列定義后聲明

使用情況

  • 我們在平常的開發中,多用到列級約束,表級約束很少用到在所有的約束中
  • 并不是每一種約束,都存在列級約束和表級約束
    比如 NOT NULL ,DEFAULT 就沒有表級約束,只有列級約束。而PRIMARY KEY, UNIQUE KEY,FOREIGN KEY都可以存在表級約束和列級約束。

修改數據表

添加/刪除列

添加列--ALTER TABLE...ADD

語法
  • 添加單列的語法結構:
ALTER TABLE tbl_name ADD [COLUMN]   col_name column_definition [FIRST | AFTER col_name ]
  • 其中, FRIST指的是添加的列置于最前面,AFTER指的是添加列置于指定列的后面
  • 如果不寫FRIST或者AFTER,則默認添加到所有列的最下面
  • 多列的添加不能指定位置關系,只能默認添加到最下面。
ALTER TABLE tbl_name ADD [COLUMN]   (col_name column_definition,...) 
例子

用之前的tb6做例子:

插入列之前的tb6
  • 不寫FRIST或者AFTER,則默認添加到所有列的最下面
mysql> ALTER TABLE tb6 ADD age TINYINT UNSIGNED NOT NULL DEFAULT 18;

結果

新列插在列尾
  • 接來下我們再來加一個password字段,并置于username后面,則需要用到AFTER:
mysql> ALTER TABLE users1 ADD password VARCHAR(32) NOT NULL AFTER username;

結果

在指定列后添加新列

刪除列--ALTER TABLE...DROP

語法

刪除列的語法結構:

ALTER TABLE tbl_name DROP [COLUMN] col_name
例子

刪除剛才給tb6添加的age字段

mysql> ALTER TABLE tb6 DROP age;

結果

刪除列

添加/刪除約束

添加主鍵約束--ALTER TABLE...ADD PRIMARY KEY

語法
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]]
PRIMARY KEY [index_type](index_col_name,...)
例子

創建一個測試用的數據表user2:

mysql> CREATE TABLE user2(
    -> username VARCHAR(10) NOT NULL,
    -> pid SMALLINT UNSIGNED
    -> );

首先增加一列:

mysql> AlTER TABLE user2 ADD id SMALLINT UNSIGNED;

此時表的結構:

添加主鍵前

給id列添加主鍵約束:

mysql> ALTER TABLE user2 ADD CONSTRAINT  PRIMARY KEY(id);

此時表的結構:

添加id為主鍵

添加唯一約束--ALTER TABLE...ADD UNIQUE

語法
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]]
UNIQUE [INDEX|KEY] [index_name] [index_type]
(index_col_nam,...)
例子

唯一約束可以有多個,我們給usersname添加唯一約束:

mysql> ALTER TABLE user2 ADD UNIQUE (username);

此時表的結構:

插入唯一約束

添加外鍵約束-ALTER TABLE..ADD FOREIGN KEY REFERENCES..

語法
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]]
FOREIGN KEY [index_name] (index_col_name,...)
reference_definition
例子

將users2中的pid參照tb6中id,則需要給users2中的pid設置外鍵約束:

mysql> ALTER TABLE user2 ADD FOREIGN KEY(pid) REFERENCES tb6(id);

此時表的結構:

添加外鍵約束

添加/刪除默認約束-ALTER TABLE..ALTER..SET|DROP DEFAULT

語法

添加/刪除默認約束的語法結構:

ALTER TABLE tbl_name ALTER [COLUMN] col_name
{SET DEFAULT literal| DROP DEFAULT}
例子

在user2表中添加一個age字段:

mysql> ALTER TABLE  user2 ADD age TINYINT UNSIGNED NOT NULL;

此時表的結構:

添加默認約束前

可以看到age字段并沒有默認值,接下來添加默認約束:

mysql> ALTER TABLE user2 ALTER age SET DEFAULT 18;

此時表的結構:

添加age默認約束值18

接下來刪除默認約束

mysql> ALTER TABLE user2 ALTER age DROP DEFAULT;

此時表的結構:

刪除age的默認約束

修改列定義,列名稱,表名稱

修改列定義--ALTER TABLE...MODIFY...

  • 數據類型
  • 列的位置
語法
ALTER TABLE tbl_name MODIFY [COLUMN] col_name
column_definition  [FIRST| AFTER col_name]
例子

比如users2表中的id并沒有處于第一位置,雖然沒有什么影響,但是不符合我們平常的習慣,可以將id字段修改為第一位置:

mysql> ALTER TABLE user2 MODIFY id SMALLINT UNSIGNED NOT NULL FIRST;

可以看到id:

  • 類型變成了MEDIUMINT UNSIGNED
  • 處在了第一列
修改了id列的定義

修改數據類型時,將大類型修改為小類型,有可能造成數據丟失。

修改列名稱--ALTER TABLE...CHANGE...

語法
ALTER TABLE tbl_name CHANGE [COLUMN] old_col_name
new_col_name column_definition  [FIRST| AFTER col_name]
例子

我們修改一下pid的數據類型和名字:

mysql> ALTER TABLE user2 CHANGE pid p_id TINYINT UNSIGNED NOT NULL;

可以看到pid已經被修改為new_pid:

修改列名字

修改數據表名稱--...RENAME TO...

盡量不要隨意修改數據表名。

語法

修改數據表名稱方法一:

ALTER TABLE tbl_name RENAME [TO|AS] new_tbl_name

修改數據表名稱方法二(可以修改多個數據表):

RENAME TABLE tbl_name TO new_tbl_name
[, tbl_name2 TO new_tbl_name2]...
例子

我們用方法一將user2名字修改為new_user2:

mysql> ALTER TABLE users2 RENAME users3;

查看表名:

修改表名

再用方法二將tb1,tb2分別改為new_tb1,new_tb2:

mysql> RENAME TABLE users3 TO users2;

查看表名:

修改表名

第四章:操作數據表中的記錄

本章內容在前幾章有部分體現,這里做一個補充與總結。

插入記錄--INSERT...VALUES...

語法

INSERT [INTO] tbl_name [(col_name,...)] {VALUES| VALUE}
({expr | DEFAULT},...),(...),...
  • col_name是列名稱,省略不寫則代表所有的字段需要依次賦值
  • 對于自動編號的字段,賦值為NULL或者DEFAULT

例子

首先創建一個用于測試的數據表:

mysql> CREATE TABLE users(
    -> 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
    -> );

現在我們省略col_name,則插入記錄的時候需要依次為所有字段賦值,自動編號的id字段可以NULL或者DEFAULT

mysql> INSERT users VALUES(NULL,'datiangou','123456',18,1);
mysql> INSERT users VALUES(DEFAULT,'cimutongzi','123456',24,1);

查看表中記錄:

插入記錄

接下來一次性寫入多條記錄,只需要用逗號分隔即可,這里以兩條記錄為例:

mysql> INSERT users VALUES(DEFAULT,'yuzaoqian','098765',25,1),
(NULL,'xuetongzi','098765',DEFAULT,0);

查看表中記錄:

image

## 插入記錄--INSERT SET-SELECT

單表更新記錄--UPDATE...SET...

語法

UPDATE [LOW_PRIORITY] [IGNORE] table_reference SET
col_name1={expr1 | DEFAULT} [,col_name2={expr2 | DEFAULT}]...
[WHERE where_condition]

expr1 | DEFAULT 是指表達式或者默認值

  • WHERE where_condition如果省略,則會更新所有記錄

例子

  • WHERE 語句省略,則更新所有記錄
    比如給所有用戶年齡加5歲:
mysql> UPDATE users set age=age+5;

查看表中記錄:
可以看到,表中每一條記錄的age值都被更新了。

不限定范圍更新數據
  • 有WHERE語句,則特定條件的記錄被更新
    比如給所有偶數id用戶年齡加10歲:
mysql> UPDATE users SER age = age + 10 WHERE id % 2 == 0 ;

查看表中記錄:
可以看到,表中id為偶數記錄的age值都被更新了。

特定范圍更新數據

單表刪除記錄--DELETE FROM...

語法

DELETE FROM tbl_name [WHERE where_condition]

例子

比如刪除id為2的用戶記錄:

mysql> DELETE FROM users WHERE id = 2;

查看表中記錄:

刪除記錄

可以看到id為2的用戶已經被刪除,如果此時再插入一條記錄,id會為5,而不是2:

mysql> INSERT users VALUES(NULL,'huiyeji','1234',12,NULL);

查看表中記錄:

刪除之后,主鍵不會“自動填充”

查詢表達式解析--SELECT...FROM...

語法

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 {[offset,] row_count | row_count OFFSET offset}]
]

每一個表達式表示想要的一列,必須有至少一個。多個列之間以英文逗號分隔。

例子

  • 查詢指定列
    比如我想查找id和username這兩列的記錄:
mysql> SELECT id, username FROM users;

查看表中記錄:

查詢指定列
  • 星號(*)表示所有列。

  • “表名字.列名字” 級聯結構,在使用多表鏈接時,該方法可以用于區別不同數據表的同名字段。

  • 查詢表達式可以使用[AS] alias_name為其賦予別名。本名AS別名
    比如有時候一些字段的名字非常長,或者為了體現數據的意義,就可以賦予別名:

mysql> SELECT id AS userID,username AS uname FROM users;

查看表中記錄:

別名

條件查詢--WHERE

  • where字句:用來判斷數據和篩選數據,返回的結果為0或者1,其中0代表false,1代表true
  • where是唯一一個直接從磁盤獲取數據的時候就開始判斷的條件,從磁盤中讀取一條數據,就開始進行where判斷,如果判斷的結果為真,則保持,反之,不保存

區間查詢---BETWEEN..AND..

  • 在使用between and的時候,其選擇的區間為閉區間,即包含端點值
  • and前面的數值必須大于等于and后面的數值,否則會出現空判斷
區間查詢

語句對查詢結果分組--GRUOP BY

  • GROUP BY關鍵字可以將查詢結果按照某個字段或多個字段進行分組。字段值相等的為一組。分組就是將一個數據集劃分成若干個小區域,然后再針對若干個小區域進行數據處理。本文將介紹mysql使用group by分組時,實現組內排序的方法。
  • group by分組的目的是為了(按分組字段)統計數據,并不是為了單純的進行分組而分組。為了方便統計數據,SQL 提供了一系列的統計函數,例如:
    cout():統計分組后,每組的總記錄數
    max():統計每組中的最大值
    min():統計每組中的最小值
    avg():統計每組中的平均值
    sum():統計每組中的數據總和

語法

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

例子

將表中的數據按字段 sex 進行分組,并進行統計:

mysql>SELECT sex,count(age),max(age),min(age),avg(age),sum(age) FROM users GROUP BY sex;

查看表中記錄:

GROUP BY

count()函數里面可以使用兩種參數,分別為

  • *表示統計組內全部記錄的數量
  • 字段名表示統計對應字段的非null(如果某條記錄中該字段的值為null,則不統計)記錄的總數。

語句設置分組條件--HAVING

  • having字句:與where子句一樣,都是進行條件判斷的
  • 但是where是針對磁盤數據進行判斷,數據進入內存之后,會進行分組操作,分組統計的結果或者說統計函數只有having能夠使用

語法

[HAVING where_condition]
  • HAVING后面的條件只能為聚合函數(比如SUM,MIN,MAX等)
  • 否則該條件必須出現在SELECT中

例子

比如對年齡大于20歲的用于進行性別分組:

mysql> SELECT sex,age FROM users GROUP BY sex HAVING age > 35;

查看表中記錄:

image

語句對查詢結果排序--ORDER BY

語法

[ORDER BY {col_name | expr | position}[ASC | DESC],...]
  • ASC:升序(默認)
  • DESC:降序

例子

  • 如果對多個字段進行排序時,如果第一個字段可以排出想要的結果,則忽略其他字段,如果不能,則遵守第二個字段,依次類推。
  1. 按照年齡默認排序:
mysql> SELECT * FROM users ORDER BY age;
  1. 插入一條同age數據,當有同齡的用戶,我們可以設置如果同齡,則按照id降序排列:
mysql> INSERT users VALUES (DEFAULT,'shanfeng','123456',23,1);
mysql> SELECT * FROM users ORDER BY age,id DESC;

查看表中記錄:

對結果排序

語句限制查詢數量--LIMIT...

語法

[LIMIT {[offset,] row_count | row_count OFFSET offset}]

例子

  • 比如查詢前兩條記錄:
mysql> SELECT * FROM users LIMIT 2;
  • 查詢第3和4兩條記錄:
    值得注意的是,SELECT語句記錄是從0開始,所以想查詢3和4兩條記錄,不能寫LIMIT 3,2, 而需要寫LIMIT 2,2;
mysql> SELECT * FROM users LIMIT 2,2;

查看表中記錄:

限制查詢數量

參考文章
慕課網:《與MySQL的零距離接觸》筆記目錄
MySQL 為什么需要一個主鍵
慕課網與MySQL的零距離接觸

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容