MySQL學習
資料庫
請不要假裝很努力,因為結果不會陪你演戲。
typora快捷鍵 //blog.csdn.net/weixin_30619101/article/details/97707926
1. 認識資料庫
1.1 資料庫分類
| 類型 | 關係型資料庫 | 非關係型資料庫 |
|---|---|---|
| 舉例 | MySQL,Oracle,SQL server,DB2,SQLite | Redis,MongDB |
| 特徵 | 通過表和表之間,行和列之間的關係進行數據的存儲。 | 非關係型資料庫,對象存儲,通過對象的自身屬性來決定 |
1.2 Mysql資料庫
MySQL是一個關係型資料庫管理系統,由瑞典[MySQL AB](//baike.baidu.com/item/MySQL AB/2620844) 公司開發,屬於 Oracle 旗下產品。
MySQL是最好的 RDBMS (Relational Database Management System,關係資料庫管理系統) 應用軟體之一。
MySQL所使用的 SQL 語言是用於訪問資料庫的最常用標準化語言。
2. 操作資料庫
2.1 連接資料庫
- 連接到伺服器
$> mysql -h host -u user -p
Enter password: ********
-
斷開連接
QUIT(或\q或exit)來斷開連接:
mysql> QUIT
Bye
- 單行注釋
--
- 多行注釋
/*
xx
*/
結構化語言(CURD)
DDL(Data DefinitionLanguage) 資料庫定義語言
DML(Data Manipulation Language) 資料庫操作語言
DQL(Data QueryLanguage) 資料庫查詢語言
DCL(Data Control Language) 資料庫控制語言
2.2 操作資料庫
- 創建資料庫
create database[if not exists] 資料庫名;
- 刪除資料庫
drop database[if exists] 資料庫名;
- 使用資料庫(如果表名是特殊字元,則需要加``)
use 資料庫名--;可以省略
- 查看資料庫
show databases;--查看所有的資料庫
- 查看創建資料庫
show create database 資料庫名;
2.3 數據表的列類型
數值
| 類型 | 特徵 | 大小 |
|---|---|---|
| tinyint | 十分小的數據 | 1個位元組 |
| smallint | 較小的數據 | 2個位元組 |
| mediumint | 中等大小的數據 | 3個位元組 |
| int | 標準的整數 | 4個位元組 |
| bigint | 較大的數據 | 8個位元組 |
| float | 浮點數 | 4個位元組 |
| double | 浮點數(雙精度) | 8個位元組 |
| decimal | 字元串形式的浮點數(金融行業) |
字元串
| 類型 | 特徵 | 大小 |
|---|---|---|
| char | 字元串固定大小 | 0~255 |
| varchar | 可變字元串(string) | 0~6553 |
| tingytex | 微型文本 | 2^8-1 |
| text | 文本串(保存大文本) | 2^16-1 |
時間日期
| 類型 | 格式 | 備註 |
|---|---|---|
| date | YYYY-MM-DD | 日期格式 |
| time | HH:mm:ss | 時間格式 |
| datetime | YYYY-MM-DD HH:mm:ss | 最常用的格式 |
| timestamp | 1970-1-1至今 | 時間戳 |
| year | YYYY | 年份表示 |
null
空值,未知
- 不要使用null運算,結果為null
2.4 數據表的欄位屬性
Unsigned:
- 無符號整數
- 聲明了該列不能為負數
Zerofill(無符號):
- 0填充
- 不足位數,用0填充
自增:
- 自動在上一條記錄的基礎上加1
- 通常用來設計唯一主鍵--index,必須是整數
- 可以自定義初始值和步長
不是Null:
- 如果設置為not null,不賦值則為空
- null,如果不填寫值,默認為nnull
默認(default):
- 設置默認值
表的定義規則
***每一個表,都必須存在以下五個欄位!表示一個記錄存在的意義!
id 主鍵
`version` 樂觀鎖
is_create 偽刪除
gmt_create 創建時間
gmt_update 修改時間
2.5 創建數據表
create table [if not exists] `表名`(
`欄位名` 列類型[屬性][索引][注釋],
`欄位名` 列類型[屬性][索引][注釋],
…………
`欄位名` 列類型[屬性][索引][注釋]
)[表類型][字符集設置][注釋]
- 格式
create table if not exists `student`(
`id` int(4) not null auto_increment primary key,
`name` varchar(10) not null,
`gender` varchar(2) not null,
`birthdy` datetime not null
)engine=innodb default charset=utf8
- 查看創建數據表
show create table 表名;
- 查看錶的結構
desc 表名; --describe 表名;
- 刪除表
drop table [if exists] 表名;
資料庫引擎
| myisam | innodb | |
|---|---|---|
| 事物支援 | 不支援 | 支援 |
| 數據行鎖定 | 不支援 | 支援 |
| 外鍵約束 | 不支援 | 支援 |
| 全文索引 | 支援 | 不支援 |
| 表空間的大小 | 較小 | 較大,約為2倍 |
常規使用操作:
- myisam 節約空間,速度較快
- innodb 安全性高,事務的處理,多表用戶操作
資料庫的物理空間
在安裝目錄的data文件夾下!
本質還是文件的存儲
MySQL引擎在物理文件上的區別
- innodb在資料庫表中只有一個*.frm文件,以及上機目錄下的ibdata1文件
- myisam對應文件
- *.fram 表結構的定義文件
- *.myd 數據文件(data)
- *.myi 索引文件(index)
字符集編碼
設置資料庫表的字符集編碼
charset=utf8
默認編碼格式latin1(不支援中文)
在my.ini中修改默認配置
2.6 修改數據表
- 修改表名
alter table 舊錶名 rename as 新表名;
- 增加表的欄位
alter table 表名 add 欄位名 列屬性;
- 修改表的欄位
修改欄位約束
alter table 表名 modify 欄位名 列屬性;
修改欄位名
alter table 表名 change 欄位名 列屬性;
modify和change區別
-
modify不能用來欄位重命名,只能修改欄位類型和約束
-
change用來欄位重命名,不能修改欄位類型和約束
- 刪除表的欄位
alter table 表名 drop 欄位名;
3. MySQL數據管理
3.1 外鍵
方法一 (創建的時候添加外鍵約束)
定義外鍵key,添加外鍵添加約束
create table `grade`(
`gradeid` int(4) not null auto_increment,
`gradename` varchar(10) not null,
primary key (`gradeid`)
)engine=innodb default charset=utf8
create table if not exists `student`(
`id` int(4) not null auto_increment ,
`name` varchar(10) not null,
`gradeid` varchar(10) not null,
`gender` varchar(2) not null,
`birthdy` datetime not null.
primary key (`id`),
key `fk_gradeid` (`gradeid`),
constraint `fk_gradeid` foreign key (`gradeid`) references `grade` (`gradeid`)
)engine=innodb default charset=utf8
方法二 (表創建完添加外鍵約束)
alter table 表名
add constraint `fk_gradeid` foreign key(`gradeid`) references `grade` (`gradeid`)
以上操作為物理外鍵,通常使用程式來實現外鍵
3.2 DML語言(資料庫操作語言)
insert 插入
update 修改
delete 刪除
3.3 添加
insert
插入語句(欄位和值對應 )
inert into 表名([欄位1][欄位2][...]) values([值1][值2[...]);
INSERT INTO `student`(`name`,`age`)VALUES('李四','18')
3.4 修改
update
指定條件
update 表名 set colnum_name=value where 條件;
不指定條件(會改動所有表)
update 表名 set colnum_name=value;
修改多個屬性
update 表名 set colnum_name1=value1,[colnum_name2=value2] where 條件;
UPDATE `student` SET `name` = '王五' WHERE id = 2
操作符返回 布爾值
| 操作符 | 含義 | 範圍 | 結果 |
|---|---|---|---|
| = | 等於 | 5=6 | false |
| <> 或 != | 不等於 | 5<>6 | true |
| > | 大於 | 5>6 | false |
| < | 小於 | 5<6 | true |
| >= | 大於等於 | 5>=6 | false |
| <= | 小於等於 | 5<=6 | true |
| between...and... | 區間 | [5,6] | |
| and | 與(&&) | 5 and 6 | |
| or | 或(||) | a>5 or b< 6 |
通過多個條件定位語句
UPDATE `student` SET `name` = '嶼龍' WHERE `id` >= 2 OR `name` != '嶼龍'
注意:
-
colnum_name 是資料庫的列要加上``
-
value可以是具體值,也可以是變數
3.5 刪除
delete
語法:delete from 表名 [where 條件]
-- 刪除資料庫
delete from `student`
-- 刪除指定數據
delete from `student` where `id` = 1
truncate 命令
作用:完全清空一個資料庫,表的約束和結構不變
-- 清空資料庫
truncate `student`
delete 和truncate區別
- 相同點:都能刪除數據,都不會刪除表的結構
- 不同點:
- truncate 重新設置自增列 計數器歸零
- truncate 不會影響事物
4.DQL查詢數據
4.1DQL(資料庫查詢語言)
所有查詢 語句 select
4.2 查詢指定欄位
語法:select 欄位 1,...from 表
-- 查詢全部學生
select * from student
-- 查詢指定欄位
select `name`,`age` from student
-- 別名:給結果/表起一個名字 as
select `name` as 姓名,`age` as 年齡 from student from student as a
-- sql函數 concat拼接字元串
select concat('姓名:',`name`) as 新名字 from student
註:當欄位名不能很好的表示數據本來的意思,可以給欄位起別名以便於理解
distinct 去重
作用:去除select查詢出來的結果中重複的數據,重複的數據只顯示一條
-- 查詢一下有哪些同學參加了考試,成績
SELECT * FROM resu1t -- 查詢全部的考試成績
SELECT `studentNo` FROM result -- 查詢有哪些同學參加了考試
SELECT DISTINCT `studentNo` FROM resu1t -- 發現重複數據,去重
資料庫的列(表達式)
select version() -- 查詢資料庫的版本(函數)
selcet 1*55-1 as 計算結果 -- 用來計算(表達式)
select @@auto_increment_increment -- 查詢自增的步長(變數)
-- 成績+1分
SELECT `studentNo`, `studentResult` +1 AS `提分後` FROM result
資料庫中的表達式:文本值,列,NUl,函數,計算表達式,系統變數
select 表達式 from 表
4.3 where條件子句
作用:檢索數據中符合條件的值
搜索的條件由一個或多個組成
邏輯運算符
| 運算符 | 語法 | 描述 |
|---|---|---|
| and && | a and b a&&b | 邏輯與,同為真時為真 |
| or || | a or b a||b | 邏輯或,同為假時假 |
| not ! | not a !a | 邏輯非,取反 |
SELECT studentNo. `studentResult` FROM result
-- 查詢考試成績在95~100分之間
SELECT studentNo, `studentResult` FROM result WHERE StudentResult>=95 AND StudentResult<=100
-- and&&
SELECT studentNo, `studentResult` FROM result WHERE studentResu1t>=95 && studentResult<=100
-- 模糊查詢(區間)
SELECT studentNo, `studentResult` FROM result WHERE StudentResu1t BETWEEN 95 AND 100
-- 除了1000號學生之外的同學的成績
SELECT studentNo, `studentResult` FROM result WHERE studentNo!=1000
-- !=not
SELECT studentNo, `studentResult` FROM result WHERE NOT studentNo = 1000
