1. 程式人生 > >MySQL操作命令大全使用(一)

MySQL操作命令大全使用(一)

資料庫操作命令

1,連線資料庫
mysql -u root -p
Enter password: ****
或者mysql -uroot –proot
-u 使用者名稱 –p 密碼

視覺化連線工具 navicat  
2,退出MySQL
exit; 
或
quit;
3,建立資料庫
create database  box; #以分號結束  英文狀態下
Query OK, 1 row affected (0.01 sec)  說明成功
4,檢視資料庫
show databases; 
5,選中資料庫
use box;
5,檢視資料庫中所有的表
show tables;
6,刪除資料庫
drop database box;

資料表的操作

1, 建立表
mysql> create table user(userid int(11),username varchar(32),password char(32));
				   表名 欄位名  型別(長度) 多個欄位之間,隔開  英文狀態下   別忘了;
				   
檢視建立表的過程 
mysql> show create table user\G;         以最佳閱讀體驗閱讀 
*************************** 1. row ***************************
       Table: user
Create Table: CREATE TABLE `user` (
  `userid` int(11) DEFAULT NULL,
  `username` varchar(32) DEFAULT NULL,
  `password` char(32) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
2, 查看錶
mysql> desc user;  查看錶結構 
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| userid   | int(11)     | YES  |     | NULL    |       |
| username | varchar(32) | YES  |     | NULL    |       |
| password | char(32)    | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+

null 表示 是否為空
key  是否為主鍵   
default 預設值
extra 備註資訊 

制定表的引擎和字符集

  • ENGINE=InnoDB 引擎 inndb myisam
  • CHARSET=utf8字符集 utf8 gb2312

3, 修改表名

alter table user  rename users;
		    原來的表名    新表名

4, 刪除表

drop table user;

資料欄位的操作

修改欄位型別

alter table 表名 modify 欄位名 型別(長度);
mysql> alter table user modify username char(32);

增加表字段

alter table 表名 add column 欄位 型別(長度);
mysql> alter table user add column password char(64);

增加表字段的時候控制順序

alter table user add 欄位名 型別(長度)after 制定欄位;

mysql> alter table user add sex tinyint after username; 

刪除表字段

alter table user drop column 欄位名字;
mysql> alter table user drop column sex;

表字段改名字

alter table 表名 change 原欄位名 新欄位名 型別(長度);
mysql> alter table user change userid id int(11);

modify修改欄位的排列順序

alter table 表名 modify 欄位名 型別(長度) first;
mysql> alter table user modify username char(32) first;

資料欄位的型別 字符集 引擎 索引

型別

  • 數值型別 (整型浮點型)
  • 字串型別
  • 日期
  • 複合型別
  • 空間型別

整型

型別 位元組數 範圍
tinyint 1 -128~127
smallint 2 -32768-32767
int 4
bigint 8

性別和年齡 我們一般都是用無符號的整型 一般長度 以最大值為準

浮點型

型別 位元組 範圍
float(m,d) 4 單精度m總個數 d小數位
double(m,d) 8 雙精度 m總個數 d小數位

字元型別

型別 位元組 範圍
varchar 0-255 變長字串
char 0-255 定長
text 0-65535 長文字
tinytext 0-255 短文字字串
blob 0-65535 二進位制型別的長文字資料
tinyblob 0-255 不超過255的短文字資料
text 不區分大小寫
blob區分大小寫
影象 聲音檔案 可以用blob型別來存
longtext 極長文字資料

時間型別

型別 位元組 範圍
date 3 2018-7-24
time 3 10:55:43
datetime 8 2018-7-24-10:55:43
timestamp 4 自動儲存修改時間 不用人工操作
year 1 年份
create table if not exists user(
	id int(11) not null,
	username varchar(50) not null,
	password char(32) not null,
	content longtext not null,
	age int(11) unsinged not null,
	createtime datetime not null,
	sex tinyint(4) not null

)engine=myisam default charset=utf8;

unsigned 主要用於整型和浮點型別 前面沒有 -號

zerofill 不是空格 0填充 防止存賦值

not null 表示不能為空

字符集 瞭解

  • utf8 Unicode(所有文字和符合的編碼方案 )可變長度的字元編碼 1-6個位元組 比ASCII多一倍的空間
  • gbk 中國定義的編碼規範 最早叫做 gb2312

工作中常用的

  • gbk_chinese_ci 簡體中文
  • utf8_general_ci

引擎

  • myisam 讀取效率比較高 如果設計一張表 讀寫入 比較多 選擇myisam 引擎 表鎖 鎖住整張表
  • innodb 支援事務 如果你 改的多 刪的多 安全性要求高 選擇innodb 行鎖 鎖住這一行

索引

mysql 2000條是一個界限 2000條以下 可以不用新增索引

索引型別
型別 說明
普通索引 最基本的索引沒有任何限制
唯一索引 要求這一列不能有重複值
主鍵索引 特殊的唯一索引 不允許有控制一般建立表的同時也建立主鍵索引 比如id 自增
全文索引 全域性搜尋的資料
普通索引
alter table 表名 add index(欄位名); 新增索引
show index from users\G;

mysql> alter table users drop index username; 刪除索引
唯一索引
mysql> alter table users add unique(欄位名 );
全文索引
mysql> alter table users add fulltext(欄位名 );
主鍵索引
mysql> alter table users add primary key(欄位名 );
建立表的時候可以直接新增索引
mysql> create table if not exists test(
	id int(11) not null,
	username varchar(64) not null,
	password char not null,
	content longtext not null,
	primary key(id),
	index pw(password),
	unique(username),
	fulltext(content))engine=innodb default charset=utf8;
Query OK, 0 rows affected (0.26 sec)

增刪改查

增 插入資料

1.insert into 表名 values(值1,值2,值3); 
  有多少欄位 後面的值必須寫多少
2.insert inot 表名(欄位1,欄位2,欄位3) values(值1,值2,值3);
有些欄位可能有預設值 我們可以不用寫

mysql> insert into users values(1,"haha","adfdsfadsf12"),(2,"xixi","afdsf123321");
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> insert into users(id,username,password) values(3,"hehe","12333adf123");
Query OK, 1 row affected (0.00 sec)

mysql> insert into users(username,password) values("hehe","12333adf123");
Query OK, 1 row affected (0.00 sec) 

	 insert into users(username,password) values("hehe","12333adf123"),("kangbazi","asf13"),("zhengzhou","34sdcxc"),("xiaogege","dfadf12");  一次性插入多條記錄  values 後面 ,號隔開  

查詢記錄

mysql> create table money(
	id int(11) not null auto_increment,
	username varchar(64) not null,
	balance float not null,  #餘額
	province varchar(20) not null, #省份 
	age tinyint unsigned not null,
	sex tinyint not null,
	primary key(id))engine=innodb default charset=utf8;




查詢

select * from 表名;
* 表示展示所有的欄位的資訊 

select 欄位1,欄位2 from 表名  
只查詢所有資訊中欄位1 欄位2的資訊  

查詢單個欄位 不重複的記錄 distinct

mysql> select distinct balance from money;
mysql> select distinct 欄位 from 表名;

條件 where

mysql> select * from money where age=30;
符號 說明
> 大於
< 小於
= 等於
>= 大於等於
<= 小於等於
!= 不等於
or 或者
and 並且
SELECT * from money where age>30 and province="henan";
+----+--------------+---------+----------+-----+-----+
| id | username     | balance | province | age | sex |
+----+--------------+---------+----------+-----+-----+
|  4 | wangbaoqiang |    1234 | henan    |  35 |   0 |
+----+--------------+---------+----------+-----+-----+
SELECT * from money where age>30 or province="henan";

3	yueyunpeng	1234	henan	30	0
4	wangbaoqiang	1234	henan	35	0
5	郭德綱	1234320	天津	50	0
6	李冰冰	5643	山東	40	1
8	習大大	1228280	山西	50	0
9	諸葛亮	1234	河南	90	0
10	毛潤之	234234	湖南	90	0
11	李清照	234555	山東	90	0

對輸出的結果進行排序 order by 欄位 升序或者降序

mysql> select * from money where age>30 order by balance desc;
查出年齡大於30的並且按照餘額進行降序排列 

mysql> select id,balance,age,sex from money order by balance desc;
+----+---------+-----+-----+
| id | balance | age | sex |
+----+---------+-----+-----+
|  5 | 1234320 |  50 |   0 |
|  8 | 1228280 |  50 |   0 |
|  7 | 1212120 |  30 |   1 |
| 11 |  234555 |  90 |   0 |
| 10 |  234234 |  90 |   0 |
|  6 |    5643 |  40 |   1 |
|  3 |    1234 |  30 |   0 |
|  4 |    1234 |  35 |   0 |
|  9 |    1234 |  90 |   0 |
+----+---------+-----+-----+
  • asc 升序 從小到大
  • desc 降序 從大到小

多欄位進行排序

mysql> select id,balance,age,sex from money order by balance desc,age asc;
+----+---------+-----+-----+
| id | balance | age | sex |
+----+---------+-----+-----+
|  5 | 1234320 |  50 |   0 |
|  8 | 1228280 |  50 |   0 |
|  7 | 1212120 |  30 |   1 |
| 11 |  234555 |  90 |   0 |
| 10 |  234234 |  90 |   0 |
|  6 |    5643 |  40 |   1 |
|  3 |    1234 |  30 |   0 |
|  4 |    1234 |  35 |   0 |
|  9 |    1234 |  90 |   0 |
+----+---------+-----+-----+
9 rows in set (0.00 sec)


如果說餘額已經排序好了 第二個age 就不生效了 

### 對出來的結果進行限制 limit

select 欄位 from 表名 limit 數量;
mysql> select id,balance,age,sex from money order by balance desc,age asc limit 5; 只顯示前五條結果  
+----+---------+-----+-----+
| id | balance | age | sex |
+----+---------+-----+-----+
|  5 | 1234320 |  50 |   0 |
|  8 | 1228280 |  50 |   0 |
|  7 | 1212120 |  30 |   1 |
| 11 |  234555 |  90 |   0 |
| 10 |  234234 |  90 |   0 |
+----+---------+-----+-----+
5 rows in set (0.00 sec)

限制結果集 並且排序

mysql> select id,balance,age from money order by balance desc limit 5;
+----+---------+-----+
| id | balance | age |
+----+---------+-----+
|  5 | 1234320 |  50 |
|  8 | 1228280 |  50 |
|  7 | 1212120 |  30 |
| 11 |  234555 |  90 |
| 10 |  234234 |  90 |
+----+---------+-----+
5 rows in set (0.00 sec)

結果集 區間進行選擇 分頁原理

 select 欄位 from 表名 limit 偏移量,數量;
mysql> select * from money limit 0,3;  從0開始 取3條記錄
+----+--------------+---------+----------+-----+-----+
| id | username     | balance | province | age | sex |
+----+--------------+---------+----------+-----+-----+
|  3 | yueyunpeng   |    1234 | henan    |  30 |   0 |
|  4 | wangbaoqiang |    1234 | henan    |  35 |   0 |
|  5 | 閮痙綰?      | 1234320 | 澶╂觸     |  50 |   0 |
+----+--------------+---------+----------+-----+-----+

每頁顯示10條記錄  
1 limit 0 10 
2 limit 10 10 
3 limit 20 10 
以此類推   

mysql 常用函式

函式 說明
sum 求和
count 求總數
max 最大值
min 最小值
avg 平均數
mysql> select count(*) from money;
+----------+
| count(*) |
+----------+
|        9 |
+----------+

mysql> select count(*) as '使用者總數' from money;  as 給欄位取別名
+----------+
| 使用者總數        |
+----------+
|        9 |
+----------+


mysql> select avg(balance) from money;  平均金額 
+--------------------+
| avg(balance)       |
+--------------------+
| 461428.77777777775 |
+--------------------+

mysql> select sum(balance) as zonghe from money;  總金額
+---------+
| zonghe  |
+---------+
| 4152859 |
+---------+
1 row in set (0.00 sec) 

mysql> select max(balance) as zuida from money; 最大金額
+---------+
| zuida   |
+---------+
| 1234321 |
+---------+
1 row in set (0.00 sec)


mysql> select min(balance) as zuixiao from money; 最小金額 
+---------+
| zuixiao |
+---------+
|    1234 |
+---------+
1 row in set (0.00 sec)

分組 group by 相同省份的在一個組

select * from money group by province;

3	yueyunpeng	1234	henan	30	0
5	郭德綱	1234320	天津	50	0
6	李冰冰	5643	山東	40	1
8	習大大	1228280	山西	50	0
9	諸葛亮	1234	河南	90	0
10	毛潤之	234234	湖南	90	0

統計數量後 進行分組顯示 山東幾個 河南幾個

select count(province),province from money group by province;
2	henan
1	天津
3	山東
1	山西
1	河南
1	湖南

分組的基礎上 進行統計 分組的資料進行統計以後 再進行一次 總數的統計 瞭解

select * from 表名 group by 欄位with rollup;
mysql> select count(province) as result,province from money group by province with rollup;
+-----------------+----------+
| count(province) | province |
+-----------------+----------+
2	henan
1	天津
3	山東
1	山西
1	河南
1	湖南
9	null

結果集 再過濾 將上面 結果大於1的顯示出來

 select count(province) as result,province from money group by province having result>1;
 result province 
 2	henan
 3	山東

總結 查詢

select  
[欄位1 [as 別名],函式(欄位),欄位2,欄位3] 
from 表名 
where 條件 
group by 欄位
having 
order by 欄位 
limit


select 選擇的列 
from 表名
wher 查詢的條件
group by 分組屬性 having 分組過濾的條件 
order by  排序 
limit 限制結果集    

SELECT 
id,username,balance,province 
from money
where id>1 and balance>1234 
group by province 
group by  id desc
limit 3;

多表聯合查詢 重要

  • 內連線
  • 外連線
  • 子查詢
  1. 準備兩張表
 create table if not exists user(
 uid int(11) primary key auto_increment not null,
 username varchar(32) not null,
 password char(64) not null
 )engine=innodb default charset=utf8;


create table if not exists goods(
oid int(11) primary key auto_increment not null, 
uid int(11) not null,name varchar(60) not null,
buytime int(11) not null)engine=innodb default charset=utf8;

2. 內連線 第一種寫法

select 表1.欄位【as 別名】,表n.欄位 from 表1【別名】,表n where 條件

mysql> select user.username as '使用者名稱',goods.oid,goods.name as "商品名" from user,goods where user.uid=goods.uid;
+---------+-----+----------+
| 使用者名稱       | oid | 商品名        |
+---------+-----+----------+
| tengfei |   1 | mac pro  |
| xingyun |   2 | dudu     |
| jinlong |   3 | leibi    |
| jinqiao |   4 | yimiao   |
| guoguo  |   5 | sanlu    |
+---------+-----+----------+

select u.username as '使用者名稱',o.oid,o.name as "商品名" from user u,goods o where u.uid=o.uid;
+---------+-----+----------+
| 使用者名稱       | oid | 商品名        |
+---------+-----+----------+
| tengfei |   1 | mac pro  |
| xingyun |   2 | dudu     |
| jinlong |   3 | leibi    |
| jinqiao |   4 | yimiao   |
| guoguo  |   5 | sanlu    |
+---------+-----+----------+

3.內連線 第二種語法 表 1 inner join 表2 on 條件

select 表1.欄位 as 別名,表n.欄位 as 別名 from 表1 inner join 表n on 條件;

mysql> select user.username as '使用者',goods.name as "商品" from user inner join goods on user.uid=goods.uid;
+---------+----------+ 
| 使用者       | 商品        |
+---------+----------+
| tengfei | mac pro  |
| xingyun | dudu     |
| jinlong | leibi    |
| jinqiao | yimiao   |
| guoguo  | sanlu    |
+---------+----------+
5 rows in set (0.00 sec)
  1. 外連線 左連線 left join on
mysql> select * from user left join goods on user.uid=goods.uid;
+-----+------------+----------------+------+------+----------+---------+
| uid | username   | password       | oid  | uid  | name     | buytime |
+-----+------------+----------------+------+------+----------+---------+
|   6 | tengfei    | adfaf123       |    1 |    6 | mac pro  |  123456 |
|   5 | xingyun    | 611sdfdf       |    2 |    5 | dudu     |   65431 |
|   8 | jinlong    | yuyuyu666      |    3 |    8 | leibi    |  123456 |
|   9 | jinqiao    | zhao6666       |    4 |    9 | yimiao   |  123456 |
|  10 | guoguo     | xiaoxiao888    |    5 |   10 | sanlu    | 1234311 |
|   1 | jingtian   | 123qwe         | NULL | NULL | NULL     |    NULL |
|   2 | zhangjike  | 123456dfafd    | NULL | NULL | NULL     |    NULL |
|   3 | luhan      | 456ewa         | NULL | NULL | NULL     |    NULL |
|   4 | xiaotong   | 78yuiii        | NULL | NULL | NULL     |    NULL |
|   7 | liangliang | ae323afd       | NULL | NULL | NULL     |    NULL |
|  11 | zhongzhong | xiaozhaohah333 | NULL | NULL | NULL     |    NULL |
+-----+------------+----------------+------+------+----------+---------+
11 rows in set (0.00 sec)

  1. 外連線 右連線 right join on
mysql> select * from user right join goods on user.uid=goods.uid;
+------+----------+-------------+-----+-----+----------+---------+
| uid  | username | password    | oid | uid | name     | buytime |
+------+----------+-------------+-----+-----+----------+---------+
|    6 | tengfei  | adfaf123    |   1 |   6 | mac pro  |  123456 |
|    5 | xingyun  | 611sdfdf    |   2 |   5 | dudu     |   65431 |
|    8 | jinlong  | yuyuyu666   |   3 |   8 | leibi    |  123456 |
|    9 | jinqiao  | zhao6666    |   4 |   9 | yimiao   |  123456 |
|   10 | guoguo   | xiaoxiao888 |   5 |  10 | sanlu    | 1234311 |
+------+----------+-------------+-----+-----+----------+---------+
5 rows in set (0.00 sec)

左連線 以左邊的表 為準 購買產品的使用者 和沒有購買產品的使用者全部展示出來

右連線 以右邊的表為準 展示誰買了什麼東西

子查詢

mysql> select * from user where uid in(5,6,8,9,10);
+-----+----------+-------------+
| uid | username | password    |
+-----+----------+-------------+
|   5 | xingyun  | 611sdfdf    |
|   6 | tengfei  | adfaf123    |
|   8 | jinlong  | yuyuyu666   |
|   9 | jinqiao  | zhao6666    |
|  10 | guoguo   | xiaoxiao888 |
+-----+----------+-------------+
5 rows in set (0.00 sec)

mysql> select * from user where uid in(select uid from goods);
+-----+----------+-------------+
| uid | username | password    |
+-----+----------+-------------+
|   6 | tengfei  | adfaf123    |
|   5 | xingyun  | 611sdfdf    |
|   8 | jinlong  | yuyuyu666   |
|   9 | jinqiao  | zhao6666    |
|  10 | guoguo   | xiaoxiao888 |
+-----+----------+-------------+
5 rows in set (0.00 sec)

先把 in 括號內的查出來   然後 再之心外圍的查詢 

記錄聯合查詢

兩個表的資料按照一定的查詢條件查詢出來 將結果併到一起顯示

union

union all

區別 :

union 將 union all 後的結果進行了一次distinct 去掉重複結果

mysql> select uid from user union select uid from goods;
+-----+
| uid |
+-----+
|   1 |
|   2 |
|   3 |
|   4 |
|   5 |
|   6 |
|   7 |
|   8 |
|   9 |
|  10 |
|  11 |
+-----+
11 rows in set (0.00 sec)

mysql> select uid from user union all select uid from goods;
+-----+
| uid |
+-----+
|   1 |
|   2 |
|   3 |
|   4 |
|   5 |
|   6 |
|   7 |
|   8 |
|   9 |
|  10 |
|  11 |
|   6 |
|   5 |
|   8 |
|   9 |
|  10 |
+-----+
16 rows in set (0.00 sec)

2 設定編碼方式
使用apt-get安裝時,預設編碼方式如下:
±-------------------------±---------------------------+
| Variable_name | Value |
±-------------------------±---------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |

修改編碼方式:
1)vim /etc/mysql/mysql.conf.d/mysqld.cnf
在lc-messages-dir=/usr/share/mysql 語句後新增 :
character-set-server=utf8
2)vim /etc/mysql/conf.d/mysql.cnf,新增:
default-character-set=utf8
3)重啟mysql服務
service mysql restart

 insert into users(user_id,name,passwd,email) values
 (1,"二狗",111,"[email protected]"),(2,"柱子",222,"[email protected]"),(3,"鐵錘",333,"[email protected]"),
 (4,"翠花",444,"[email protected]"),(5,"剛子",555,"[email protected]"),(6,"二毛",666,"[email protected]");
 
 create table message(mid int(11) unsigned primary key not null,
 title varchar(100) not null,content text not null,uid int(11) unsigned not null,
 pubtime int(11) unsigned not null,state tinyint not null)engine=innodb default charset=utf8;
 
 mysql> alter table message add index(uid);
 
 insert into message(mid,title,content,uid,pubtime,state) values(110,"心裡方","寶寶怕怕",1,2018-6-1,1),(100,"修仙","不吃不喝吸仙氣",2,2018-6-19,0),(99,"佛系","做安靜善良的小姐姐",3,2018-2-2,1);
 
 insert into message(mid,title,content,uid,pubtime,state) values(129,"寶寶","寶寶乖不哭",4,2015),(66,"養蛙","蛙兒子不回家",5,2018,0),(666,"碼農","我只會敲程式碼",6,2017);