綜合使用 查詢 目錄:
#----綜合使用 書寫順序 select distinct * from '表名' where '限制條件' group by '分組依據' having '過濾條件' order by limit '展現條數' 執行順序 from -- 查詢 where -- 限制條件 group by -- 分組 having -- 過濾條件 order by -- 排序 limit -- 展現條數 distinct -- 去重 select -- 查詢的結果 正則:select * from emp where name regexp '^j.*(n|y)$'; 集合查詢:max 、min 、avg 、sum 、count 、group_concat 。 內鏈接:inner join 左鏈接:left join 右鏈接:right join 全鏈接: 左鏈接 union 右鏈接 replace 替換 拼接:concat、concat_ws、group_concat
常規設置操做
1.服務器設置遠程訪問
grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;2.Linux中數據庫的基本操做命令
1.使用service 啓動:service mysql start 中止:service mysql stop 重啓:service mysql restart 2.清屏:clear,reset3.備份數據庫
#mysqldump -uroot -p密碼 數據庫名 > D:/備份文件名.sql4.恢復備份的數據庫
#首先在mysql裏建好數據庫名 #mysql -uroot -p密碼 數據庫名 < D:/備份文件名.sql5.查詢binlog日誌是否開啓
show variables like 'log_%';
基本操做:
1.單表約束
#主鍵約束:PRIMARY KEY 要求被裝飾的字段:惟一和非空 #惟一約束:UNIQUE 要求被裝飾的字段:惟一, # .聯合惟一:在結尾:unique(字段1,字段2) #非空約束:NOT NULL 要求被裝飾的字段:非空 #外鍵約束:FOREIGN KEY 某主表的外鍵 #自動增長:AUTO_INCREMENT 自動增長(須要和主鍵 PRIMARY KEY 同時用) #設置默認值:DEFAULT 爲該屬性設置默認值 # 在int、char中:zerofill 不足位數默認填充0 # #2.經常使用數據類型
int #整型,4個字節 通常不須要指定寬度,(8):只是顯示爲8位,默認有負號設置無負號: unsigned double #浮點型,例如double(5,2),標識最多5位,其中2位爲小數,即最大爲999.99 varchar #可變長度字符串類型。例如:varchar(10) 'aaa' 佔3位 char #固定長度字符串類型。例如:char(10) 'aaa' 佔10位 text #大文本字符串類型。 blob #字節類型。例如: datetime #日期時間類型。例如:datetime(yyyy-MM-dd hh:mm:ss) date #日期類型。例如:date(yyyy:MM:dd) time #時間類型。例如:time(hh:mm:ss) timestamp #時間戳類型。例如:timestamp(yyyy-MM-dd hh:mm:ss) 會自動賦值 enum #枚舉 多選一 enum('male','female'),default爲默認值 例如:sex enum('male','female') not null default 'male' set #集合 多選多,能夠選一個 set('read','DJ','DBJ','run') 注:字符串類型和時間類型都要用單引號括起來,空值爲null3.查看數據列表
show databases; -- 查看全部數據庫 show create table 表名; -- 查看錶的建立細節 desc 表名; -- 查看錶結構4.進入數據庫
#use 數據名 use Python_75.建立數據庫
#CREATE DATABASE 數據庫名 CREATE DATABASE Python_7; CREATE DATABASE pyrhon_7 charset utf8 # 修改數據庫編碼 alter database db1 charset gbk;6.刪除數據庫
#drop database 須要刪除的數據庫名 drop database Python_7;7.查看錶
select database(); # 查看當前所在的庫 show tables; -- 查看數據庫中全部表 desc 表名; -- 查看錶結構 show create table 表名; -- 查看錶的建立細節8.建立表
# 建立新表 # create table 新建數據表名( # 字段名 類型(長度) [約束(具體見1)], # 字段名 類型(長度) [約束(具體見1)] # ); create table class( id INT AUTO_INCREMENT, name varchar(32) UNIQUE, age varchar(32) NOT NULL ); #須要注意 #根據已有的表建立新表 create table 新表 like 舊錶 -- 使用舊錶建立新表 create table 新表 as select 字段1 字段2... from definition only -- 使用自定義值去新建表9.刪除表
#drop table 數據庫表名 drop table Python10.修改表
alter table 表名 add 字段名 類型(長度) [約束]; -- 添加列 alter table 表名 modify 字段名 類型(長度) [約束]; -- 修改列的類型長度及約束 alter table 表名 change 舊字段名 新字段名 類型(長度) [約束]; -- 修改列表名 alter table 表名 drop 字段名; -- 刪除列 alter table 表名 character set 字符集; -- 修改表的字符集 rename table 表名 to 新表名; -- 修改表名11.增長數據
insert into 表(字段名1,字段名2..) values(值1,值2..);-- 向表中插入某些列 insert into 表 values(值1,值2,值3..); -- 向表中插入全部列12.修改數據
update 表名 set 字段名=值,字段名=值...; -- 這個會修改全部的數據,把一列的值都變了 update 表名 set 字段名=值,字段名=值... where 條件; -- 只改符合where條件的行13.刪除數據
delete from 表名 -- 刪除表中全部記錄 delete from 表名 where 條件 -- 刪除符合 where條件的數據 truncate table 表名; -- 把表直接drop掉,從新建表,auto_increment將置爲零。刪除的數據不能找回。執行速度比delete快14.數據的簡單查詢
select * from 表名; -- 查詢全部列 select 字段名1,字段名2,字段名3.. from 表名; -- 查詢指定列15.幾個簡單的基本的sql語句
select * from 表名 where 範圍 -- 選擇查詢 insert into 表名(field1,field2) values(value1,value2) -- 插入 delete from 表名 where 範圍 -- 刪除 update 表名 set field1=value1 where 範圍 -- 更新 select * from 表名 where field1 like ’%value1%’ -- 查找 select * from 表名 order by field1,field2 [desc] -- 排序: select count as 須要統計總數的字段名 from 表名 -- 總數 select sum(field1) as sumvalue from 表名 -- 求和 select avg(field1) as avgvalue from 表名 -- 平均 select max(field1) as maxvalue from 表名 -- 最大 select min(field1) as minvalue from 表名 -- 最小16.存儲引擎
# 查看全部的存儲引擎 show engines; # 查看不一樣存儲引擎存儲表結構文件特色 create table t1(id int)engine=innodb; -- MySQL默認的存儲引擎,支持事務,支持行鎖,支持外鍵。有且只有一個主鍵,用來組織數據的依據 create table t2(id int)engine=myisam; -- 不支持事務,不支持外鍵,支持全文索引,處理速度快。 create table t3(id int)engine=blackhole; -- 黑洞,寫入它的任何內容都會消失 create table t4(id int)engine=memory;-- 將表中的數據存儲在內存中。表結構以文件存儲於磁盤。 insert into t1 values(1); insert into t2 values(1); insert into t3 values(1); insert into t4 values(1);17.設置嚴格模式
# 查詢 show variables like '%mode%'; # 設置 set session -- 設置當前窗口下有效 set global -- 全局有效,終身受用 set global sql_mode = "STRICT_TRANS_TABLES"; # 設置完成後須要退出客戶端,從新登陸客戶端便可,不須要重啓服務端 group by分組涉及到的模式: 設置sql_mode爲only_full_group_by,意味着之後但凡分組,只能取到分組的依據, 不該該在去取組裏面的單個元素的值,那樣的話分組就沒有意義了,由於不分組就是對單個元素信息的隨意獲取 """ set global sql_mode="strict_trans_tables,only_full_group_by"; # 從新連接客戶端18.like 的用法
A:% 包含零個或多個字符的任意字符串: 一、like'Mc%' 將搜索以字母 Mc 開頭的全部字符串(如 McBadden)。 二、like'%inger' 將搜索以字母 inger 結尾的全部字符串(如 Ringer、Stringer)。 三、like'%en%' 將搜索在任何位置包含字母 en 的全部字符串(如 Bennet、Green、McBadden)。 B:_(下劃線) 任何單個字符: like'_heryl' 將搜索以字母 heryl 結尾的全部六個字母的名稱(如 Cheryl、Sheryl)。 C:[ ] 指定範圍 ([a-f]) 或集合 ([abcdef]) 中的任何單個字符: 1,like'[CK]ars[eo]n' 將搜索下列字符串:Carsen、Karsen、Carson 和 Karson(如 Carson)。 二、like'[M-Z]inger' 將搜索以字符串 inger 結尾、以從 M 到 Z 的任何單個字母開頭的全部名稱(如 Ringer)。 D:[^] 不屬於指定範圍 ([a-f]) 或集合 ([abcdef]) 的任何單個字符: like'M[^c]%' 將搜索以字母 M 開頭,而且第二個字母不是 c 的全部名稱(如MacFeather)。 E:* 它同於DOS命令中的通配符,表明多個字符: c*c表明cc,cBc,cbc,cabdfec等多個字符。 F:?同於DOS命令中的?通配符,表明單個字符 : b?b表明brb,bFb等 G:# 大體同上,不一樣的是代只能表明單個數字。k#k表明k1k,k8k,k0k 。 下面咱們來舉例說明一下: 例1,查詢name字段中包含有「明」字的。 select * from table1 where name like '%明%' 例2,查詢name字段中以「李」字開頭。 select * from table1 where name like '李*' 例3,查詢name字段中含有數字的。 select * from table1 where name like '%[0-9]%' 例4,查詢name字段中含有小寫字母的。 select * from table1 where name like '%[a-z]%' 例5,查詢name字段中不含有數字的。 select * from table1 where name like '%[!0-9]%' 以上例子能列出什麼值來顯而易見。但在這裏,咱們着重要說明的是通配符「*」與「%」的區別。 不少朋友會問,爲何我在以上查詢時有個別的表示全部字符的時候用"%"而不用「*」?先看看下面的例子能分別出現什麼結果: select * from table1 where name like '*明*' select * from table1 where name like '%明%' 你們會看到,前一條語句列出來的是全部的記錄,然後一條記錄列出來的是name字段中含有「明」的記錄,因此說,當咱們做字符型字段包含一個子串的查詢時最好採用「%」而不用「*」,用「*」的時候只在開頭或者只在結尾時,而不能兩端全由「*」代替任意字符的狀況下。
高級查詢操做
一、外鍵表建立
一對多(Foreign Key) # foreign key(須要關聯的本字段) references 須要關聯對錶的表(須要關聯對錶的字段) 例如: 建立dep foreign key(dep_id) references dep(id) # 同步更新,同步刪除 on update cascade #同步更新 on delete cascade #同步刪除二、表複製
複製表 create table t1 select * from test; 只複製表結構 create table t1 select * from test where 1=2;三、單表查詢查詢
0.綜合使用
#----綜合使用 書寫順序 select distinct * from '表名' where '限制條件' group by '分組依據' having '過濾條件' order by limit '展現條數' 執行順序 from -- 查詢 where -- 限制條件 group by -- 分組 having -- 過濾條件 order by -- 排序 limit -- 展現條數 distinct -- 去重 select -- 查詢的結果 正則:select * from emp where name regexp '^j.*(n|y)$'; 集合查詢:max 、min 、avg 、sum 、count 、group_concat 。 拼接:concat、concat_ws、group_concat 內鏈接:inner join 左鏈接:left join 右鏈接:right join 全鏈接: 左鏈接 union 右鏈接1.where 查詢
# between 在...之間 select id,name from emp where id >= 3 and id <= 6; 至關於: select * from emp where id between 3 and 6; # or 或者 select * from emp where id >= 3 or id <= 6; # in,後面能夠跟多個值 select * from 表名 where 字段名 in (條件1,條件2,條件三); # like (見上18) # char——length() 取字符長度 select * from 表名 where char_length(須要獲取長度的字段名) = 4; not 配合使用 注意:判斷空不能用 = ,只能用 is2.group by 分組
select 查詢字段1,查詢字段2,... from 表名 where 過濾條件 group by分組依據 # 分組後取出的是每一個組的第一條數據3.聚合查詢 :以組爲單位統計組內數據>>>聚合查詢(彙集到一塊兒合成爲一個結果)
# max 最大值 # 每一個部門的最高工資 select post,max(salary) from emp group by post; # min 最小值 # 每一個部門的最低工資 select post,min(salary) from emp group by post; # avg 平均值 # 每一個部門的平均工資 select post,avg(salary) from emp group by post; # 每一個部門的工資總和 # sum 求和 select post,sum(salary) from emp group by post; # count(須要計數字段) 計數 # 每一個部門的人數 select post,count(id) from emp group by post; # group_concat(須要分組後的字段) # 不只能夠用來顯示除分組外字段還有拼接字符串的做用 select post,group_concat(name) from emp group by post; -- post:分組字段,name 須要分組後顯示的字段 拼接: concat(不分組時用)拼接字符串達到更好的顯示效果 as語法使用 舉例: select concat("NAME: ",name) as 姓名 from emp; concat_ws: 若是拼接的符號是統一的能夠用 舉例: select concat_ws(':',name,age,sex) as info from emp; group_concat: 舉例: select post,group_concat(name,'DSB') from emp group by post; 補充:as語法 起別名 select name as 姓名,salary as 薪資 from emp;4.having 過濾查詢
# having的語法格式與where一致,只不過having是在分組以後進行的過濾,即where雖然不能用聚合函數,可是having能夠! # 用法 select 查詢字段1,查詢字段2,... from 表名 where 過濾條件1 group by分組依據 having avg(過濾條件2) > 10000;5.distinct 去重
# 對有重複的展現數據進行去重操做 select distinct 需取重字段 from 表名;6.order by 排序
select * from emp order by salary asc; #默認升序排 select * from emp order by salary desc; #降序排 # 多條件排序 #先按照age降序排,在年輕相同的狀況下再按照薪資升序排 select * from emp order by age desc,salary asc;7.limit 限制展現條數
# 限制展現條數 select * from emp limit 3; # 查詢工資最高的人的詳細信息 select * from emp order by salary desc limit 1; # 分頁顯示 select * from emp limit 0,5; # 第一個參數表示起始位置,第二個參數表示的是條數,不是索引位置 select * from emp limit 5,5;8.正則
select * from emp where name regexp '^j.*(n|y)$';9.replace 替換
replace(str1,old,new) -- str1:須要替換的字段名 update gd_km set mc=replace(mc,'土地','房子') 說明:new替換str1中出現的全部old,返回新的字符串,若是有某個參數爲NULL,此函數返回NULL 該函數能夠屢次替換,只要str1中還有old存在,最後都被替換成new 若new爲空,則刪除old4、多表查詢
1.內鏈接、左鏈接、右鏈接、全鏈接
一、內鏈接:只取兩張表有對應關係的記錄(只拼兩個表共有的) 左表 inner join 右表 on 條件 select * from emp inner join dep on emp.dep_id = dep.id where dep.name = "技術"; 二、左鏈接:在內鏈接的基礎上,保留左邊的數據,右邊沒有就爲空 左表 inner left 右表 on 條件 三、右鏈接:在內鏈接的基礎上,保留右邊的數據,左邊沒有就爲空 左表 inner right 右表 on 條件 四、全鏈接:左右鏈接都有,用union鏈接 左表 inner left 右表 on 條件 union 左表 inner right 右表 on 條件 select * from emp left join dep on emp.dep_id = dep.id union select * from emp right join dep on emp.dep_id = dep.id;2.子查詢
# 就是將一個查詢語句的結果用括號括起來看成另一個查詢語句的條件去用select name from where id in(select dep_id from emp where age>25);
5、數據庫的高級應用
具體詳情:mysql數據庫高級應用html