一.MySQL概述
1.常見數(shù)據(jù)庫
Oracle(神喻):甲骨文
DB2:IMB
SQL Server:微軟
Sybase:賽爾斯
MySQL:甲骨文
2.理解數(shù)據(jù)庫
我們現(xiàn)在所說的數(shù)據(jù)庫泛指“關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS)“膀篮,即”數(shù)據(jù)庫服務(wù)器“
3.數(shù)據(jù)庫就是一個(gè)多行多列的表格磺樱,需要指定表的列數(shù)婆咸,以及列名稱尚骄,列類型等形象。下圖為表結(jié)構(gòu):
4.當(dāng)把表格創(chuàng)建好之后憨闰,就可以向表格中添加數(shù)據(jù)了需五。下圖為表記錄:
總結(jié):
RDBMS=管理員(manager)+倉庫(database)
database=N個(gè)table
table:
表結(jié)構(gòu):定義表的列名和列類型
表記錄:一行一行的記錄
二.MySQL安裝
1.Linux yum安裝mysql5.7
wget?https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
rpm -ivh?mysql80-community-release-el7-3.noarch.rpm
yum repolist all |grep mysql
yum -y install yum-utils
yum-config-manager --disable mysql80-community
yum-config-manager --enable mysql57-community
yum install mysql-community-server
#sudo yum install mysql-community-{server,client,common,libs}-* mysql-5.*
grep "password" /var/log/mysqld.log
2.Linux編譯安裝 mysql5.7
1.創(chuàng)建mysql賬戶:
# useradd -r mysql -M -s /sbin/nologin
----------------------------------------------------------------------------------------------------
2.從官網(wǎng)下載.gz的源碼安裝包
mysql-5.7.20.tar.gz
boost_1_59_0.tar.gz
解壓mysql壓縮包鹉动,在解壓boost安裝包,把boost壓縮包解壓到mysql目錄里面去宏邮。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3.編譯安裝
編譯安裝有一定的系統(tǒng)安裝條件泽示,也就時(shí)對其他包的依賴。
這時(shí)候我們就要安裝一些依賴包蜜氨。下面呢械筛,我們來講一下,這些依賴包的作用以及需要使用的版本记劝。
1> cmake
2> make3.75
3> gcc4.4.6
4> Boost1.59.0
5> bison2.1
6> ncurses
7>ncurses
# yum -y install ncurses ncurses-devel openssl-devel bison gcc gcc-c++ make cmake
------------------------------------------------------------------------------------------------------------
4.配置:可以寫入一個(gè)腳本執(zhí)行
首先需要cd到解壓的mysql目錄(#cd mysql-5.7.22 )变姨,執(zhí)行下面的命令
#cmake . -DWITH_BOOST=boost_1_59_0/ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DSYSCONFDIR=/etc -DMYSQL_DATADIR=/usr/local/mysql/data -DINSTALL_MANDIR=/usr/share/man -DMYSQL_TCP_PORT=3306 -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DDEFAULT_CHARSET=utf8 -DEXTRA_CHARSETS=all -DDEFAULT_COLLATION=utf8_general_ci -DWITH_READLINE=1 -DWITH_SSL=system -DWITH_EMBEDDED_SERVER=1 -DENABLED_LOCAL_INFILE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1
[root@mysql-5.7.17 ~]# cmake . \
-DWITH_BOOST=boost_1_59_0/ \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \? MySQL的安裝目錄
-DSYSCONFDIR=/etc \? 存放 配置文件的位置 (默認(rèn)可以不安裝配置文件)
-DMYSQL_DATADIR=/usr/local/mysql/data \? 數(shù)據(jù)目錄的存放位置族扰,同時(shí)錯(cuò)誤日志文件也會在這個(gè)目錄
-DINSTALL_MANDIR=/usr/share/man \? ? 幫助文檔
-DMYSQL_TCP_PORT=3306 \? ? 默認(rèn)端口
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \? sock文件位置厌丑,用來做網(wǎng)絡(luò)通信的,客戶端連接服務(wù)器的時(shí)候會用到
-DDEFAULT_CHARSET=utf8 \? ? 默認(rèn)字符集渔呵。字符集的支持怒竿,可以調(diào)
-DEXTRA_CHARSETS=all \? 擴(kuò)展的字符集支持所有的
-DDEFAULT_COLLATION=utf8_general_ci \? 支持的utf8字符集
-DWITH_READLINE=1 \? ? 上下翻歷史命令
-DWITH_SSL=system \? ? 使用私鑰和證書登陸(公鑰)? 可以加密。 適用與長連接扩氢。壞處:速度慢
-DWITH_EMBEDDED_SERVER=1 \? 嵌入式數(shù)據(jù)庫
-DENABLED_LOCAL_INFILE=1 \? ? 從本地倒入數(shù)據(jù)耕驰,不是備份和恢復(fù)。
-DWITH_INNOBASE_STORAGE_ENGINE=1? 默認(rèn)的存儲引擎饭弓,支持外鍵
這些配置參數(shù)我偶有在下邊做解釋,大家一會看一下阀趴。
紅字標(biāo)識部分為有外網(wǎng)情況下使用
提示:boost也可以使用如下指令自動(dòng)下載,如果不下載bost壓縮包叔汁,把下面的這一條添加到配置中第二行
-DDOWNLOAD_BOOST=1/
提示一下內(nèi)容標(biāo)識配置成功:
-- Configuring done? ? ? ? ? ? ? ? ? ? 配置完成
-- Generating done? ? ? ? ? ? ? ? ? ? ? 生成完成
#make -g 數(shù)字(增加內(nèi)核CPU)
# make -j 2 &&make install
-----------------------------------------------------------------------------------------------------------
5.初始化
需要先進(jìn)入mysql的安裝目錄后裸。
命令如下:
#cd /usr/local/mysql
# ./bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
Ysnaf2O)>rRL
配置MySQL配置文件my.cnf
第一種:系統(tǒng)默認(rèn)的配置文件
在5.6中常常使用源碼包提供的默認(rèn)配置文件浪谴,而在生產(chǎn)環(huán)境中一般是進(jìn)行自定義配置文件(在5.7中會遇到support-files下沒有my-default.cnf文件的情況,這種情況直接選擇自定義配置 )
# cp support-files/my-default.cnf? /etc/my.cnf
第二種:自定義配置(生產(chǎn)環(huán)境常用)
[root@mysql1 mysql]# vim /etc/my.cnf
[mysqld]
basedir=/usr/local/mysql? ? ? ? 安裝目錄
datadir=/usr/local/mysql/data? 數(shù)據(jù)存放目錄
------------------------------------------------------------------------------------------------------------
6.啟動(dòng)mysql
# cp support-files/mysql.server /etc/init.d/mysqld? //生成mysql.server腳本(system V)
# chmod 755 /etc/init.d/mysqld(默認(rèn)是755,安全起見敲一下)
# chkconfig --add mysqld? // 給MySQL設(shè)置啟動(dòng)項(xiàng)
# chkconfig mysqld on? ? ? //給MySQL設(shè)置開機(jī)啟動(dòng)
# service mysqld start? ? ? // 執(zhí)行啟動(dòng)命令
# /etc/init.d/mysqld start
# netstat -tanp | grep 3306
--------------------------------------------------------------------------------------------------------
7.修改密碼:
方法一:
#/usr/local/mysql/bin/mysqladmin -u root -p'舊密碼'? password '新密碼'
或者
利用初始密碼進(jìn)入MySQL
#./bin/mysql -uroot -p'Psxf*=g/y28i'
mysql> SET PASSWORD=PASSWORD('123');
方法二:
>set password=password('123')
----------------------------------------------------------------------------------------------------------
8.添加環(huán)境變量:
# vi ~/.bash_profile
export PATH=$PATH:/usr/local/mysql/bin
# source? ~/.bash_profile
之后就可以在任何地方使用mysql命令登陸Mysql服務(wù)器:
#mysql? -u root -p新密碼
-------------------------------------------------------------------------------------------------------------
9.登陸mysql
# /usr/local/mysql/bin/mysql -u root -p‘123’
然后:shows databases? ? ? // 查看數(shù)據(jù)庫
退出:exit
----------------------------------------------------------------------------------------------------------
10.關(guān)閉MySQL服務(wù)
#service mysqld stop
強(qiáng)制關(guān)閉退出mysql服務(wù):(非常時(shí)期,非常手段)
pkill -9 進(jìn)程名
----------------------------------------------------------------------------------------------------------
重新安裝MySQL的步驟:(之前安裝過MySQL)
1.刪除安裝目錄:rm -rf? /usr/local/mysql
2.刪除解壓包目錄:rm -rf? ? ..../mysql.5.7.22----或者只刪除CMakeCache.txt
3.刪除mysql用戶
4.刪除mysql配置文件 /etc/my.cnf
三.SQL語句概述
SQL
1.什么是SQL:結(jié)構(gòu)化查詢語音(Structured Query Language)杈湾。
2.SQL的作用:客戶端使用SQL來操作服務(wù)器
3.SQL標(biāo)準(zhǔn)(例如SQL99,即1999年制定的標(biāo)準(zhǔn)):
>由國際標(biāo)準(zhǔn)化組織(ISO)制定悍汛,對DBMS的統(tǒng)一操作方式(例如相同的語句可以操作:mysql、oracle等)
4.SQL方言
>某種DBMS不只會支持SQL標(biāo)準(zhǔn)奋献,而且會有一些自己獨(dú)有的語法,這就稱之為方言瞳别,例如limit語句只在MySQL中可以使用
SQL語法
1.SQL語句可以在單行或多行書寫祟敛,以分號結(jié)尾
2.可使用空格和縮進(jìn)增強(qiáng)語句的可讀性
3.MySQL不區(qū)別大小寫锅睛,建議使用大寫
SQL語句分類
1.DDL(Data Definition Language):數(shù)據(jù)定義語言辣垒,用來定義數(shù)據(jù)庫對象:庫、表例驹、列等;
>創(chuàng)建、刪除松蒜、修改:庫、表結(jié)構(gòu)
2.DML(Data Manipulation Language):數(shù)據(jù)庫操作語言玖瘸,用來定義數(shù)據(jù)庫記錄(數(shù)據(jù));
>增蔑匣、刪、改:表記錄
3.DCL(Data Control Language):數(shù)據(jù)控制語言价脾,用來定義訪問權(quán)限和安全級別彼棍;
4.DQL*****(Data Query Language):數(shù)據(jù)查詢語音,用來查詢記錄(數(shù)據(jù))
DDL:數(shù)據(jù)庫或表的結(jié)構(gòu)操作
DML:對表的記錄進(jìn)行更新(增、刪蜘拉、改)
DQL:對表的記錄的查詢
DCL:對用戶的創(chuàng)建,以及授權(quán)
四.DDL(數(shù)據(jù)定義語言)之操作數(shù)據(jù)庫
1.數(shù)據(jù)庫
? 查看所有數(shù)據(jù)庫:SHOW DATABASWS;
? 切換(選擇要操作的)數(shù)據(jù)庫:USE 數(shù)據(jù)庫名
? 創(chuàng)建數(shù)據(jù)庫:CREATE DATABASE [IF NOT EXISTS] mydb1 [CHARSET=uft8]
? 刪除數(shù)據(jù)庫:DROP DATABASE [IF EXISTS] mydb1
? 修改數(shù)據(jù)庫編碼:ALTER DATABASE mydb1 CHARACTER SET uft8(一個(gè)漢字3個(gè)字節(jié))
2.數(shù)據(jù)類型(列類型)
int:整形
double:浮點(diǎn)型源梭,例如double(5,2)表示最多5位,其中必須有2位小數(shù),及最大值為999.99怜姿;
decimal:浮點(diǎn)型,在表單錢方面使用,因?yàn)椴粫霈F(xiàn)精度缺失問題(十進(jìn)制運(yùn)算):
char:固定長度字符串類型:char(255)熟空,數(shù)據(jù)長度不足指定長度,補(bǔ)足到指定長度
varchar:可變長度字符串類型:varchar(65535),zhangSan
text(clob):字符串類型;
>很小 tinytext 2^8-1
>小? ? text 2^16-1
>中? ? mediumtext 2^24-1
>大? ? longtext 232-1
blob:字節(jié)類型:
>很小 tinyblob 2^8-1(256B)
>小? ? blob 2^16-1(64k)
>中? ? mediumblob 2^24-1 (16M)
>大? ? longblob 2^32-1 (4G)
data:日期類型挨摸,格式為:yyyy-MM-dd;
time:時(shí)間類型,格式為:hh:mm:ss
timestamp:時(shí)間戳類型熔掺;
3.表
? 創(chuàng)建表;
CREATE TABLE [IF NOT EXISTS] 表名(
列名 列類型鬓催,
列名 列類型压怠,
····
列名 列類型
);
?查看當(dāng)前數(shù)據(jù)庫中所有表名稱:SHOW TABLES;
? 查看指定表的創(chuàng)建語句:SHOW CRERTE TABLE 表名(了解);
?查看表結(jié)構(gòu):DESC 表名;
? 刪除表:DROP TABLE 表名;
? 修改表:前綴:ALTER TABLE 表名
>修改之添加列:
ALTER TABLE 表名 ADD (
列名 列類型,
列名 列類型,
····
);
>修改之修改列類型(如果被修改的列已存在數(shù)據(jù)雨让,那么新的類型可能會影響到已存在的數(shù)據(jù)):? ? ALTER TABLE 表名 MODIFY 列名 列類型;
>修改之修改列名:ALTER TABLE 表名 CHANGE 原列名 新列名 列類型;
>修改之刪除列:ALTER TABLE 表名 DROP 列名;
>修改表名稱:ALTER TABLE 原表名 RENAME TO 新表名;
五.DML(數(shù)據(jù)操作語言)之INSERT
DQL:SELECT * FROM 表名
DML(數(shù)據(jù)操作語言捐川,它是對表記錄的操作(增、刪岩齿、改)
1.插入數(shù)據(jù)
? INSERT INTO 表名 (列名1,列名2,·····) VALUES(列值1,列值2····);
>在表名后給出要插入的列名太颤,其他沒有指定的列等同于插入null值,所以 插入記錄總是插入一行盹沈,不可能是半行龄章。
//插入所有列
//插入部分列,沒有插入的列,為默認(rèn)值null
>在VALUES后給出的列值襟诸,值的順序和個(gè)數(shù)必須與前面指定的列對應(yīng)
? INSERT INTO 表名 VALUES(列值1,列值2····);
>沒有給出要插入的列,那么表示插入所有列。
>值的個(gè)數(shù)必須是該列的個(gè)數(shù)滤港。
>值的順序暮胧,必須與表創(chuàng)建時(shí)給出的列的順序相同俺亮。
六.DML(數(shù)據(jù)操作語言)之修改記錄
2.修改數(shù)據(jù)
? UPDATE 表名 SET 列名1=列值1, 列名2=列值2, ····· [WHERE 條件]
? 條件(條件可選的):
>條件必須是一個(gè)boolean類型的值或表達(dá)式:UPDATE t_person SET gender='男', age=age+1 WHERE sid='1';
>運(yùn)算符:=撞芍、!=璃氢、<>动看、>、<蹄殃、>=式廷、<=妻导、BETWEEN....AND、IN(...)乙濒、IS NULL允睹、NOT甘萧、OR钝鸽、AND
修改全部
修改區(qū)間內(nèi)(between·····and·····)
修改滿足兩個(gè)條件 in('a','b')
set 后的=為賦值遏暴,如age=null,where中為age is null
七.DML(數(shù)據(jù)操作語言)之DELETE
3.刪除數(shù)據(jù)
? DELETE FROM 表名 [WHERE 條件];
? TRUNCATE TABLE 表名:TRUNCATE是DDL語句治拿,它是先刪除DROP該表摩泪,再CREATE該表,且無法回滾劫谅。
在數(shù)據(jù)庫中所有的字符串類型见坑,必須使用單引號,不能使用雙引號
日期類型也要使用單引號
八.DCL(數(shù)據(jù)控制語言)
1.創(chuàng)建用戶
? CREATE USER 用戶名@'IP地址' IDENTIFIED BY ‘密碼’;
>用戶只能在指定的ip上登錄
? CREATE USER 用戶名@'%' IDENTIFIED BY ‘密碼’;
>用戶可以在任意IP地址上登錄
2.給用戶授權(quán)
? GRANT 權(quán)限1捏检,權(quán)限2荞驴,····,權(quán)限n ON 數(shù)據(jù)庫.* TO 用戶名@'IP地址'
>權(quán)限贯城、用戶熊楼、數(shù)據(jù)庫
>給用戶分派在指定的數(shù)據(jù)庫上的指定權(quán)限
>例如:GRANT CREATE,ALTER,DROP,INSERT,UPDATE,DELETE,SELECT ON mydb1.* TO user1@localhost;
? 給本地登錄用戶user1用戶分派在mydb1數(shù)據(jù)庫上的create,alter,drop,insert,update,delete,select權(quán)限
? GRANT ALL ON 數(shù)據(jù)庫.* TO 用戶名@IP地址;
>給用戶分派指定數(shù)據(jù)庫上的所有權(quán)限
3.撤銷授權(quán)
? REVOKE 權(quán)限1,····能犯,權(quán)限n ON 數(shù)據(jù)庫.* FROM 用戶名@IP地址;
>撤銷指定用戶在指定數(shù)據(jù)庫上的指定權(quán)限3
>例如:REVOKE CREATE,ALTER,DROP ON mydb1.* FROM user1@localhost;
? 撤銷user1用戶在mydb1數(shù)據(jù)庫上的create鲫骗、alter、drop權(quán)限
4.查看權(quán)限
? SHOW GRANTS FOR 用戶名@IP地址;
>查看指定用戶的權(quán)限
5.刪除用戶
? DROP USER 用戶名@IP地址
九.DQL(數(shù)據(jù)查詢語音)之基礎(chǔ)查詢之列控制
一悲雳、基本查詢
1.字段(列)控制
1)查詢所有列
SELECT * FROM 表名;
SELECT * FROM emp;
>其中“*”表示查詢所有列
2)查詢指定列
SELECT 列1(,列2,····列N) FROM 表名
SELECT username,password FROM jo_user;
3)去除重復(fù)行查詢
當(dāng)查詢結(jié)果中的多行記錄一模一樣挎峦,只顯示一行,
SELECT DISTINCT * | 列1(,列2合瓢,····坦胶,列n) FROM 表名;
select distinct * from jo_user;
4)列運(yùn)算
? 數(shù)量類型的列可以做加、減、乘顿苇、除運(yùn)算
SELECT sal*1.5 FROM emp;
SELECT sal+com FROM emp;
? 字符串類型可以做連續(xù)運(yùn)算
SELECT CONCAT('$',sal)
? 轉(zhuǎn)換NULL值
有時(shí)需要把NULL轉(zhuǎn)換為其他值峭咒,例如com+1000時(shí),如果com存在NULL值纪岁,那么NULL+1000還是NULL凑队,而我們這時(shí)希望吧NULL當(dāng)前當(dāng)做0來運(yùn)算。
SELECT IFNULL(comm,0)+1000 FROM emp;
>IFNULL(comm,0),如果comm中存在NULL值幔翰,那么當(dāng)成0來運(yùn)算
? 給列起別名
當(dāng)使用列運(yùn)算后漩氨,查詢出的結(jié)果集中的列名稱很不好看,這時(shí)我們需要給列起個(gè)別名遗增,這樣在結(jié)果集中就顯示別名了
SELECT IFNULL(comm,0)+1000 AS 獎(jiǎng)金 FROM emp;
>其中AS可以省略
十.DQL(數(shù)據(jù)查詢語言)之條件查詢
2.條件控制
1)條件查詢
? SELECT * from emp WHERE sal>20000;
SELECT * from emp WHERE comm is not null;
SELECT * from emp WHERE sal between 20000 and 30000;
SELECT * from emp WHERE job in('經(jīng)理','分析師');
十一.DQL(數(shù)據(jù)庫查詢語言)之模糊查詢
2)模糊查詢
SELECT * FROM emp WHERE ename like '張';
>like只匹配一個(gè)字符
SELECT * from emp WHERE ename like '張_';
>'_'代表一個(gè)字符
SELECT * from emp WHERE ename like '張%';
>其中%匹配0~N個(gè)任意字符
SELECT * from emp WHERE ename like '%張%';
>查詢姓名中以張開頭或是姓名中有張
SELECT * from emp WHERE ename like ‘%';
>這個(gè)條件等同于不存在叫惊,但如果姓名為NULL的查詢不出來
十二.DQL(數(shù)據(jù)查詢語言)之排序
二、排序
1)升序
SELECT * FROM emp ORDER BY sal ASC;
>按sal排序做修,升序
>其中ASC是可以省略
2)降序
SELECT * FROM emp ORDER BY sal DESC;
>按comm排序霍狰,降序
>其中DESC不能省略
3)使用多列作為排序條件
SELECT * FROM WHERE emp ORDER BY sal ASC,comm DESC
十三.DQL(數(shù)據(jù)查詢語言)之聚合函數(shù)
三、聚合函數(shù)
聚合函數(shù)用來做某列的縱向運(yùn)算
1)COUNT
SELECT COUNT(*) FROM emp;
>計(jì)算emp表中所有列都不為NULL的記錄的行數(shù)
SELECT COUNT(comm) FROM emp;
>計(jì)算emp表中comm列不為NULL的記錄的行數(shù)
2)MAX
SELECT MAX(sal) FROM emp;
>查詢最高工資
3)MIN
SELECT MIN(sal) FROM emp;
>查詢最低工資
4)SUM
SELECT SUM(sal) FROM emp;
>查詢工資總和
5)AVG
SELECT AVG(sal) FROM emp;
>查詢平均工資
十四.DQL(數(shù)據(jù)庫查詢語言)之分組查詢
四饰及,分組查詢
分組查詢是把記錄使用某一列進(jìn)行分組蔗坯,然后查詢組信息。
例如:查看所有部門的記錄數(shù)燎含,分組列和聚合函數(shù)
select job 職業(yè), count(*) 人數(shù),max(sal) 最高工資 from emp group by job;
select deptno,count(*) from emp where sal>15000 group by deptno;
select deptno,count(*) from emp where sal>15000 group by deptno having count(*)>=2;
執(zhí)行順序
select
from
where
group by
having
order by
十五.DQL(數(shù)據(jù)庫查詢語言)之limit方言
五宾濒、limit子句(方言)
LIMIT用來限定查詢結(jié)果的起始行,以及總行數(shù)瘫镇。
例如:查詢起始行為第5行鼎兽,一共查詢3行記錄
SELECT * FROM emp LIMIT 4,5;
>其中4代表從第五行開始,其中5表示一共查詢5行铣除。(當(dāng)前頁-1)*每頁記錄數(shù)