mysql入門以及遠端訪問
MySQL 資料庫的使用
一、MySQL 簡介
1什麼是 MySQL
MySQL 是一個關係型資料庫管理系統,由瑞典 MySQL AB 公司開發,目前屬於
Oracle 公司。MySQL 是一種關係型資料庫管理系統,關係型資料庫將資料儲存在不同的表
中,而不是將所有資料放在一個大倉庫內,這樣就增加了速度並提高了靈活性。
2MySQL 特點
MySQL 是開源的,所以你不需要支付額外的費用。
MySQL 支援大型系統的資料庫。可以處理擁有上千萬條記錄的大型資料庫。
MySQL 使用標準的 SQL(結構化查詢語言) 資料語言形式。
MySQL 可以運行於多個系統上,並且支援多種語言。這些程式語言包括 C、C++、
Python、Java、Perl、PHP、Eiffel、Ruby 和 Tcl 等。
MySQL 儲存資料量較大,32 位系統表文件最大可支援 4GB,64 位系統支援最大的
表文件為 8TB。
目前小型系統開發流行的架構(linux,apatche(伺服器),php,mysql)
二、MySQL 的安裝與解除安裝
1MySQL 版本說明
MySQL Community Server 社群版本,開源免費,但不提供官方技術支援。
MySQL Enterprise Edition 企業版本,需付費,可以試用 30 天。
MySQL Cluster 叢集版,開源免費。可將幾個 MySQL Server 封裝成一個 Server。
MySQL Cluster CGE 高階叢集版,需付費。
2安裝 MySQL 8.0
下載地址:https://dev.mysql.com/downloads/installer/
安裝依賴
Microsoft Visual C++ 2015下載地址:
https://www.updatestar.com/zh-cn/directdownload/microsoft-visual-c-2015-redistributable-package/2249800
三、MySQL 的客戶端工具
1MySQL 自帶的客戶端端工具
四、MySQL 與 Oracle 的區別
1例項區別
MySQL 是輕量型資料庫,開源免費。Oracle 是收費的而且價格非常高。
MySQL 安裝完後 300M 而 Oracle 有 5G 左右。
MySql是一般可以直接在一個使用者root下建多個數據庫,再在資料庫下建表
Oracle一般先建立一個使用者,再給其授權,再在使用者下建立資料庫表
預設的編碼方式是用Latin1(西歐文)
2操作區別
主鍵: MySQL 一般使用自動增長型別,而 Oracle 則需要使用序列物件。
單引號的處理: MySQL 裡字串可以用雙引號包起字串也可以用單引號,ORACLE 裡只可以用單引號包
起字串。
分頁的 SQL 語句: MYSQL 用 limit,而 Oracle 需要使用 rownum 偽列。
事務處理:MySQL 預設是自動提交,而 Oracle 預設不自動提交,需要使用者 CTL 語言
進行事務提交。
五、操作 MySQL
1建立與刪除資料庫
1.1建立資料庫
1.1.1使用命令建立資料庫
create database 資料庫名 default character set 字元編碼;
建立一個scott的資料庫,並檢視該資料庫,及設定編碼。
建立資料庫:
create database scott default character set utf8;
檢視 當前使用者下的所有的庫:
show databases;
1.2刪除資料庫
1.2.1使用命令刪除資料庫
Drop database 資料庫名
drop database scott;
2選擇資料庫
需要在哪個庫中建立表需要先選擇該資料庫。
use 需要選擇的庫的名稱。
use scott;
3MySQL 中的資料型別
3.1數值型別(int)
MySQL 支援所有標準 SQL 數值資料型別。
作為 SQL 標準的擴充套件,MySQL 也支援整數型別 TINYINT、MEDIUMINT 和 BIGINT(類似於java中的bigdecimal)。
數值型別中的長度 m 是指顯示長度,並不表示儲存長度,只有欄位指定 zerofill 時有用
例如:
int不需要指定長度.
int(3),如果實際值是 1,如果列指定了 zerofill,查詢結果就是 002,左邊用 0 來
填充
3.2浮點型
3.3字串型
3.3.1char 和 varchar
1)char(n) 若存入字元數小於 n,則以空格補於其後,查詢之時再將空格去掉。所以 char
型別儲存的字串末尾不能有空格,varchar 不限於此。
2) char 型別的字串檢索速度要比 varchar 型別的快。
3.4日期型別(date)
3.5二進位制資料(BLOB) 64位中最大單個檔案可以存8G
1)BLOB
是以二進位制方式儲存,不分大小寫。
2)BLOB 儲存的資料只能整體讀出。
4建立表與刪除表
4.1建立表
建立一個表
create table student(
sid int primary key,
sname varchar(20) not null
);
insert into student values(1,'張三');
4.2刪除表
4.2.1通過 DDL 語句刪除表
刪除 一個 表
drop table 表名;
drop table student;
6.MySQL 中的約束
6.1約束型別
· 非空約束(not null)
· 唯一性約束(unique)
· 主鍵約束(primary key)
· 外來鍵約束(foreign key) ,只支援表級別定義外來鍵約束
· 檢查約束(目前 MySQL 不支援、Oracle 支援)
6.2建立表
主鍵設定自動遞增:
create table student(
sid int primary key auto_increment, # auto_increment表示自動遞增+1
sname varchar(20) not null,
sex char(3),
email varchar(50) unique,
cid int,
constraint fk_clazz_cid foreign key(cid) references clazz(cid) #外來鍵約束,constraint注意constraint不帶s,oracle中是constraints
);
create table clazz(
cid int primary key auto_increment,
cname varchar(20) not null
);
insert into clazz values(null,'高等數學');
insert into clazz values(null,'國際英語');
select * from clazz;
insert into student values(null,'張三','男','[email protected]',1);
insert into student values(null,'李四','男','[email protected]',2);
select * from student;
select * from student s join clazz c on s.cid = c.cid;
查詢表中的約束資訊
show keys from 表名
show keys from student;
7.1.2自動增長(auto_increment)
MySQL 中的自動增長型別要求:
· 一個表中只能有一個列為自動增長。
· 自動增長的列的型別必須是整數型別。
· 自動增長只能新增到具備主鍵約束與唯一性約束的列上。
7.1.3預設值處理
在 MySQL 中可以使用 DEFAULT 為欄位設定一個預設值。如果在插入資料時並未指
定該列的值,那麼 MySQL 會將預設值新增到該列中。
7.1.3 插入資料時的預設值處理
如果在插入資料時並未指定該列的值,那麼 MySQL 會將預設值新增到該列中。如果是
完全項插入需要使用 default 來佔位。
create table student(
sid int primary key auto_increment, # auto_increment表示自動遞增+1
sname varchar(20) not null,
sex char(3) default '男', #處理預設值
email varchar(50) unique,
cid int,
constraint fk_clazz_cid foreign key(cid) references clazz(cid) #外來鍵約束
);
insert into student values(null,'張三',default,'[email protected]',1);#預設值用default佔位
insert into student values(null,'李四','女','[email protected]',2);
8MySQL 中的事務處理
在 MySQL 中,預設情況下,事務是自動提交的,也就是說,只要執行一條
DML (增insert、刪delete、改update)語句就開啟了事物,並且自動提交了事務
8.1關閉 MySQL 的事務自動提交
select @@autocommit; #autocommit的預設值是1代表事務是開啟的,0帶關閉
set @@autocommit = 0;#關閉自動提交事務
select @@autocommit;# 查詢事務的是否自動提交引數,預設是1,代表預設自動提交
set @@autocommit = 0;
1.4MySQL 中定義空值
包含空值的算術表示式計算結果為空。
通用函式(瞭解)
coalesce(comm,0) 如果第一個引數為null就返回0
(類似 oracle 的 nvl()函式)
ifnull(expr1,expr2)判斷 expr1 是否為 null,如果為 null,則用 expr2 來代替 null
(類似 oracle 的 nvl()函式)
IF(expr1,expr2,expr3)判斷 expr1 是否(不為 null),如果為真,則使用 expr2
替代 expr1;如果為假,則使用 expr3 替代 expr1(類似 oracle 的 NVL2()函式)
例項:
從emp標準中查詢員工的姓名,月總收入
ifnull(expr1,expr2)
IF(expr1,expr2,expr3)
查詢每個員工的年總收入
select ename,(sal+coalesce(comm,0))*12 年薪 from emp;
select ename,(sal+ifnull(comm,0))*12 年薪 from emp;
select ename,(sal+if(comm,comm,0))*12 年薪 from emp;
2.1.2模糊查詢
· like
· %表示任意個,任意字元
· _表示一個任意字元
查詢 emp 中僱員名字第二個字母是 A的僱員資訊。
select * from emp where ename like '_A%';
查詢名字裡不包含A的員工
select * from emp where ename not like '%A%';
2.1.3邏輯運算子
· and 並且,相當於 &&
· or 和
· not 不
查詢 emp 表中僱員薪水是 3000 的並且名字中含有 s 的僱員資訊
select * from emp where sal =3000 and ename like '%S%';
查詢 emp 表中僱員名字中不包含 M 的僱員資訊 NOT LIKE
查詢emp表中,叫SCOTT和CLARK的員工
select * from emp where ename ='scott' or ename='clark';#mysql中對大小寫不敏感
3.4日期函式
SYSDATE() 或者 NOW()返回當前系統時間,格式為 YYYY-MM-DD hh-mm-ss
LAST_DAY(date)返回 date 日期當月的最後一天
查詢系統的當前時間:
select sysdate() from dual; #from dual可以省略不寫
select now();
返回本月的最後一天
select last_day(now());
3.5轉換函式
date_format(date,format)將日期轉換成字串(類似 oracle 中的 to_char())
把當前系統時間按指定格式輸出為字串
select date_format(now(),'%Y-%m-%d');
select date_format(now(),'%Y年%m月%d日 %H:%i:%s');
把字串的時間轉換為date格式
str_to_date(str,format)將字串轉換成日期(類似 oracle 中的 to_date())
select str_to_date('1997-7-1','%Y-%m-%d');
往emp表中插入一條記錄
insert into emp values(4444,'張三','總經理',7902,str_to_date('2020-3-10','%Y-%m-%d'),8000,1000,20);
五.多表連線查詢
等值連線
查詢僱員 King 所在的部門名稱
select * from emp e join dept d on e.deptno = d.deptno where ename='king';
自連線
查詢每個僱員的經理的名字以及僱員的名字。
select e1.ename,e2.ename 上司 from emp e1 join emp e2 on e1.mgr = e2.empno;
查詢所有僱員的薪水級別。
select e.ename,e.sal,s.grade from emp e join salgrade s on e.sal >= s.losal
and e.sal <= s.hisal
;
外連線(OUTER JOIN)
左外連線(LEFT [OUTER] JOIN)
查詢所有僱員的名字以及他們的部門名稱,包含那些沒有部門的僱員。
select * from emp e leftjoin dept d on e.deptno = d.deptno;
右外連線(RIGHT [OUTER] JOIN)
查詢所有僱員的名字以及他們的部門名稱,包含那些沒有僱員的部門。
select * from emp e right join dept d on e.deptno = d.deptno;
92sql在mysql支援不完善
全外連結
注意:MySQL 中不支援 FULL OUTER JOIN 連線
六、MySQL 中的其他物件
1索引
MySQL 索引的建立對於 MySQL 的高效執行是很重要的,索引可以大大提高 MySQL
的檢索速度。
MySQL 中的索引
主鍵索引
主鍵索引是一種特殊的唯一索引,一個表只能有一個主鍵,不允許有空值。一般是在建
表的時候同時建立主鍵索引。
建立索引(顯示建立隱式使用,主鍵和唯一鍵會自動建立index)
用法:
當某一列頻繁的使用查詢時,此列又不是主鍵或唯一約束,可以考慮給此列建立一個索引,可以大大提高效率
create index index_name on 表名 (列名)
create index index_emp_ename on emp(ename);
刪除索引
drop index idx_name on 表名
drop index index_emp_ename on emp; #on emp oracle中不用加on 表名
七、MySQL 分頁查詢
MySQL 分頁查詢原則
· 在 MySQL 資料庫中使用 limit 子句進行分頁查詢。
· MySQL 分頁中開始位置為 0。
· 分頁子句在查詢語句的最後側。
1LIMIT 子句
語法格式
SELECT 列 FROM 表名 WHERE 條件 LIMIT 開始位置,查詢數量。
示例
查詢emp表中第1行~5行
查詢emp表中第6行~10行
查詢emp表中第11行~15行
查詢分頁的公式m代表每頁顯示m行,n代表第n頁
顯示emp表的第二頁,每頁三行資料
select * from emp limit 0,5; #從0(第一行),5表示顯示5行
select * from emp limit 5,5;
select * from emp limit 10,5;
m代表每頁顯示多少行,n程式碼第n頁
select * from emp limit m*n-n,m;
2LIMIT OFFSET 子句分頁查詢(瞭解)
語法格式
SELECT 列 FROM 表名 WHERE 條件 [ORDER BY ] LIMIT 查詢數量 OFFSET
開始位置。
查詢emp表中第1行~5行
查詢emp表中第6行~10行
查詢分頁的公式m代表每頁顯示m行,n代表第n頁
查詢emp表中第1行~5行
查詢emp表中第6行~10行
推導公式
offset的方式分頁
查詢emp表中第1行~5行
查詢emp表中第6行~10行
推導公式
select * from emp limit 5 offset 0; #limit後跟顯示的行數, offset表偏移量0表示第一行
select * from emp limit 5 offset 5;
推導的分頁查詢公式:m代表每頁顯示多少行,n程式碼第n頁
select * from emp limit m offset m*n-m;
mysql的遠端訪問
切換到mysql庫下 use mysql;
select * from user;
預設只能有本地ip來訪問mysql資料庫
update user set host = '%' where user='root';
flush privileges;#重新整理訪問許可權
接下來就可以遠端訪問mysql資料庫了