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;
多表聯合查詢 重要
- 內連線
- 外連線
- 子查詢
- 準備兩張表
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)
- 外連線 左連線 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)
- 外連線 右連線 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);