1. 程式人生 > >Mysql資料庫的簡單命令

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中配置

Mysql資料庫的簡單命令
(6)將mysql安裝為系統服務(只需要執行一次) bin\mysqld install 服務名
如果服務名沒有提供,預設為MySQL

Mysql資料庫的簡單命令

如果要解除安裝服務:sc delete 服務名
Mysql資料庫的簡單命令

如果安裝服務或刪除時出現許可權不足,用管理員身份執行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資料庫的簡單命令
mysql中的utf8字元不夠完整,utf8mb4是完整版本的

刪除資料庫

drop database 資料庫名;

Mysql資料庫的簡單命令
檢視建庫資訊

show create database 資料庫名;

Mysql資料庫的簡單命令
(2)要修改全域性的設定,在mysql解壓目錄新增 my.ini 配置檔案,在其中輸入(推薦)

[mysqld]
character-set-server=utf8mb4

Mysql資料庫的簡單命令
停止舊服務,刪除舊服務,安裝新服務,啟動新服務

net stop mysql
sc delete mysql
mysqld install
net start mysql

三、MySQL資料庫操作命令

1、建表(table)

一個庫中有多張表,每張表裡有多條資料
表分成行(row 橫向)與列(column 縱向)

學號 姓名 性別
1 張三 男
2 李四 女
...

  1. 選庫
    use 庫名;
    Mysql資料庫的簡單命令
  2. 建表
    create table 表名(
    列1名 型別,
    列2名 型別,
    ...
    );
    create table student(
    id int,
    name varchar(10),
    sex char(1)
    );

    Mysql資料庫的簡單命令
    整數型別: 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

  1. 插入資料
    insert into 表名(列1, 列2, ... 列n) values (值1, 值2, ... 值n);

    注意:值個數要與列個數一致

    insert into student(id,name,sex) values(1, '張三', '男');

    Mysql資料庫的簡單命令

  2. 查詢資料
    語法:
    select 列1, 列2, ... from 表名;
    select id, name, sex from student;

    Mysql資料庫的簡單命令

  3. 檢視所有庫

    show databases;

    Mysql資料庫的簡單命令

  4. 檢視所有表
    show tables;

Mysql資料庫的簡單命令

  1. 唯一主鍵
    每張表只能有一個主鍵
    主鍵的值必須是唯一,且非空的
    create table 表名(
    列1名 型別 primary key,
    列2名 型別,
    ...
    );

    刪表語法:drop table 表名;
    Mysql資料庫的簡單命令

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資料庫的簡單命令
一次插入多條記錄(mysql獨有)
insert into student(name,sex) values('李四', '男'),('王五', '男'),('趙柳', '男');
Mysql資料庫的簡單命令

  1. 查詢所有列
    select from student;
    mysql會把
    翻譯成:id,name,sex
    Mysql資料庫的簡單命令

  2. 刪除記錄(只刪除資料,不刪表)
    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;

Mysql資料庫的簡單命令

修改列
語法:alter table 表名 modify 列名 新型別;
例如要修改列的長度定義原來varchar(10)

alter table student modify name varchar(20);

Mysql資料庫的簡單命令

刪除列
語法:alter table 表名 drop 列名;
Mysql資料庫的簡單命令
重新命名列
語法: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;

Mysql資料庫的簡單命令
如果兩張表結構不一樣,可以在select後加具體的列名,以便和新表的列相匹配
例如:

create table student3(
    id int primary key,
    name varchar(20)
);
insert into student3 select id,name from student;

Mysql資料庫的簡單命令

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=

Mysql資料庫的簡單命令

其中secure-file-priv預設是null值,表示不允許載入檔案
可以改為具體目錄名,表示只能從這個目錄載入檔案
如果改為"",表示可以從任意目錄載入檔案

例如:載入之前heroes.txt,把資料存入hero:

load data infile 'e:\\heroes.txt' into table hero;

Mysql資料庫的簡單命令

Mysql資料庫的簡單命令
如果檔案中的列分隔符是, 不是預設\t 鍵,需要用 fields TERMINATED BY來指定分隔符

load data infile 'e:\\person.txt' into table person fields TERMINATED BY ',';

source

source 檔案路徑/檔名
  • 其檔案內容必須是合法的sql語句
  • 與load的區別:不用引號,建議使用/分隔路徑,檔案編碼與作業系統編碼一致(gbk)

Mysql資料庫的簡單命令

update 更新

語法:

update 表名 set 列名=新值 where 條件;
update person set sex='男';             // 把所有記錄性別都改為男
update person set sex='男' where id=1;  // 只修改id=1的性別為男

Mysql資料庫的簡單命令

delete 刪除

語法:

delete from 表名; // 刪除表中所有記錄(危險操作)
delete from 表名 where 條件; // 刪除滿足條件的記錄

Mysql資料庫的簡單命令

select 查詢

語法:

select 列名... from 表 where 條件 group by 分組條件 having 分組篩選條件 order by 排序條件 limit;

條件 where

= 等值匹配
!= 不等值匹配
> 大於
< 小於
>= 大於等於
<= 小於等於

邏輯運算子組合多個條件
邏輯與(兩個條件同時成立) and 例如:

select * from hero where sex='女' and loc='建業'; 

Mysql資料庫的簡單命令
邏輯或(兩個條件有一個成立,結果就是真) 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;

Mysql資料庫的簡單命令
Mysql資料庫的簡單命令

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;

Mysql資料庫的簡單命令

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;

多列分組時,列的順序不影響結果
Mysql資料庫的簡單命令

多表結構和連線查詢

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;

Mysql資料庫的簡單命令
表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;

Mysql資料庫的簡單命令
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資料庫的簡單命令

  • 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() 獲取當前時間

Mysql資料庫的簡單命令
Mysql資料庫的簡單命令
Encryption Functions 加密
Information Functions
Logical operators 邏輯運算子
Miscellaneous Functions 剩餘的函式
Numeric Functions 數學函式

    rand() 生成一個從[0.0 ~ 1.0) 之間的隨機小數, 小於1.0
    floor() 捨去小數
    round() 四捨五入

Mysql資料庫的簡單命令
Mysql資料庫的簡單命令
String Functions 字串函式

    left(字串, n)  n代表從左邊要擷取的字元
    lower()
    upper()
    substr(字串,下標, 長度) 下標從1開始
    求字串長度的例子:select * from hero where char_length(name)=4;

注意:length只能用來求字串的長度 ,不能用來求漢字的長度.

Mysql資料庫的簡單命令

匯出資料

  1. cmd > mysqldump -uroot -p 庫名 >> 要儲存的檔案.sql (source的逆操作, 內部是sql語句)
    Mysql資料庫的簡單命令
  2. 把表中的資料儲存到文字檔案中 (load data infile的逆操作)
    select * from 表 into outfile '檔案路徑\檔名'
    Mysql資料庫的簡單命令