Mysql資料庫的簡單命令
引言:現在的社會處於一個數字化時代,很多事物都可以轉化為數字形式儲存起來,所以資料無處不在,手機聯絡人,微信訊息,銀行卡賬號,人口資訊,圖書資訊,消費記錄等等.所以我們要用到資料庫去管理這些資訊.
一、資料管理的幾個階段
1、人工管理階段
特點:
資料不能長期儲存
資料不能共享
資料不具有獨立性
程式本身管理資料
2、檔案系統階段
特點: 資料可長期儲存 資料由檔案系統管理 資料冗餘大、共享性差 資料獨立性差
3、資料庫系統階段
特點:
資料實現結構化
資料實現了共享性
資料獨立性強
資料粒度變小
二、資料庫
1、資料庫系統涉及的幾個概念
DB:Database(資料庫)
DBMS:Database Management System資料庫管理系統
DBS:資料庫系統
計算機硬體、軟體
DB
DBMS
DBA(資料庫管理員)
2、常見的資料庫管理系統
* Oracle 甲骨文
* MySQL 甲骨文
* Sql Server 微軟 (主要用在windows環境)
* DB2 IBM公司
* SQLlite 用在移動端開發
一般使用MySQL
3、MySQL
為什麼選擇MYSQL?
(1)開源 (2)免費 (3)跨平臺 (4)效能較好 (5)使用者多,在很多軟體公司中使用
4、MySQL資料的安裝
(1)獲取MYSQL安裝程式
http://www.mysql.com/downloads/
MySQL Community Edition
(2)兩種安裝包
Msi包(安裝版)
解壓縮版
(3)解壓縮版安裝與解除安裝(初學者最好使用解壓縮版)
解壓後 bin/mysql.exe 客戶端程式 bin/mysqld.exe 伺服器端程式 bin/mysqldump.exe 資料備份程式 初始化(只需要執行一次) bin/mysqld --initialize --console 初始化結束會生成data的資料夾,其中儲存系統和使用者的資料 注意記錄臨時密碼 w8ef!u*y5nZg 啟動資料庫服務 bin/mysqld --console 埠用的是3306 可以使用Ctrl+C 停止服務程式,或者直接關閉視窗
(4)使用客戶端連線(首先開啟服務端)
使用客戶端連線 bin/mysql -u 使用者名稱 -p
初始化時mysql有一個 root (資料庫管理員使用者)
bin\mysql -uroot -p
正確登入後會出現 mysql> 提示符,要退出用quit命令
修改密碼(只需要執行一次)
alter user 'root'@'localhost' identified by 'root';
(5)配置mysql的bin目錄至環境變數(只需要執行一次),在path中配置
(6)將mysql安裝為系統服務(只需要執行一次) bin\mysqld install 服務名
如果服務名沒有提供,預設為MySQL
如果要解除安裝服務:sc delete 服務名
如果安裝服務或刪除時出現許可權不足,用管理員身份執行cmd(黑視窗)
5、MYSQL的目錄結構
Bin:mysql應用程式目錄
Data:一般為資料目錄
Docs:文件
Include:標頭檔案
Lib:庫檔案
Mysql-test:測試目錄
Share:存放字符集及不同語言資訊
Sql-bench:壓力測試工具
Mydefault.ini :mysql配置檔案
6、資料庫基本概念
資料庫:一個數據庫管理系統(DBMS)可以管理多個數據庫
資料表:一個數據庫中有多個數據表
資料行:一個數據表中有多個數據行
資料列(欄位):一行資料有多個列
檢視:虛擬表
索引:用於加快對錶資料的訪問
主鍵:主鍵欄位不允許為空並且唯一標識表中的一行
外來鍵:用於指定兩個表之間的關係
事務:更新資料的一個程式單元
7、建庫
設定預設的字元編碼
一種是在建庫語句上帶上字元編碼
另一種是在啟動服務時新增配置檔案
(1)建庫SQL語句(在mysql提示符下執行)
create database 資料庫名 character set utf8mb4;
mysql中的utf8字元不夠完整,utf8mb4是完整版本的
刪除資料庫
drop database 資料庫名;
檢視建庫資訊
show create database 資料庫名;
(2)要修改全域性的設定,在mysql解壓目錄新增 my.ini 配置檔案,在其中輸入(推薦)
[mysqld]
character-set-server=utf8mb4
停止舊服務,刪除舊服務,安裝新服務,啟動新服務
net stop mysql
sc delete mysql
mysqld install
net start mysql
三、MySQL資料庫操作命令
1、建表(table)
一個庫中有多張表,每張表裡有多條資料
表分成行(row 橫向)與列(column 縱向)
學號 姓名 性別
1 張三 男
2 李四 女
...
- 選庫
use 庫名; - 建表
create table 表名( 列1名 型別, 列2名 型別, ... );
create table student( id int, name varchar(10), sex char(1) );
整數型別: tinyint(1個位元組), smallint(2個位元組), int(4個位元組), bigint(8個位元組)
無符號數字 tinyint unsigned (0~255)
浮點型別: float, double
定點小數: decimal(總位數, 小數位數)
decimal(10, 2) 小數部分兩位,整數部分最大8位
字元型別
char(長度) char(10) 表示最多存10個字元, 定長,效率高
varchar(長度) varchar(10) 表示最多儲存10個字元,變長
"abc" "abc " 儲存時,長度不足,用空格補齊
"abc" "abc" 儲存時,根據實際長度儲存,可以節省空間
日期型別
datetime
timestamp
- 插入資料
insert into 表名(列1, 列2, ... 列n) values (值1, 值2, ... 值n);
注意:值個數要與列個數一致
insert into student(id,name,sex) values(1, '張三', '男');
- 查詢資料
語法:select 列1, 列2, ... from 表名;
select id, name, sex from student;
-
檢視所有庫
show databases;
- 檢視所有表
show tables;
- 唯一主鍵
每張表只能有一個主鍵
主鍵的值必須是唯一,且非空的create table 表名( 列1名 型別 primary key, 列2名 型別, ... );
刪表語法:drop table 表名;
create table student(
id int primary key,
name varchar(10),
sex char(1)
);
insert into student(id,name,sex) values(null, '李四', '男');
自增列,用來解決主鍵衝突問題
在主鍵列後加入:auto_increment
1 2 3 4 ....
因為id列由資料庫維護,所以有了自增列後就不需要給id列賦值了
create table student(
id int primary key auto_increment,
name varchar(10),
sex char(1)
);
一次插入多條記錄(mysql獨有)
insert into student(name,sex) values('李四', '男'),('王五', '男'),('趙柳', '男');
-
查詢所有列
select from student;
mysql會把翻譯成:id,name,sex - 刪除記錄(只刪除資料,不刪表)
delete from 表 where 條件;
刪除表(連表和資料一塊刪除)
drop table 表;
只刪除id=1004的記錄
delete from student where id=6;
create table a ( birthday datetime );
insert into a (birthday) values ('1988-5-4');
insert into a (birthday) values ('1988-5-4 16:39:00');
設定自增列從1001開始的兩種方法
1.建立表的時候
create table b (
id int primary key auto_increment,
name varchar(20)
) auto_increment=1001;
2.修改表
create table b (
id int primary key auto_increment,
name varchar(20)
);
alter table b auto_increment=1001;
2、資料庫語法
SQL語句
1. DDL 資料定義語言
create database 資料庫名;
create table 表名(列定義); (重點)
drop database 資料庫名;
drop table 表名;
alter table 表 ... (新增列, 修改列, 刪除列, 重新命名列8.0才有)
alter user 使用者
create -- 建立xx定義, drop -- 刪除xx定義, alter -- 修改xx定義
新增列
語法:alter table 表名 add 列名 資料型別;
例如:給student新增一個age列
alter table student add age tinyint unsigned;
修改列
語法:alter table 表名 modify 列名 新型別;
例如要修改列的長度定義原來varchar(10)
alter table student modify name varchar(20);
刪除列
語法:alter table 表名 drop 列名;
重新命名列
語法:alter table 表名 rename column 舊列名 to 新列名;(mysql8.0才有)
2. DML (資料操控語言) (重點)
insert
語法1:
insert into 表名(列...) values(值...); 插入一行
語法2:
insert into 表名(列...) values(值...), (值...), (值...), (值...); 插入多行
create table student2(
id int primary key,
name varchar(20),
sex char(1)
);
語法3:從表1查詢,把查詢結果插入表2
insert into 表2 select * from 表1;
如果兩張表結構不一樣,可以在select後加具體的列名,以便和新表的列相匹配
例如:
create table student3(
id int primary key,
name varchar(20)
);
insert into student3 select id,name from student;
load data
可以把外部文字檔案的內容匯入到資料庫表中
語法:load data infile '檔案路徑\檔名字' into table 表名;
create table hero(
id int primary key,
name varchar(10),
loc varchar(10),
sex char(1),
birth int,
death int,
power int
);
要讓load data命令生效,必須修改設定:
[mysqld]
character-set-server=utf8mb4
secure-file-priv=
其中secure-file-priv預設是null值,表示不允許載入檔案
可以改為具體目錄名,表示只能從這個目錄載入檔案
如果改為"",表示可以從任意目錄載入檔案
例如:載入之前heroes.txt,把資料存入hero:
load data infile 'e:\\heroes.txt' into table hero;
如果檔案中的列分隔符是, 不是預設\t 鍵,需要用 fields TERMINATED BY來指定分隔符
load data infile 'e:\\person.txt' into table person fields TERMINATED BY ',';
source
source 檔案路徑/檔名
- 其檔案內容必須是合法的sql語句
- 與load的區別:不用引號,建議使用/分隔路徑,檔案編碼與作業系統編碼一致(gbk)
update 更新
語法:
update 表名 set 列名=新值 where 條件;
update person set sex='男'; // 把所有記錄性別都改為男
update person set sex='男' where id=1; // 只修改id=1的性別為男
delete 刪除
語法:
delete from 表名; // 刪除表中所有記錄(危險操作)
delete from 表名 where 條件; // 刪除滿足條件的記錄
select 查詢
語法:
select 列名... from 表 where 條件 group by 分組條件 having 分組篩選條件 order by 排序條件 limit;
條件 where
= 等值匹配
!= 不等值匹配
> 大於
< 小於
>= 大於等於
<= 小於等於
邏輯運算子組合多個條件
邏輯與(兩個條件同時成立) and 例如:
select * from hero where sex='女' and loc='建業';
邏輯或(兩個條件有一個成立,結果就是真) or
select * from hero where name='小喬' or id=200;
邏輯非 (條件取反) not
列 between 值1 and 值2 等價於 列 >= 值1 and 列 <= 值2, 注意小值要在前面,包含邊界的值
列 in (值1,值2,... 值n) 等價於 列=值1 or 列=值2 ... or 列=值n 注意值列表的長度
like 模糊查詢 其中匹配萬用字元 % 表示匹配0~多個任意字元
萬用字元 _ 表示匹配1個任意字元
例如:
select * from hero where power between 85 and 90;
select * from hero where power >= 85 and power <=90;
not in
not like
not between ... and
排序條件
排序條件:列名 升降序 如果升降序關鍵字省略,預設是asc
升序-> 由小到大 asc
降序-> 由大到小 desc
select * from hero order by power desc limit 10;
多列排序: 排序條件1, 排序條件2 ...
先按照條件1排序,條件1中取值相同的,再按照條件2排序
限制返回結果個數
limit m; // 最多返回m個結果
limit n,m; // 最多返回m個結果,n代表起始下標,下標從0開始
經常用來實現分頁應用,假設每頁10條
第一頁 limit 0,10;
第二頁 limit 10,10;
第三頁 limit 20,10;
分組條件
select count(*),max(sal),min(sal),sum(sal),avg(sal),deptno from emp group by deptno;
count(*) 表示求每組的個數
max(列) 求最大值
min(列) 求最小值
sum(列) 求和
avg(列) 求平均值
分組之後,
- select子句中只能出現分組條件列和組函式,其他列不能出現在select中,
- order by 子句中只能出現分組條件列和組函式,其他列不能出現在order by中,
例如:
select deptno,max(sal),ename from emp group by deptno; // ename不符合剛才的規定
select deptno,max(sal) from emp order by ename; // 錯誤的
having 也是過濾
where > group by > having > select > order by > limit // sql語句的執行順序
select count(*), deptno from emp where count(*) >=5 group by deptno; // 因為where先執行,這時候還沒有分組,不知道個數,錯誤
select count(*), deptno from emp group by deptno having count(*)>=5;
有時候篩選條件既可以寫在where 上,也可以寫在having (優先採用where)
select count(*), deptno from emp where deptno=10 or deptno=30 group by deptno;
select count(*), deptno from emp group by deptno having deptno=10 or deptno=30;
多列分組 (瞭解)
多個列取值都相同的分為一組
group by 列1,列2 ...
select count(*),deptno,job from emp group by job,deptno;
多列分組時,列的順序不影響結果
多表結構和連線查詢
select ... from 表1 inner join 表2 on 連線條件
where group by having order by limit;
select empno,ename,sal,emp.deptno,dept.deptno,dname,loc from emp inner join dept on emp.deptno = dept.deptno;
表1 表1別名
select empno,ename,sal,e.deptno,d.deptno,dname,loc
from emp e inner join dept d on e.deptno = d.deptno;
+-------+--------+---------+--------+ +--------+------------+----------+
| empno | ename | sal | deptno | | deptno | dname | loc |
+-------+--------+---------+--------+ +--------+------------+----------+
| 7369 | SMITH | 800.00 | 20 | | 20 | RESEARCH | DALLAS |
| 7499 | ALLEN | 1600.00 | 30 | | 30 | SALES | CHICAGO |
| 7521 | WARD | 1250.00 | 30 | | 30 | SALES | CHICAGO |
| 7566 | JONES | 2975.00 | 20 | | 20 | RESEARCH | DALLAS |
| 7654 | MARTIN | 1250.00 | 30 | | 30 | SALES | CHICAGO |
| 7698 | BLAKE | 2850.00 | 30 | | 30 | SALES | CHICAGO |
| 7782 | CLARK | 2450.00 | 10 | | 10 | ACCOUNTING | NEW YORK |
| 7788 | SCOTT | 3000.00 | 20 | | 20 | RESEARCH | DALLAS |
| 7839 | KING | 5000.00 | 10 | | 10 | ACCOUNTING | NEW YORK |
| 7844 | TURNER | 1500.00 | 30 | | 30 | SALES | CHICAGO |
| 7876 | ADAMS | 1100.00 | 20 | | 20 | RESEARCH | DALLAS |
| 7900 | JAMES | 950.00 | 30 | | 30 | SALES | CHICAGO |
| 7902 | FORD | 3000.00 | 20 | | 20 | RESEARCH | DALLAS |
| 7934 | MILLER | 1300.00 | 10 | | 10 | ACCOUNTING | NEW YORK |
+-------+--------+---------+--------+
+--------+------------+----------+
| deptno | dname | loc |
+--------+------------+----------+
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
+--------+------------+----------+
幾種連線查詢
表1 inner join 表2 on 連線條件 (內連線:兩張表的記錄必須完全滿足連線條件,才會出現在最後結果中)
表1 left outer join 表2 on 連線條件 (左外連線)
表1 right outer join 表2 on 連線條件 (右外連線)
select empno, ename, e.deptno, d.deptno, d.dname, d.loc
from emp e left outer join dept d on d.deptno=e.deptno;
left outer join 位於連線左側的表,不管是否連線到了記錄,都會出現在結果中
符合連線條件的記錄,和內連線效果一樣
不符合連線條件的記錄,對應另一張表的列都是null值
right outer join 位於連線右側的表,不管是否連線到了記錄,都會出現在結果中
outer可以省略
連線查詢的等價寫法
- 內連線的等價寫法 (重要)
select ... from 表1,表2 where 連線條件;
select e.empno,e.ename,e.deptno,d.deptno,d.dname from emp e, dept d where e.deptno=d.deptno;
- mysql 獨有的 (瞭解)
select ... from 表1 inner|left join 表2 using(deptno); // 兩張表的連線列名要相同
select e.empno,e.ename,e.deptno,d.deptno,d.dname from emp e inner join dept d using(deptno);
常用函式
select count(*) from emp; // 求整張表的行數
select max(sal) from emp; // 求整張表的工資最大值
Bit Functions 位運算函式
Comparison operators 比較運算子
Control flow functions 流程控制
Date and Time Functions 日期函式
year() 擷取年份
month()
date()
date_add(日期 時間間隔); 其中時間間隔的語法:interval n 單位
select empno,ename,date_add(hiredate, interval 1 month ),hiredate from emp; 加一個月
select empno,ename,date_add(hiredate, interval 3 day ),hiredate from emp; 加3天
SELECT EXTRACT(DAY_MINUTE FROM '2009-07-02 13:02:03'); 提取日期中的從天到分鐘的部分
select now() 獲取當前時間
Encryption Functions 加密
Information Functions
Logical operators 邏輯運算子
Miscellaneous Functions 剩餘的函式
Numeric Functions 數學函式
rand() 生成一個從[0.0 ~ 1.0) 之間的隨機小數, 小於1.0
floor() 捨去小數
round() 四捨五入
String Functions 字串函式
left(字串, n) n代表從左邊要擷取的字元
lower()
upper()
substr(字串,下標, 長度) 下標從1開始
求字串長度的例子:select * from hero where char_length(name)=4;
注意:length只能用來求字串的長度 ,不能用來求漢字的長度.
匯出資料
- cmd > mysqldump -uroot -p 庫名 >> 要儲存的檔案.sql (source的逆操作, 內部是sql語句)
- 把表中的資料儲存到文字檔案中 (load data infile的逆操作)
select * from 表 into outfile '檔案路徑\檔名'