001MySQL5.6從零開始學

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 |
    +--------+------------+-----------+
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,739評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,634評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,653評論 0 377
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,063評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,835評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,235評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,315評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,459評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,000評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,819評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,004評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,560評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,257評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,676評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,937評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,717評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,003評論 2 374

推薦閱讀更多精彩內容