MySQL5.6從零開始學
第一章 初始mysql
1.1數據庫基礎
- 數據庫是由一批數據構成的有序的集合,這些數據被存放在結構化的數據表中。數據表之間相關聯,反應客觀事物之間的本質聯系。數據庫系統提供了對數據安全控制和完整性控制
- 數據庫表是一系列二維數組的集合,用來存儲數據、操作數據的邏輯結構。列被稱為字段,每一列表示記錄的一個屬性;行被稱為記錄,是組織數據的單位
- 數據類型:整數數據類型、浮點數數據類型、定點小數數據類型、二進制數據類型、日期/時間數據類型和字符串數據類型
- 主鍵:主鍵內容唯一,又稱主碼
1.2數據庫技術構成
1.數據庫系統
- 數據庫:存儲數據
- 數據庫管理程序:管理數據庫的軟件
- 數據庫應用程序:管理數據庫的軟件補充
2.SQL語言 - 1數據定義語言2數據操作語言3數據查詢語言4數據控制語言
3.數據庫訪問技術 - 使用訪問技術可以實現數據庫與應用程序之間的鏈接
- ODBC(多種數據庫)、GDBC(java)、PDO(PHP)、ADO.net(.net)
1.3什么是mysql
1.客戶機-服務器軟件
主從式架構結構,簡稱c/s結構,Client Server
2.mysql版本
社區版 企業服務器版
價格 速度 可移植性 容易學 豐富的接口 安全性連接性 支持查詢語言
1.4mysql工具
1.mysql命令行使用程序
2.數據恢復及備份工具
3.mysql workbench
1.5如何學習mysql
- 興趣、基礎、學習新知識、多實踐操作
第二章 MySQL的安裝與配置
與MySQL的零距離接觸
- 難度:初級
- 視頻鏈接
- 簡介:本課程涵蓋全部MySQL數據庫的基礎,主要學習MySQL數據庫的基礎知識、數據表的常用操作及各種約束的使用,以及綜合的運用各種命令實現記錄進行CURD等操作,目標“看得懂、學得會、做得出”,為后續學習打下基礎。
1-1MySQL概述
- MySQL由瑞典MySQL AB公司開發,目前屬于Oracle公司
- MySQL是一個開源的關系型數據庫管理系統
- MySQL分為社區版和企業版
(關系型數據庫:具備數據管理能力、用戶管理能力、數據的管理能力)
1-2MySQL的安裝與配置
MySQL安裝
- MySQL安裝方式(Windows環境)
1.MSI安裝(Windows Installer)
2.ZIP安裝 - 安裝步驟
1.雙擊MSI安裝文件
2.同意最終許可協議
3.選擇安裝類型
Typical:典型安裝(服務器、客戶端)
Custom:自定義安裝
Complete:完全安裝
4.準備安裝
5.安裝進度
配置MySQL
1.運行MySQL配置向導文件
/MySQL/MySQL server 5.5/bin/MySQLInstallerConfig.exe
2.配置向導歡迎界面
3.選擇配置類型
- Detailed Configuration,詳細配置
- Standard Configuration,標準配置
4.是否安裝為Windows服務
5.設置root用戶密碼
6.準備執行設置選項
7.配置完成
MySQL目錄結構
- bin目錄,存儲可執行文件
- data目錄,存儲數據文件
- docs,文檔
- include目錄,存儲包含的頭文件
- lib目錄,存儲庫文件
- share,錯誤消息和字符集文件
MySQL的配置選項
- 修改編碼方式
[mysql]
default-character-set=utf8
[mysqld]
character-set-server=utf8
[client]
post=3306
1-2MySQL的安裝與配置(附)Linux環境安裝mysql
環境:
1.操作系統:CentOS release 6.8 (Final)
2.安裝版本: mysql-5.6.31-linux-glibc2.5-x86_64.tar.gz
3.下載地址:http://dev.mysql.com/downloads/mysql/
4.下載說明:上邊的下載地址是最新版的,如果想下載老版本可以點擊頁面中的超鏈接“Looking for previous GA versions?”
5.特殊說明:Linux下MySQL5.6與MySQL5.7安裝方法略有不同,本文以5.6為主
安裝步驟:
0.卸載老版本MySQL
查找并刪除maysql有關的文件
find / -name mysql
rm -rf 上邊查找到的路徑,多個路徑用空格隔開
或用下面的一條命令實現
find / -name mysql|xargs rm -rf
1.在安裝包存放目錄下執行命令解壓文件
tar -zxvf mysql-5.6.31-linux-glibc2.5-x86_64.tar.gz
2.刪除安裝包,重命名解壓后的文件
rm -rf mysql-5.6.31-linux-glibc2.5-x86_64.tar.gz
mv mysql-5.6.31-linux-glibc2.5-x86_64/ mysql
3.添加mysql用戶組和mysql用戶
先檢查是是否存在用戶和組
groups mysql
若無,則添加
groupadd mysql
useradd -r -g mysql mysql #-r建立系統賬號
groups mysql
4.進入mysql目錄更改權限
cd mysql/
chown -R mysql:mysql ./
5.執行安裝腳本
./scripts/mysql_install_db --user=mysql
安裝完后修改當前目錄擁有者為root用戶修改date目錄擁有者為mysql
chown -R root:root ./
chown -R mysql:mysql data
6.更改mysql密碼
上一步安裝腳本執行輸出的日志中告訴我們如何更改密碼了
./bin/mysqladmin -u root password 'new-password'
./bin/mysqladmin -u root -h localhost.localdomain password 'new-password'
執行會報錯,因為你還沒有啟動mysql服務
./support-files/mysql.server start
如果MySQL啟動報錯,則可能是已經存在MySQL進程,殺掉即可,然后再重啟
ps aux | grep mysql
kill -9 上邊的進程號
#或者下邊一條命令即可殺掉所有MySQL進程
ps aux|grep mysql|awk '{print $2}'|xargs kill -9
MySQL啟動之后再執行如下命令更改密碼:
./bin/mysqladmin -u root -h localhost.localdomain password 'root'
密碼更改后即可登錄MySQL
./bin/mysql -h127.0.0.1 -uroot -proot
登錄之后將其他用戶的密碼也改成root
update mysql.user set password=password('root') where user='root';
flush privileges;
7.增加遠程登錄權限
本地登錄Mysql后執行如下命令
grant all privileges on *.* to root@'%' identified by '密碼';
flush privileges;
8.將MySQL加入server系統服務
cp support-files/mysql.server /etc/init.d/mysqld
chkconfig --add mysqld
chkconfig mysqld on
service mysqld restart
service mysqld status
9.配置my.cnf
vim my.cnf
#添加以下兩條語句并保存退出
default-character-set=utf8
lower_case_table_names=1
max_allowed_packet=100M
#保存退出重啟
1-3啟動和停止mysql服務
方式:
文件方式:找到服務里的mysql服務進行重新啟動
命令行方式:cmd-->net start mysql-->net stop mysql-->net start mysql
1-4MySQL登錄與退出
MySQL登錄
mysql 參數
-D 打開指定數據庫
mysql -V 輸出mysql版本信息
mysql -uroot -p #回車 p密碼
mysql -uroot -P -h127.0.0.1 #P端口號,默認是3306;h服務器名稱
退出:
exit;
quit;
\q;
第三章 數據庫的基本操作
- 3.1創建數據庫
- 3.2刪除數據庫
- 3.3數據庫存儲引擎
- 3.4綜合案例——數據庫的創建和刪除
3.1創建數據庫
mysql -h localhost -u root -p #登錄
SHOW DATABASES;
Database |
---|
information_schema |
mysql |
performance_schema |
test |
mysql:系統數據庫,描述了用戶使用權限
test:測試數據庫
剩下兩個:系統的存儲過程及函數;系統性能參數
- 創建數據庫的SQL語法格式為:
- CREATE DATABASE database-name;
- SHOW DATABASES;
- SHOW CREATE DATABASE test_db; #顯示創建數據庫時的信息
3.2刪除數據庫
- 刪除數據庫的SQL語法格式為:
- DROP DATABASE database_name; #執行時需謹慎,刪除后無法恢復
3.3數據庫存儲引擎
- 3.3.1 MySQL存儲引擎簡介
- 3.3.2 InnoDB存儲引擎
- 3.3.3 MyISAM存儲引擎
- 3.3.4 MEMORY存儲引擎
- 3.3.5 存儲引擎的選擇
3.3.1 MySQL存儲引擎簡介
- MySQL提供了多個不同的存儲引擎,包括處理事務安全表的引擎和處理非事務安全表的引擎。
- MySQL5.6支持的存儲引擎有:InnoDB、MyISAM、Memory、Merge、Archive、Federated、CSV、Blackhole等
查看mysql支持的存儲引擎
SHOW ENGINES;
mysql> SHOW ENGINES;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)
- Engine:引擎名稱
- Support:是否支持
- Comment:注釋信息
- Transactions:是否支持事務
- XA:
- Savepoints:
3.3.2 InnoDB存儲引擎
- InnoDB是事務型數據庫的首選引擎,支持事務安全表(ACID),支持行鎖定和外鍵。默認的存儲引擎
3.3.3 MyISAM存儲引擎
- MyISAM基于ISAM存儲引擎,并對其進行擴展。它是在web、數據倉儲和其它應用環境下最常用的存儲引擎之一。MyISAM擁有較高的插入、查詢速度,但不支持事務。
3.3.4 MEMORY存儲引擎
- MEMORY存儲引擎將表中的數據存儲在內存中,為查詢和引用其它表數據提供快速訪問方式
3.3.5 存儲引擎的選擇
- 不同的存儲引擎都有各自的特點,適應于不同的需求,為了做出選擇,首先需要考慮每一個存儲引擎提供了哪些不同的功能
3.4綜合案例-數據庫的創建于刪除
操作步驟:
- 1.登錄數據庫
- 2.創建數據庫zoo
- 3.選擇當前數據庫為zoo,并查看zoo數據庫的信息
- 4.刪除數據庫zoo
[root@PC1 mysql]# mysql -u root -h 127.0.0.1 -p **#登錄數據庫**
Enter password:
mysql> CREATE DATABASE zoo; **#創建數據庫**
Query OK, 1 row affected (0.01 sec)
mysql> SHOW DATABASES;**#查看數據庫**
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| zoo |
+--------------------+
5 rows in set (0.01 sec)
mysql> USE zoo;**#切換到use數據庫**
Database changed
mysql> SHOW CREATE DATABASE zoo;**#查看use建庫信息**
+----------+----------------------------------------------------------------+
| Database | Create Database |
+----------+----------------------------------------------------------------+
| zoo | CREATE DATABASE `zoo` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+----------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> DROP DATABASE zoo;**#刪除數據庫**
Query OK, 0 rows affected (0.01 sec)
mysql> SHOW DATABASES;**#查看有哪些數據庫**
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
4 rows in set (0.00 sec)
第四章 數據表的基本操作
4.1 創建數據表
數據表:列的集合
4.1.1創建數據表的語法形式
創建表的語句為CREATE TABLE。
CREATE TABLE 表名(
列名1 數據類型[列級別約束條件][默認值],
列名2 數據類型[列級別約束條件][默認值],
,,,,,,
[表級別約束條件]
);
例:創建員工表tb_emp1
mysql> CREATE TABLE tb_emp1
-> (
-> id int(11),
-> name varchar(25),
-> deptId int(11),
-> salary float
-> );
Query OK, 0 rows affected (0.06 sec)
4.1.2使用主鍵約束
- 主鍵又稱主碼,是表中一列或多列的組合。主鍵約束(Primary Key constraint)要求主鍵列的數據唯一,并且不允許為空
- 單字段主鍵
字段名 數據類型 PRIMARY KEY - 多字段聯合主鍵
PRIMARY KEY [字段1,字段2,...,字段n]
例:定義數據表tb_emp2,其中主鍵為id
mysql> CREATE TABLE tb_emp2(
-> id int(11) PRIMARY KEY,
-> name varchar(25),
-> deptId int(11),
-> salary float
-> );
例:定義數據表tb_emp3,其主鍵為id
mysql> CREATE TABLE tb_emp3(
-> id int(11),
-> name varchar(25),
-> deptId int(11),
-> salary float,
-> PRIMARY KEY(id)
-> );
例:定義數據表tb_emp4,創建多字段聯合主鍵
mysql> CREATE TABLE tb_emp5(
-> name varchar(25),
-> deptId int(11),
-> salary float,
-> PRIMARY KEY(name,deptId)
-> );
4.1.3使用外鍵約束
- 外鍵用來在兩個表的數據之間建立鏈接,它可以是一列或者多列。一個表可以有一個或多個外鍵。一個表的外鍵可以為空值,若不為空值,則每一個外鍵值必須等于另一個表中主鍵的某個值
- constraint 外鍵名 foreign key(字段名1[,字段名2,...]) references 主表名(主鍵列1[,主鍵列2,...]);
constraint 約束
foreign 外
references 引用
例:定義數據表tb_emp5,并在tb_emp5表上創建外鍵約束
創建一個部門表tb_dept1:
mysql> create table tb_dept1(
-> id int(11) primary key,
-> name varchar(22) not null,
-> location varchar(50)
-> );
定義數據表tb_mp5,讓他的鍵deptId作為外鍵關聯到tb_dept1的主鍵id
mysql> create table tb_emp6(
->
-> id int(11) primary key,
-> name varchar(25),
-> deptId int(11),
-> salary float,
-> constraint fk_emp_dept1 foreign key(deptId) references tb_dept1(id)
-> );
4.1.4使用非空約束
- 非空約束(not null constraint)指字段的值不能為空。對于使用了非空約束的字段如果用戶在添加數據時,沒有指定值,數據庫系統會報錯。
- 字段名 數據類型 not null
定義數據表tb_emp6,指定員工的姓名不能為空,sql語句為
mysql> create table tb_emp7(
-> id int(11) primary key,
-> name varchar(25) not null,
-> deptId int(11),
-> salary float,
-> constraint fk_emp_dept2 foreign key(deptId) references tb_dept1(id)
-> );
4.1.5使用唯一性約束
- 唯一性約束(Unique Constraint)要求該列值唯一,允許為空,但只能出現一個空值。唯一約束可以確保一列或者幾列不出現重復值。
- 字段名 數據類型 unique
- 例:定義數據表tb_dept2,指定部門的名稱唯一,SQL語句為:
mysql> create table tb_dept2(
-> id int(11) primary key,
-> name varchar(22) unique,
-> location varchar(50)
-> );
- 例:定義數據表tb_dept3,指定部門的名稱唯一,SQL語句為:
mysql> create table tb_dept3(
-> id int(11) primary key,
-> name varchar(22),
-> location varchar(50),
-> constraint sth unique(name) ##sth唯一性約束的名稱
-> );
4.1.6使用默認約束
- 默認約束(default constraint)指定某列的默認值
- 字段名 數據類型 default 默認值
- 例:定義員工表tb_emp8,指定員工的部門編號默認為1111,SQL語句為:
mysql> create table tb_emp8(
-> id int(11) primary key,
-> name varchar(25) not null,
-> deptId int(11) default 1111,
-> salary float,
-> constraint fk_emp_depts foreign key(deptId) references tb_dept1(id)
-> );
4.1.7設置表的屬性值自動增加
- 在數據庫應用中,經常希望在每次插入新記錄時,系統就會自動生成字段的主鍵值。可以通過為表
主鍵添加auto_increment關鍵字來實現。一個表只能有一個字段使用auto_increment約束,且該字段必須為主鍵的一部分。 -
字段名 數據名 auto_increment
例:定義員工表tb_emp9,指定員工的編號自動遞增,SQL語句為:
mysql> create table tb_emp9(
-> id int(11) primary key auto_increment,
-> name varchar(25) not null,
-> deptId int(11),
-> salary float,
-> constraint fk_emp_dept5 foreign key(deptId) references tb_dept1(id)
-> );
mysql> insert into tb_emp9 (name,salary) values('Lucy',1000),('lura',2000),('marry',3000);
mysql> select * from tb_emp9;
4.2查看數據表結構
- 4.2.1 查看表基本結構語句describe
- 4.2.2 查看表詳細結構語句show create table
4.2.1 查看表基本結構語句describe
- 該語句可以查看表的字段信息,其中包括:字段名、字段數據類型、是否為主鍵、是否有默認值、其他屬性等
-
describe 表名/desc 表名
例:分別使用describe和desc查看tb_dept和tb_emp1的表結構,sql語句為:
mysql> describe tb_dept1;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(22) | NO | | NULL | |
| location | varchar(50) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
mysql> desc tb_emp1;
Field //該表中包含了哪些字段
Type //某個字段的數據類型
Null //某個字段是否可以為空值,no 表示不能為空值
Key //表示該表是否已標識索引,PRI該列是主鍵的一部分,UNI該列是唯一索引的一部分,MUL該列中某個給定的值允許出現多次
Default 默認值
Extra 其他屬性 如自增屬性
4.2.2 查看表詳細結構語句show create table
- 語句可以顯示數據表的創建語句
- show create table 表名\G; //"\G"使顯示易于查看
例:用show creat table查看表tb_emp1的詳細信息,sql語句為:
mysql> show create table tb_emp1\G;
*************************** 1. row ***************************
Table: tb_emp1
Create Table: CREATE TABLE `tb_emp1` (
`id` int(11) DEFAULT NULL,
`name` varchar(25) DEFAULT NULL,
`deptId` int(11) DEFAULT NULL,
`salary` float DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
ERROR:
No query specified
4.3修改數據表
- 4.3.1修改表名
- 4.3.2修改字段的數據類型
- 4.3.3修改字段名
- 4.3.4添加字段
- 4.3.5刪除字段
- 4.3.6修改字段的排列位置
- 4.3.7更改表的存儲引擎
- 4.3.8刪除表的外鍵約束
4.3.1修改表名
修改表名語法:
alter table <表名> rename [to] <新表名>; //to為可選參數
例:將數據表tb_dept3改名為tb_department3
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| tb_dept1 |
| tb_dept2 |
| tb_dept3 |
| tb_emp1 |
| tb_emp2 |
| tb_emp3 |
| tb_emp5 |
| tb_emp6 |
| tb_emp7 |
| tb_emp8 |
| tb_emp9 |
+----------------+
11 rows in set (0.00 sec)
mysql> alter table tb_dept3 rename tb_department3;
Query OK, 0 rows affected (0.07 sec)
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| tb_department3 |
| tb_dept1 |
| tb_dept2 |
| tb_emp1 |
| tb_emp2 |
| tb_emp3 |
| tb_emp5 |
| tb_emp6 |
| tb_emp7 |
| tb_emp8 |
| tb_emp9 |
+----------------+
11 rows in set (0.01 sec)
4.3.2修改字段的數據類型
- 把字段的數據類型轉換成另一種數據類型
alter table <表名> modify <字段名> <數據類型>
例:將數據表tb_dept1中name字段的數據類型由varchar(22)修改為varchar(30)
mysql> desc tb_dept1;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(22) | NO | | NULL | |
| location | varchar(50) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> alter table tb_dept1 modify name varchar(30);
Query OK, 0 rows affected (0.10 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc tb_dept1;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(30) | YES | | NULL | |
| location | varchar(50) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
4.3.3修改字段名
- 語法:
alter table <表名> change <舊字段名> <新字段名> <新數據類型>;
例:將數據表tb_dept1中location字段名稱改為loc,數據類型不變;將數據表tb_dept1中loc字段改為location,數據類型改為varchar
mysql> desc tb_dept1;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(30) | YES | | NULL | |
| location | varchar(50) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> alter table tb_dept1 change location loc varchar(50);
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc tb_dept1;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(30) | YES | | NULL | |
| loc | varchar(50) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> alter table tb_dept1 change loc location varchar(60);
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc tb_dept1;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(30) | YES | | NULL | |
| location | varchar(60) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
4.3.4添加字段
- 在已存在的表中添加新的字段
alter table <表名> add <新字段名> <數據類型> [約束條件] [first|after已存在字段名]; //first 表的第一個字段
例:
在數據表tb_dept1中添加一個沒有完整性約束的int類型的字段managerId(部門經理編號)
在數據表tb_dept1中添加一個不能為空的varchar(12)類型的字段column1
在數據表tb_dept1中第一列添加一個int類型的column2字段
在數據表tb_dept1中name字段后添加一個int類型的字段column3字段
mysql> desc tb_dept1;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(30) | YES | | NULL | |
| location | varchar(60) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> alter table tb_dept1 add managerId int(11);
mysql> alter table tb_dept1 add column1 varchar(12) not null;
mysql> alter table tb_dept1 add column2 int(11) first;
mysql> alter table tb_dept1 add column3 int(11) after name;
mysql> desc tb_dept1;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| column2 | int(11) | YES | | NULL | |
| id | int(11) | NO | PRI | NULL | |
| name | varchar(30) | YES | | NULL | |
| column3 | int(11) | YES | | NULL | |
| location | varchar(60) | YES | | NULL | |
| managerId | int(11) | YES | | NULL | |
| column1 | varchar(12) | NO | | NULL | |
+-----------+-------------+------+-----+---------+-------+
7 rows in set (0.00 sec)
4.3.5刪除字段
- 刪除字段是將數據表中的某個字段從表中移除
- alter table <表名> drop <字段名>;
- 例:刪除數據表tb_dept1表中的column2字段
mysql> alter table tb_dept1 drop column2;
4.3.6修改字段的排列位置
- alter table來修改字段的相對位置
- alter table <表名> modify <字段1> <數據類型> first|after <字段2>;
- 例:將數據表tb_dept1中的column1字段修改為表的第一個字段
- 例:將數據表tb_dept1中的column1字段修改為在locatiion字段之后
mysql> alter table tb_dept1 modify column1 varchar(12) first;
mysql> alter table tb_dept1 modify column1 varchar(12) after location;
4.3.7更改表的存儲引擎
- MySQL中,存儲引擎是指MySQL數據庫中表的存儲類型,可以根據自己的需要,選擇不同的引擎,甚至可以為每一張表選擇不同的存儲引擎
- alter table <表名> engine=<更改后的存儲引擎名>;
- 例:將數據表tb_department3的存儲引擎修改為MyISAM
mysql> show create table tb_department3\G;
*************************** 1. row ***************************
Table: tb_department3
Create Table: CREATE TABLE `tb_department3` (
`id` int(11) NOT NULL,
`name` varchar(22) DEFAULT NULL,
`location` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `sth` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
ERROR:
No query specified
mysql> alter table tb_department3 engine=myisam;
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table tb_department3\G;
*************************** 1. row ***************************
Table: tb_department3
Create Table: CREATE TABLE `tb_department3` (
`id` int(11) NOT NULL,
`name` varchar(22) DEFAULT NULL,
`location` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `sth` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
ERROR:
No query specified
4.3.8刪除表的外鍵約束
- 對于數據庫中定義的外鍵,如果不在需要,可以刪除。外鍵一旦刪除就回接觸主表與從表之間關系
- alter table <表名> drop foreign key <外鍵約束名>
- 刪除數據表tb_emp9中的外鍵約束
mysql> create table tb_emp10(
-> id int(10) primary key,
-> name varchar(22),
-> deptId int(11),
-> salary float,
-> constraint fk_emp_dept foreign key (deptId) references tb_dept1(id)
-> );
mysql> show create table tb_emp10\G;
*************************** 1. row ***************************
Table: tb_emp10
Create Table: CREATE TABLE `tb_emp10` (
`id` int(10) NOT NULL,
`name` varchar(22) DEFAULT NULL,
`deptId` int(11) DEFAULT NULL,
`salary` float DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_emp_dept` (`deptId`),
CONSTRAINT `fk_emp_dept` FOREIGN KEY (`deptId`) REFERENCES `tb_dept1` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
ERROR:
No query specified
mysql> alter table tb_emp10 drop foreign key fk_emp_dept;
4.4刪除數據表
- 4.4.1 刪除沒有被關聯的表
- 4.4.2 刪除被其它表關聯的主表
4.4.1 刪除沒有被關聯的表
- MySQL中,使用drop table可一次刪除一個或多個沒有被關聯的表
- drop table [if exists]表1,表2,...表n;
- 刪除數據表tb_dept2
mysql> drop table tb_dept2;
4.4.2 刪除被其它表關聯的主表
- 在數據表之間存在外鍵關聯的情況下,如果直接刪除父表,結果會顯示失敗,原因是直接刪除,將破壞表的參照完整性。如果必須要刪除,可以先刪除與之關聯的子表,再刪除父表。但是這樣同時刪除了兩個表中的數據。但有的情況下可能要保留子表,這時如果要單獨刪除父表,只需要將關聯的表的外鍵約束條件取消,然后就可以刪除父表
- 例:刪除被數據表tb_emp關聯的數據表tb_dept2
mysql> create table tb_dept2(
-> id int(11) primary key,
-> name varchar(22),
-> location varchar(22)
-> );
Query OK, 0 rows affected (0.05 sec)
mysql> create table tb_emp(
-> id int(11) primary key,
-> name varchar(25),
-> deptId int(11),
-> salary float,
-> constraint
-> fk_emp_dept foreign key (deptId) references tb_dept2(id)
-> );
Query OK, 0 rows affected (0.05 sec)
mysql> drop table tb_dept2;
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails
mysql> alter table tb_emp drop foreign key fk_emp_dept;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> drop table tb_dept2;
Query OK, 0 rows affected (0.04 sec)
4.5綜合案例
1.登錄數據庫
mysql -h localhost -u root -p
2.創建數據庫Company
create database Company;
3.創建表offices
mysql> create table offices(
-> officeCode int(10) not null unique,
-> city varchar(22) not null,
-> address varchar(22) not null,
-> country varchar(22) not null,
-> postalCode varchar(15) not null,
-> primary key (officeCode)
-> );
4.創建表employees
mysql> create table employees(
-> employeeNumber int(11) not null primary key auto_increment,
-> lastName varchar(22) not null,
-> firstName varchar(22) not null,
-> mobile varchar(50) not null,
-> officeCode int(10) not null,
-> jobTitle varchar(12) not null,
-> birth datetime,
-> note varchar(255),
-> sex varchar(5),
-> constraint office_fk foreign key(officeCode) references offices(officeCode)
-> );
5.將表employees的mobile字段修改到officeCode字段后面
alter table employees modify mobile varchar(50) after officeCode;
6.將birth字段改名為employee_birth
alter table employees change birth employee_birth datetime;
7.修改sex字段,數據類型為char(1),非空約束
alter table employees modify sex char(2) not null;
8.刪除字段note
alter table employees drop note;
9.增加字段名favoriate_activity,數據類型為varchar(100)
alter table employees add favoriate_activity varchar(100);
10.刪除表offices
1)刪除employees表的外鍵約束
alter table officeCode drop foreign key office_fk;
2)刪除表offices
drop table offices;
11.修改employees存儲引擎為MyISAM
alter table employees engine=myisam;
12.將表employees改為employees_info
alter table employees rename employees_info;
第五章 數據類型和運算符
- 5.1MySQL數據類型介紹
- 5.2如何選擇數據類型
- 5.3常見運算符介紹
- 5.4綜合案例——運算符的使用
5.1MySQL數據類型介紹
- 5.1.1整數類型
- 5.1.2浮點數類型和定點數類型
- 5.1.3日期與時間類型
- 5.1.4字符串類型
- 5.1.5二進制類型
5.1.1整數類型
- tinyint //最小整型
- smallint //小整型
- mediumint //中間整型
- int(integer) //整型
- bigint //大整型
- 例:創建表tmp1,其中字段x、y、z、m、n數據類型依次為TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT
mysql> create table tmp1(x tinyint, y smallint, z mediumint, m int, n nigint);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'nigint)' at line 1
mysql> create table tmp1(x tinyint, y smallint, z mediumint, m int, n bigint);
Query OK, 0 rows affected (0.03 sec)
mysql> desc tmp1;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| x | tinyint(4) | YES | | NULL | |
| y | smallint(6) | YES | | NULL | |
| z | mediumint(9) | YES | | NULL | |
| m | int(11) | YES | | NULL | |
| n | bigint(20) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
5.1.2浮點數類型和定點數類型
mysql中使用浮點數和定點數來表示小數
- 浮點類型:float double
- 定點類型:decimal
- 例:創建表tmp2,其中字段x、y、z數據類型依次為FLOAT(5,1)、DOUBLE(5,1)和DECIMAL(5,1),向表中插入數據5.12、5.15和5.123,
mysql> create table tmp2 ( x float(5,1), y double(5,1), z decimal(5,1) );
Query OK, 0 rows affected (0.01 sec)
mysql> insert into tmp2 values(5.12,5.15,5.123);
mysql> desc tmp2;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| x | float(5,1) | YES | | NULL | |
| y | double(5,1) | YES | | NULL | |
| z | decimal(5,1) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
mysql> select * from tmp2;
+------+------+------+
| x | y | z |
+------+------+------+
| 5.1 | 5.2 | 5.1 |
+------+------+------+
1 row in set (0.00 sec)
5.1.3日期與時間類型
mysql中有多種表示時間的數據類型
- datetime
- date
- timestamp
- time
- year
- 例:創建數據表tmp3,定義數據類型為YEAR的字段y,向表中插入值2010,’2010’,’2166’
mysql> create table tmp3( y year );
mysql> insert into tmp3 values(2010),('2010');
mysql> insert into tmp3 values(2010),('2166');
ERROR 1264 (22003): Out of range value for column 'y' at row 2
select * from tmp3;
- 例:向tmp3表中y字段插入2位字符串表示的YEAR值,分別為’0’、’00’、’77’和’10’
mysql> insert into tmp3 values('0'),('00'),('77'),('10');
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> select * from tmp3;
+------+
| y |
+------+
| 2000 |
| 2000 |
| 1977 |
| 2010 |
+------+
4 rows in set (0.00 sec)
- 例:向tmp3表中y字段插入2位數字表示表示的YEAR值,分別為0、78和11,
mysql> insert into tmp3 values(0),(78),(11);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from tmp3;
+------+
| y |
+------+
| 2000 |
| 2000 |
| 1977 |
| 2010 |
| 0000 |
| 1978 |
| 2011 |
+------+
7 rows in set (0.00 sec)
- 例: 創建數據表tmp4,定義數據類型為TIME的字段t,向表中插入值’10:05:05’,’23:23’,’2 10:10’,’3 02’,’10’
mysql> create table tmp4( t time );
Query OK, 0 rows affected (0.01 sec)
mysql> insert into tmp4 values('10:20:20'),('22:23'),('2 10:10'),('3 02'),('10');
Query OK, 5 rows affected (0.01 sec)
Records: 5 Duplicates: 0 Warnings: 0
mysql> select * from tmp4;
+----------+
| t |
+----------+
| 10:20:20 |
| 22:23:00 |
| 58:10:00 |
| 74:00:00 |
| 00:00:10 |
+----------+
5 rows in set (0.00 sec)
在使用’D HH’格式時,小時一定要使用雙位數值,如果是小于10的小時數,應在前面加0。
例:向表tmp4中插入值’101112’,111213,’0’,107010
DELETE FROM tmp4;
INSERT INTO tmp4 values('101112'),(111213),( '0')
INSERT INTO tmp4 values ( 107010);
ERROR 1292 (22007): Incorrect time value: '107010' for column 't' at row 1
show warnings;
+---------+------+--------------------------------------------------+
| Level | Code | Message |
+---------+------+--------------------------------------------------+
| Error | 1292 | Incorrect time value: '107010' for column 't' at row 1
+---------+------+---------------------------------------------------+
可以看到,第二次在插入記錄的時候,數據超出了范圍,原因是107010的分鐘部分超過了60,分鐘部分是不會超過60的,查看結果:
- 例:創建數據表tmp5,定義數據類型為DATE的字段d,向表中插入“YYYY-MM-DD”和“YYYYMMDD”字符串格式日期
mysql> create table tmp5( d date );
Query OK, 0 rows affected (0.01 sec)
mysql> insert into tmp5 values('1998-08-08'),('19980808'),('99-09-09'),('090909');
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> select * from tmp5;
+------------+
| d |
+------------+
| 1998-08-08 |
| 1998-08-08 |
| 1999-09-09 |
| 2009-09-09 |
+------------+
4 rows in set (0.00 sec)
mysql>
- 例:向表中插入系統當前時間
mysql> delete from tmp5;
Query OK, 4 rows affected (0.02 sec)
mysql> insert into tmp5 values( current_date() ),( now() );
Query OK, 2 rows affected, 1 warning (0.05 sec)
Records: 2 Duplicates: 0 Warnings: 1
mysql> select * from tmp5;
+------------+
| d |
+------------+
| 2016-10-20 |
| 2016-10-20 |
+------------+
2 rows in set (0.00 sec)
CURRENT_DATE只返回當前日期值,不包括時間部分;NOW()函數返回日期和時間值,在保存到數據庫時,只保留了其日期部分。
- 例;當前日期時間值
CREATE TABLE tmp6( dt DATETIME );
INSERT INTO tmp6 values('1998-08-08 08:08:08'),('19980808080808'),('20101010101010'); //字符串格式
INSERT INTO tmp6 values('99-09-09 09:09:09'),('990909090909'),('101010101010');
INSERT INTO tmp6 values(19990909090909), (101010101010); //數字格式
INSERT INTO tmp6 values( NOW() );
例:TIMESTAMP
CREATE TABLE tmp7( ts TIMESTAMP);
INSERT INTO tmp7 values ('19950101010101'),('950505050505'),('1996-02-02 02:02:02'),('97@03@03 03@03@03'),(121212121212),( NOW() );
SELECT * FROM tmp7;
+-------------------------+
| ts |
+-------------------------+
| 1995-01-01 01:01:01 |
| 1995-05-05 05:05:05 |
| 1996-02-02 02:02:02 |
| 1997-03-03 03:03:03 |
| 2012-12-12 12:12:12 |
| 2013-03-24 09:17:49 |
+-------------------------+
TIMESTAMP與DATETIME除了存儲字節和支持的范圍不同外,還有一個最大的區別就是:DATETIME在存儲日期數據時,按實際輸入的格式存儲,即輸入什么就存儲什么,與時區無關;而TIMESTAMP值的存儲是以UTC(世界標準時間)格式保存的,存儲時對當前時區進行轉換,檢索時再轉換回當前時區。即查詢時,根據當前時區的不同,顯示的時間值是不同的
- 例:更改時區
DELETE FROM tmp7;
INSERT INTO tmp7 values( NOW() );
SELECT * FROM tmp7;
+-------------------------+
| ts |
+-------------------------+
| 2013-03-24 10:02:42 |
+-------------------------+
set time_zone='+10:00';
SELECT * FROM tmp7;
+-------------------------+
| ts |
+-------------------------+
| 2013-03-24 12:02:42 |
+-------------------------+
【例 5.17】創建數據表tmp7,定義數據類型為TIMESTAMP的字段ts,向表中插入
create table tmp7 values ('19950101010101'),('950505050505'),('1996-02-02 02:02:02'),('97@03@03 03@03@03'),('121212121212'),( now() );
select *from tmp7;
+-------------------------+
| ts |
+-------------------------+
| 1995-01-01 01:01:01 |
| 1995-05-05 05:05:05 |
| 1996-02-02 02:02:02 |
| 1997-03-03 03:03:03 |
| 2012-12-12 12:12:12 |
| 2013-03-24 09:17:49 |
+-------------------------+
由結果可以看到,’19950101010101’被轉換為1995-01-01 01:01:01;’950505050505’被轉換為1995-05-05 05:05:05;’1996-02-02 02:02:02’被轉換為1996-02-02 02:02:02;’97@03@03 03@03@03’被轉換為1997-03-03 03:03:03;121212121212被轉換為2012-12-12 12:12:12;NOW()被轉換為系統當前日期時間2013-03-24 09:17:49。
TIMESTAMP與DATETIME除了存儲字節和支持的范圍不同外,還有一個最大的區別就是:DATETIME在存儲日期數據時,按實際輸入的格式存儲,即輸入什么就存儲什么,與時區無關;而TIMESTAMP值的存儲是以UTC(世界標準時間)格式保存的,存儲時對當前時區進行轉換,檢索時再轉換回當前時區。即查詢時,根據當前時區的不同,顯示的時間值是不同的。
- 【例5.18】向tmp7表中插入當前日期,查看插入值,更改時區為東10區,再次查看插入值,
delete from tmp7;
insert into tmp7 values( now() );
select * from tmp7;
+-------------------------+
| ts |
+-------------------------+
| 2013-03-24 10:02:42 |
+-------------------------+
set time_zone='+10:00';
select * from tmp7;
+-------------------------+
| ts |
+-------------------------+
| 2013-03-24 12:02:42 |
+-------------------------+
5.1.4字符串類型
字符串類型用來存儲字符串數據,除了可以存儲字符串數據之外,還可以存儲其他數據,比如圖片和聲音的二進制數據
- char
- varchar
- binary
- varbinary
- blob
- text
- enum
- set
- 【例5.20】創建tmp8表,定義字段ch和vch數據類型依次為CHAR(4)、VARCHAR(4)向表中插入數據“ab ”
create table tmp8(
ch char(4), vch varchar(4)
);
insert into tmp8 values('ab ', 'ab ');
select * from tmp8;
此時ab都存入了相應的表,但char將末尾的兩個空格刪除了,vch字段保留了末尾的兩個空格
- 【例5.21】創建表tmp9,定義ENUM類型的列enm('first','second','third'),查看列成員的索引值
create table tmp9 ( enm enum('first', 'second', 'third') );
insert into tmp9 values('first'),('second'),('third'), (NULL);
select enm, enm+0 from tmp9; 查看索引值
- 【例5.22】創建表tmp10,定義INT類型的soc字段,ENUM類型的字段level,列表值為('excellent','good', 'bad'),向表tmp10中插入數據’good’,1,2,3,’best’
create atble tmp10 (soc int, level enum('excellent', 'good', 'bad') );
insert into tmp10 values(70,'good'), (90,1),(75,2),(50,3);
insset into tmp10 values(100,'best'); 報錯
- 【例5.23】創建表tmp11,定義SET類型的字段s,取值列表為('a', 'b', 'c', 'd'),插入數據('a'),('a,b,a'),('c,a,d'),('a,x,b,y')
create table tmp11(s set('a', 'b', 'c', 'd') );
insert into tmp11 values('a'), ('a,b,c'), ('b,c');
select * from table tmp11;
- 【例5.24】創建表tmp12,定義BIT(4)類型的字段b,向表中插入數據2、9、15、16
create table tmp12( b BIT(4) );
insert into tmp12 values(2), (9), (15);
select bin(b+0) from tmp12;
b+0表示將二進制的結果轉換為對應的數字的值,BIN() 函數將數字轉換為二進制。從結果可以看到,成功的將3個數插入到表中。
- 【例5.25】創建表tmp13,定義BINARY(3)類型的字段b和VARBINARY(3)類型的字段vb,并向表中插入數據’5’,比較兩個字段的存儲空間。
create table tmp13( b binary(3), vb varbinary(30));
insert into tmp13 values(5,5);
select length(b), length(vb) from tmp13;
可以看到,b字段的值數據長度為3,而vb字段的數據長度僅為插入的一個字符的長度1。
由執行結果可以看出,b字段和vb字段的長度是截然不同的,因為b字段不足的空間填充了’\0’,而vb字段則沒有填充。
5.1.5二進制類型
存儲二進制數據類型的數據類型
- bit
- binary
- varbinary
- tinyblob
- blob
- mediumblb
- longblob
- 【例5.26】創建表tmp14,定義數據類型為INT的字段num,插入值64,對num值進行算術運算:
create table tmp14 ( num int );
insert into tmp14 value(64);
select num, num+10, num-3+5, nun+5-3, num+36.5 from tmp14;
- 對tmp14表中的num進行乘法、除法運算。
select num, num*2, num/2, num/3, num%3 from tmp14;
- 【例5.28】用0除num。
select num, num/0, num%0 from tmp14;
- 【例5.29】使用’=’進行相等判斷,
select 1=0, '2'=2, 2=2, '0.02'=0, 'b'='b', (1+3) = (2+2), null =null;
+-----+-------+-----+----------+---------+------------------+-----------------+
| 1=0 | '2'=2 | 2=2 | '0.02'=0 | 'b'='b' | (1+3) = (2+2) | NULL=NULL |
+-----+-------+-----+----------+---------+------------------+-------------------+
| 0 | 1 | 1 | 0 | 1 | 1 | NULL |
+-----+-------+-----+----------+---------+------------------+-------------------+
1 row in set (0.00 sec)
- 【例5.30】使用’<=>’進行相等的判斷
SELECT 1<=>0, '2'<=>2, 2<=>2,'0.02'<=>0, 'b'<=>'b', (1+3) <=> (2+1),NULL<=>NULL;
由結果可以看到,’<=>’在執行比較操作時和’=’的作用是相似的,唯一的區別是’<=>’可以用來對NULL進行判斷,兩者都為NULL時返回值為1。
3.不等于運算符 <>或者 !=
‘<>’或者’!=’用于判斷數字、字符串、表達式不相等的判斷。如果不相等,返回值為1;否則返回值為0。這兩個運算符不能用于判斷空值NULL。
【例5.32】使用’<=’進行比較判斷,SQL語句如下:
SELECT 'good'<='god', 1<=2, 4<=4, 5.5<=5, (1+3) <= (2+1),NULL<=NULL;
+---------------+-------+------+--------+--------------------+------------------------+
| 'good'<='god' | 1<=2 | 4<=4 | 5.5<=5 | (1+3) <= (2+1)| NULL<=NULL |
+---------------+-------+------+--------+-------------------+-------------------------+
| 0 | 1 | 1 | 0 | 0 | NULL |
+---------------+-------+------+--------+-------------------+-------------------------+
1 row in set (0.00 sec)
由結果可以看到,左邊操作數小于或者等于右邊時,返回值為1,例如:4<=4;當左邊操作數大于右邊時,返回值為0,例如:’good’第3個位置的’o’字符在字母表中的順序大于’god’中的第3個位置的’d’字符,因此返回值為0;同樣比較NULL值時返回NULL。【例5.33】使用’<’進行比較判斷,SQL語句如下:
SELECT 'good'<'god', 1<2, 4<4, 5.5<5, (1+3) < (2+1),NULL<NULL;
- 【例5.34】使用’>=’進行比較判斷,SQL語句如下:
SELECT 'good'>='god', 1>=2, 4>=4, 5.5>=5, (1+3) >= (2+1),NULL>=NULL;
- 【例5.35】使用’>’進行比較判斷,SQL語句如下:
SELECT 'good'>'god', 1>2, 4>4, 5.5>5, (1+3) > (2+1),NULL>NULL;
- 【例5.36】使用IS NULL、ISNULL和IS NOT NULL判斷NULL值和非NULL值,SQL語句如下:
SELECT NULL IS NULL, ISNULL(NULL),ISNULL(10), 10 IS NOT NULL;
- 【例5.37】使用BETWEEN AND 進行值區間判斷,輸入SQL語句如下:
SELECT 4 BETWEEN 4 AND 6, 4 BETWEEN 4 AND 6,12 BETWEEN 9 AND 10;
SELECT 'x' BETWEEN 'f' AND 'g', 'b' BETWEEN 'a' AND 'c';
- 【例5.38】使用LEAST運算符進行大小判斷,SQL語句如下:
SELECT least(2,0), least(20.0,3.0,100.5), least('a','c','b'),least(10,NULL);
- 【例5.39】使用GREATEST運算符進行大小判斷,SQL語句如下:
SELECT greatest(2,0), greatest(20.0,3.0,100.5), greatest('a','c','b'),greatest(10,NULL);
- 【例5.40】使用IN、NOT IN運算符進行判斷,SQL語句如下:
SELECT 2 IN (1,3,5,'thks'), 'thks' IN (1,3,5,'thks');
- 【例5.41】存在NULL值時的IN查詢,SQL語句如下:
SELECT NULL IN (1,3,5,'thks'),10 IN (1,3,NULL,'thks');
- 【例5.42】使用運算符LIKE進行字符串匹配運算,SQL語句如下:
SELECT 'stud' LIKE 'stud', 'stud' LIKE 'stu_','stud' LIKE '%d','stud' LIKE 't_ _ _', 's' LIKE NULL;
- 【例5.43】使用運算符REGEXP進行字符串匹配運算,SQL語句如下:
SELECT 'ssky' REGEXP '^s', 'ssky' REGEXP 'y$', 'ssky' REGEXP '.sky', 'ssky' REGEXP '[ab]';
- 【例5.44】分別使用非運算符“NOT”和“!”進行邏輯判斷,SQL語句如下:
SELECT NOT 10, NOT (1-1), NOT -5, NOT NULL, NOT 1 + 1;
SELECT !10, !(1-1), !-5, ! NULL, ! 1 + 1;
- 【例5.45】分別使用與運算符“AND”和“&&”進行邏輯判斷,SQL語句如下:
SELECT 1 AND -1,1 AND 0,1 AND NULL, 0 AND NULL;
SELECT 1 && -1,1 && 0,1 && NULL, 0 && NULL;
- 【例5.46】分別使用或運算符“OR”和“||”進行邏輯判斷,SQL語句如下:
SELECT 1 OR -1 OR 0, 1 OR 2,1 OR NULL, 0 OR NULL, NULL OR NULL;
SELECT 1 || -1 || 0, 1 || 2,1 || NULL, 0 || NULL, NULL || NULL;
- 【例5.47】使用異或運算符“XOR”進行邏輯判斷,SQL語句如下:
SELECT 1 XOR 1, 0 XOR 0, 1 XOR 0, 1 XOR NULL, 1 XOR 1 XOR 1;
執行上面的語句,結果如下。
SELECT 1 XOR 1, 0 XOR 0, 1 XOR 0, 1 XOR NULL, 1 XOR 1 XOR 1;
- 【例5.48】使用位或運算符進行運算,SQL語句如下:
SELECT 10 | 15, 9 | 4 | 2;
- 【例5.49】使用位與運算符進行運算,SQL語句如下:
SELECT 10 & 15, 9 &4& 2;
- 【例5.50】使用位異或運算符進行運算,SQL語句如下:
SELECT 10 ^ 15, 1 ^0, 1 ^ 1;
- 【例5.51】使用位左移運算符進行運算,SQL語句如下:
SELECT 1<<2, 4<<2;
- 【例5.52】使用位右移運算符進行運算,SQL語句如下:
SELECT 1>>1, 16>>2;
- 【例5.53】使用位取反運算符進行運算,SQL語句如下:
SELECT 5 & ~1;
1. 案例目的
- 創建數據表,并對表中的數據進行運算操作,掌握各種運算符的使用方法。
創建表tmp15,其中包含VARCHAR類型的字段note和INT類型的字段price,使用運算符對表tmp15中不同的字段進行運算;使用邏輯操作符對數據進行邏輯操作;使用位操作符對數據進行位操作。 - 本案例使用數據表tmp15,首先創建該表,SQL語句如下:
CREATE TABLE tmp15 (note VARCHAR(100), price INT);
- 向表中插入一條記錄,note值為“Thisisgood”,price值為50,SQL語句如下:
INSERT INTO tmp15 VALUES(“Thisisgood”, 50);
2. 案例操作過程
- 對表tmp15中的整型數值字段price進行算術運算,執行過程如下:
SELECT price, price + 10, price -10, price * 2, price /2, price%3 FROM tmp15 ;
+--------+------------+-----------+-----------+-----------+---------+
| price | price + 10 | price -10 | price * 2 | price /2 | price%3 |
+--------+------------+-----------+-----------+-----------+---------+
| 50 | 60 | 40 | 100 | 25.0000 | 2 |
+--------+------------+-----------+-----------+-----------+---------+
- 對表tmp15中的整型數值字段price進行比較運算,執行過程如下:
SELECT price, price> 10, price<10, price != 10, price =10, price <=>10,price <>10 FROM tmp15 ;
+--------+-----------+-----------+--------------+------------+---------------+--------------+
| price | price> 10 | price<10 | price != 10 | price =10 | price <=>10 | price <>10 |
+--------+-----------+-----------+--------------+------------+---------------+--------------+
| 50 | 1 | 0 | 1 | 0 | 0 | 1 |
+------ -+-----------+-----------+--------------+------------+----------------+--------------+
- 判斷price值是否落在30~80區間;返回與70,30相比最大的值,判斷price是否為IN列表(10, 20, 50, 35)中的某個值,執行過程如下:
mysql> SELECT price, price BETWEEN 30 AND 80, GREATEST(price, 70,30), price IN (10, 20, 50,35) FROM tmp15 ;
+--------+------------------------------------+--------------------------------+----------------------------+
| price | price BETWEEN 30 AND 80 | GREATEST(price, 70,30) | price IN (10, 20, 50,35) |
+--------+------------------------------------+--------------------------------+----------------------------+
| 50 | 1 | 70 | 1 |
+--------+------------------------------------+--------------------------------+----------------------------+ - 對tmp15中的字符串數值字段note進行比較運算,判斷表tmp15中note字段是否為空;使用LIKE判斷是否以字母’t’開頭;使用REGEXP判斷是否以字母’y’結尾;判斷是否包含字母’g’或者’m’,執行過程如下:
mysql> SELECT note, note IS NULL, note LIKE 't%', note REGEXP '$y' ,note REGEXP '[gm]' FROM tmp15 ;
+--------------+----------------+-------------------+-----------------------+--------------------------+
| note | note IS NULL | note LIKE 't%' | note REGEXP '$y' | note REGEXP '[gm]' |
+--------------+----------------+------------------+------------------------+--------------------------+
| Thisisgood | 0 | 1 | 0 | 1 |
+--------------+-----------------+------------------+----------------------+---------------------------+ - 將price字段值與NULL,0進行邏輯運算,執行過程如下:
mysql> SELECT price, price && 1, price && NULL, price||0, price AND 0, 0 AND NULL, price OR NULL FROM tmp15 ;
+--------+--------------+--------------------+----------+---------------+------------------+--------------------+
| price | price && 1 | price && NULL | price||0 | price AND 0 | 0 AND NULL | price OR NULL |
+--------+--------------+--------------------+----------+---------------+------------------+--------------------+
| 50 | 1 | NULL | 1 | 0 | 0 | 1 |
+--------+--------------+-------------------+-----------+---------------+------------------+--------------------+
1 row in set (0.00 sec)
mysql> SELECT price,!price,NOT NULL,price XOR 3, 0 XOR NULL, price XOR 0 FROM tmp15 ;
+--------+--------+--------------+----------------+-----------------+-----------------+
| price | !price | NOT NULL | price XOR 3 | 0 XOR NULL | price XOR 0 |
+--------+--------+--------------+----------------+-----------------+-----------------+
| 50 | 0 | NULL | 0 | NULL | 1 |
+--------+--------+--------------+----------------+-----------------+-----------------+
1 row in set (0.00 sec) - 將price字段值與2、4進行按位與、按位或操作,并對price進行按位操作,執行過程如下:
mysql> SELECT price, price&2 , price|4, ~price FROM tmp15 ;
+--------+----------+---------+-----------------------------+
| price | price&2 | price|4 | ~price |
+--------+----------+---------+-----------------------------+
| 50 | 2 | 54 | 18446744073709551565 |
+--------+----------+---------+------------------------------+ - 將price字段值分別左移和右移兩位,執行過程如下:
mysql> SELECT price, price<<2, price>>2 FROM tmp15 ;
+--------+------------+-----------+
| price | price <<2 | price>>2 |
+--------+------------+-----------+
| 50 | 200 | 12 |
+--------+------------+-----------+