mysql 的基本操作
---恢復內容開始---
mysql是一個數據庫,太多的也不想說了,什麼公司的什麼年代建立的,跟我沒關係,會用就完了,怎麼安裝自行百度吧。
1初識mysql語句
操作資料夾(庫)
增
create database db1 charset utf8;
查
檢視當前建立的資料庫;show create database db1;
檢視所有的資料庫;show databases;
改
alter database db1 charset gbk;
刪
drop database db1;
操作檔案(表)
切換資料夾;(進入資料夾)use db1;
檢視當前所在的資料夾;select database();
增
create table t1(id int,name char);
查
檢視當前的這張t1表;show create table t1;
檢視所有的表;show tables;
查看錶的詳細資訊;desc t1;
改
modify修改的意思; alter table t1 modify name char(6);
改變name為答謝的NAME;alter table t1 change name NAME char(7);
刪
刪除表;drop table t1;
操作檔案內容(記錄)
增
插入一條資料,規定id,name資料
insert t1(id,name) valuse(1,‘名字’),(2,“名字”);
select id from db1。t1;
select id,name from db1.t1;
select * from db1。t1;
改
update db1.t1 set name=“新名字”;
update db1.t1 set name=‘新名字’ where id = 2;
刪
delete from t1;
delect from t1 where id = 2;
2庫的操作
1建立資料庫
create database 資料庫名 charset utf8;
資料庫命名規則:基本上跟python或者js的命名規則一樣
可以由字母,數字,下劃線,@,#,¥,
區分大小寫
唯一性
不能使用關鍵字 create select
不能單獨使用數字
最長128位
2資料庫相關操作
檢視資料庫;show databases;
檢視當前庫;show create database db1;
檢視所在的庫;select database();
選擇資料庫;use 資料庫名
刪除資料庫;drop database 資料庫名;
修改資料庫;alter database db1 charset utf8;
3表的操作
1,建立資料庫
create database db2 charset utf8;
2,使用資料庫
use db2;
3,建立表
create table 表名(欄位名1 型別[(寬度)約束條件],
。。。。
);
create table a1(
id int,
name varchar(50),
age int(3)
);
4,插入表的記錄
insert into a1 values
(1,‘名字’,18),
。。。
;
5,查詢表的資料和結構
(1)查詢a1表中的儲存資料
select * from a1;
(2)查詢a1表的結構
desc a1;
(3)查看錶的詳細結構
show create table a1\G;
6,複製表
(1)新建立一個數據庫db3
create database db3 charset utf8;
(2)使用db3
use db3;
(3)複製db2.a1的表結構和記錄
複製表的操作(即複製了表結構,又複製了記錄)
create table b1 select * from db2.a1;
4資料型別
mysql常用的資料型別包括
1,數字:
整數:tinyint int bigint
小數:
float:在位數比較短的情況下不精準
double:在位數比較長的情況下不精準
decimal:(如果用小數,推薦使用decimal)
精準
內部原理是以字串形式去存
2,字串:
char(10):簡單粗暴,浪費空間,存取速度快
root存成root000000
varchar:jingz,節省空間,存取速度慢
sql優化:建立表時,定長的型別往前放,變長的往後放
性別 地址,或詳細資訊
255個字元,超了就把檔案路徑存放到資料庫中。
比如圖片,視訊等找一個檔案伺服器,資料庫中只存路徑或url。
3,時間型別:
最常用:datetime
4,列舉型別與集合型別
enum和set
整數型別:tinyint smallint mediumlnt int bigint
作用儲存年齡,等級,id,各種號碼等
======================================== tinyint[(m)] [unsigned] [zerofill] 小整數,資料型別用於儲存一些範圍的整數數值範圍: 有符號: -128 ~ 127 無符號: ~ 255 PS: MySQL中無布林值,使用tinyint(1)構造。 ======================================== int[(m)][unsigned][zerofill] 整數,資料型別用於儲存一些範圍的整數數值範圍: 有符號: -2147483648 ~ 2147483647 無符號: ~ 4294967295 ======================================== bigint[(m)][unsigned][zerofill] 大整數,資料型別用於儲存一些範圍的整數數值範圍: 有符號: -9223372036854775808 ~ 9223372036854775807 無符號: ~ 18446744073709551615
以上重點在於有符號,可以有負數
驗證1:有符號和無符號tinyint
============有符號tinyint============== # 建立資料庫db4 create database db4 charset utf8; # 切換到當前db4資料庫 mysql> use db4; # 建立t1 規定x欄位為tinyint資料型別(預設是有符號的) mysql> create table t1(x tinyint); # 驗證,插入-1這個數 mysql> insert into t1 values(-1); # 查詢 表記錄,查詢成功(證明預設是有符號型別) mysql> select * from t1; +------+ | x | +------+ | -1 | +------+ #執行如下操作,會發現報錯。因為有符號範圍在(-128,127) mysql> insert into t1 values(-129),(128); ERROR 1264 (22003): Out of range value for column 'x' at row 1 ============無符號tinyint============== # 建立表時定義記錄的字元為無符號型別(0,255) ,使用unsigned mysql> create table t2(x tinyint unsigned); # 報錯,超出範圍 mysql> insert into t2 values(-129); ERROR 1264 (22003): Out of range value for column 'x' at row 1 # 插入成功 mysql> insert into t2 values(255); Query OK, 1 row affected (0.00 sec)
以上重點在於帶符號的有負數,無符號的不帶負數,儲存資料一樣多,也就是不帶符號的正數存的多
驗證2:int型別後面的儲存是顯示寬度,而不是儲存寬度
mysql> create table t3(id int(1) unsigned); #插入255555記錄也是可以的 mysql> insert into t3 values(255555); mysql> select * from t3; +--------+ | id | +--------+ | 255555 | +--------+ ps:以上操作還不能夠驗證,再來一張表驗證用zerofill 用0填充 # zerofill 用0填充 mysql> create table t4(id int(5) unsigned zerofill); mysql> insert into t4 value(1); Query OK, 1 row affected (0.00 sec) #插入的記錄是1,但是顯示的寬度是00001 mysql> select * from t4; +-------+ | id | +-------+ | 00001 | +-------+ row in set (0.00 sec)
以上重點是存在資料庫中的和看到的不一樣,資料庫中會預設加0
浮點型
定點數型別:dec等同於decimal
浮點型別:float double
作用:儲存薪資、身高、體重等
-------------------------FLOAT------------------- FLOAT[(M,D)] [UNSIGNED] [ZEROFILL] #引數解釋:單精度浮點數(非準確小數值),M是全長,D是小數點後個數。M最大值為255,D最大值為30 #有符號: -3.402823466E+38 to -1.175494351E-38, 1.175494351E-38 to 3.402823466E+38 #無符號: 1.175494351E-38 to 3.402823466E+38 #精確度: **** 隨著小數的增多,精度變得不準確 **** -------------------------DOUBLE----------------------- DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL] #引數解釋: 雙精度浮點數(非準確小數值),M是全長,D是小數點後個數。M最大值為255,D最大值為30 #有符號: -1.7976931348623157E+308 to -2.2250738585072014E-308 2.2250738585072014E-308 to 1.7976931348623157E+308 #無符號: 2.2250738585072014E-308 to 1.7976931348623157E+308 #精確度: ****隨著小數的增多,精度比float要高,但也會變得不準確 **** ====================================== --------------------DECIMAL------------------------ decimal[(m[,d])] [unsigned] [zerofill] #引數解釋:準確的小數值,M是整數部分總個數(負號不算),D是小數點後個數。 M最大值為65,D最大值為30。 #精確度: **** 隨著小數的增多,精度始終準確 **** 對於精確數值計算時需要用此型別 decaimal能夠儲存精確值的原因在於其內部按照字串儲存。
以上重點就是說越長越不準確
日期型別
date time datetime timestamp year
作用:儲存使用者註冊時間,文章釋出時間,員工入職時間,出生日期等
語法: YEAR YYYY(1901/2155) DATE YYYY-MM-DD(1000-01-01/9999-12-31) TIME HH:MM:SS('-838:59:59'/'838:59:59') DATETIME YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59 Y) TIMESTAMP YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某時)
列舉和集合
列舉enum 單選 只能在給定的範圍內選一個值,如性別
集合set 多選 在給定的範圍內可以選擇一個或一個以上的值(愛好1,愛好2.。。。)
mysql> create table consumer( -> id int, -> name varchar(50), -> sex enum('male','female','other'), -> level enum('vip1','vip2','vip3','vip4'),#在指定範圍內,多選一 -> fav set('play','music','read','study') #在指定範圍內,多選多 -> ); Query OK, 0 rows affected (0.03 sec) mysql> insert into consumer values -> (1,'趙雲','male','vip2','read,study'), -> (2,'趙雲2','other','vip4','play'); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> select * from consumer; +------+---------+-------+-------+------------+ | id | name | sex | level | fav | +------+---------+-------+-------+------------+ | 1 | 趙雲 | male | vip2 | read,study | | 2 | 趙雲2 | other | vip4 | play | +------+---------+-------+-------+------------+ rows in set (0.00 sec)
5完整性約束
主要有這幾種
標識該欄位為該表的主鍵,可以唯一的標識記錄 ;primary key(pk)
標識該欄位位該表的外來鍵 ;foreign key(fk)
not null ;標識該欄位不能為空
unique key(uk);標識該欄位的值是唯一的
auto——increment ; 標識該欄位的值自動增長(整數型別,而且為主鍵)
default ; 為該欄位設定預設值
unsigned 無符號
zerofill 使用0填充
#1. 是否允許為空,預設NULL,可設定NOT NULL,欄位不允許為空,必須賦值 #2. 欄位是否有預設值,缺少的預設值是NULL,如果插入記錄時不給欄位賦值,此欄位使用預設值 sex enum('male','female') not null default 'male' #必須為正值(無符號) 不允許為空 預設是20 age int unsigned NOT NULL default 20 # 3. 是否是key 主鍵 primary key 外來鍵 foreign key 索引 (index,unique...)
not null 與 default
是否可空,null表示空,非字串
not null 不可以 null 可以
預設值,建立列時可以指定預設值,當插入資料時如果未主動設定,則自動新增預設值
create table tb1(
nid int not null defalut 2,
num int not null
);
unique不同的,mysql中稱為單列唯一
create table departm(
id int unique, 建表的時候就寫裡面
name char(10) unique
);
聯合唯一,只要兩列記錄,有一列不同,既符合聯合唯一的約束
create table services(
id int,
ip char
port int
unique(id)
unique(IP,port)
);
primary key一般寫在id裡 唯一且不為空
auto_increm約束的欄位為自動增長,約束的欄位必須同時被key約束
foreign key 讓兩張表有關聯
6外來鍵的變種 三種關係
如何找出兩張表之間的關係
因為有了foreign key的約束,使得兩張表形成了三種關係
一對多,多對多,多對一
找出兩張表的關係
分析步驟: #1、先站在左表的角度去找 是否左表的多條記錄可以對應右表的一條記錄,如果是,則證明左表的一個欄位foreign key 右表一個欄位(通常是id) #2、再站在右表的角度去找 是否右表的多條記錄可以對應左表的一條記錄,如果是,則證明右表的一個欄位foreign key 左表一個欄位(通常是id) #3、總結: #多對一: 如果只有步驟1成立,則是左表多對一右表 如果只有步驟2成立,則是右表多對一左表 #多對多 如果步驟1和2同時成立,則證明這兩張表時一個雙向的多對一,即多對多,需要定義一個這兩張表的關係表來專門存放二者的關係 #一對一: 如果1和2都不成立,而是左表的一條記錄唯一對應右表的一條記錄,反之亦然。這種情況很簡單,就是在左表foreign key右表的基礎上,將左表的外來鍵欄位設定成unique即可
7資料的增刪改查
插入資料 insert
更新資料 update
刪除資料 delete
插入資料
一、插入資料 INSERT 1. 插入完整資料(順序插入) 語法一: INSERT INTO 表名(欄位1,欄位2,欄位3…欄位n) VALUES(值1,值2,值3…值n); 語法二: INSERT INTO 表名 VALUES (值1,值2,值3…值n); 2. 指定欄位插入資料 語法: INSERT INTO 表名(欄位1,欄位2,欄位3…) VALUES (值1,值2,值3…); 3. 插入多條記錄 語法: INSERT INTO 表名 VALUES (值1,值2,值3…值n), (值1,值2,值3…值n), (值1,值2,值3…值n); 4. 插入查詢結果 語法: INSERT INTO 表名(欄位1,欄位2,欄位3…欄位n) SELECT (欄位1,欄位2,欄位3…欄位n) FROM 表2 WHERE …; 二、更新資料UPDATE 語法: UPDATE 表名 SET 欄位1=值1, 欄位2=值2, WHERE CONDITION; 示例: UPDATE mysql.user SET password=password(‘123’) where user=’root’ and host=’localhost’; 三、刪除資料DELETE 語法: DELETE FROM 表名 WHERE CONITION; 示例: DELETE FROM mysql.user WHERE password=’’;
查又分為單表查詢和多表查詢
一、單表查詢的語法 SELECT 欄位1,欄位2... FROM 表名 WHERE 條件 GROUP BY field HAVING 篩選 ORDER BY field LIMIT 限制條數 二、關鍵字的執行優先順序(重點) 重點中的重點:關鍵字的執行優先順序 from where group by having select distinct order by limit 1.找到表:from 2.拿著where指定的約束條件,去檔案/表中取出一條條記錄 3.將取出的一條條記錄進行分組group by,如果沒有group by,則整體作為一組 4.將分組的結果進行having過濾 5.執行select 6.去重 7.將結果按條件排序:order by 8.限制結果的顯示條數
(1)where約束
where子句中可以使用 1.比較運算子:>、<、>=、<=、<>、!= 2.between 80 and 100 :值在80到100之間 3.in(10,20,30)值是10或20或30 4.like 'xiaomagepattern': pattern可以是%或者_。%小時任意多字元,_表示一個字元 5.邏輯運算子:在多個條件直接可以使用邏輯運算子 and or not
關鍵字like模糊查詢 像
select * from 表 where 欄位 like ‘jin%’;只要該欄位以jin開頭不管後面什麼,都拿出來
萬用字元‘_‘
select * from 表 where 欄位 like ‘ale_’;以ale開頭後面只有一位的
(2)group by 分組查詢
#1、首先明確一點:分組發生在where之後,即分組是基於where之後得到的記錄而進行的 #2、分組指的是:將所有記錄按照某個相同欄位進行歸類,比如針對員工資訊表的職位分組,或者按照性別進行分組等 #3、為何要分組呢? 取每個部門的最高工資 取每個部門的員工數 取男人數和女人數 小竅門:‘每’這個字後面的欄位,就是我們分組的依據 #4、大前提: 可以按照任意欄位分組,但是分組完畢後,比如group by post,只能檢視post欄位,如果想檢視組內資訊,需要藉助於聚合函式
繼續驗證通過group by分組之後,只能檢視當前欄位,如果想檢視組內資訊,需要藉助於聚合函式
select * from emp group by post;# 報錯
select post from employee group by post;
(3)聚合函式
max()求最大值 ------min
avg()求平均值
sum()求和
count()求總個數
#強調:聚合函式聚合的是組的內容,若是沒有分組,則預設一組 # 每個部門有多少個員工 select post,count(id) from employee group by post; # 每個部門的最高薪水 select post,max(salary) from employee group by post; # 每個部門的最低薪水 select post,min(salary) from employee group by post; # 每個部門的平均薪水 select post,avg(salary) from employee group by post;
(4)having過濾
HAVING與WHERE不一樣的地方在於 #!!!執行優先順序從高到低:where > group by > having #1. Where 發生在分組group by之前,因而Where中可以有任意欄位,但是絕對不能使用聚合函式。 #2. Having發生在分組group by之後,因而Having中可以使用分組的欄位,無法直接取到其他欄位,可以使用聚合函式
以上重點就是having更精確
(5)limit限制查詢的記錄數:
示例: SELECT * FROM employee ORDER BY salary DESC LIMIT 3; #預設初始位置為0 SELECT * FROM employee ORDER BY salary DESC LIMIT 0,5; #從第0開始,即先查詢出第一條,然後包含這一條在內往後查5條 SELECT * FROM employee ORDER BY salary DESC LIMIT 5,5; #從第5開始,即先查詢出第6條,然後包含這一條在內往後查5條
desc倒序排序 從大到小
acs正序排序 從小到大
多表查詢
多表連線查詢
1,多表連線查詢
語法
SELECT 欄位列表 FROM 表1 INNER|LEFT|RIGHT JOIN 表2 ON 表1.欄位 = 表2.欄位;
連線所有
先寫個左連線中間加個union all 再寫個右連線
2,符合條件查詢
select employee.id,employee.name,employee.age,department.name from employee,department where employee.dep_id = department.id and age > 25 order by age asc;
3,子查詢
子查詢是將一個查詢語句巢狀在另一個查詢語句中。
內層查詢語句的查詢結果,可以為外層查詢語句提供查詢條件。
子查詢中可以包含in,not in,any,all,exists,not exists等關鍵字
可以包含比較運算子=,!=,>,<等