MySQ--語句大全

MySQl查詢語句大全

綜合使用 查詢 目錄:

#----綜合使用
書寫順序
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,reset

3.備份數據庫
#mysqldump -uroot -p密碼 數據庫名 > D:/備份文件名.sql

4.恢復備份的數據庫
#首先在mysql裏建好數據庫名
#mysql -uroot -p密碼 數據庫名 < D:/備份文件名.sql

5.查詢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')
注:字符串類型和時間類型都要用單引號括起來,空值爲null

3.查看數據列表
show databases; -- 查看所有數據庫
show create table 表名; -- 查看錶的創建細節
desc 表名; -- 查看錶結構

4.進入數據庫
#use 數據名
use Python_7

5.創建數據庫
#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 Python

10.修改表
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:% 包含零個或多個字符的任意字符串:
1、like'Mc%' 將搜索以字母 Mc 開頭的所有字符串(如 McBadden)。
2、like'%inger' 將搜索以字母 inger 結尾的所有字符串(如 Ringer、Stringer)。
3、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)。
  2、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字段中含有“明”的記錄,所以說,當我們作字符型字段包含一個子串的查詢時最好採用“%”而不用“*”,用“*”的時候只在開頭或者只在結尾時,而不能兩端全由“*”代替任意字符的情況下。


高級查詢操作
1、外鍵表創建
一對多(Foreign Key)
# foreign key(需要關聯的本字段) references 需要關聯對錶的表(需要關聯對錶的字段)
例如:
創建dep
foreign key(dep_id) references dep(id)
# 同步更新,同步刪除
on update cascade #同步更新
on delete cascade #同步刪除
2、表複製
複製表
create table t1 select * from test;
只複製表結構
create table t1 select * from test where 1=2;
3、單表查詢查詢
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 配合使用
注意:判斷空不能用 = ,只能用 is 
2.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爲空,則刪除old
四、多表查詢
1.內連接、左連接、右連接、全連接
1、內連接:只取兩張表有對應關係的記錄(只拼兩個表共有的)
左表 inner join 右表 on 條件
  select * from emp inner join dep on emp.dep_id = dep.id
       where dep.name = "技術";

2、左連接:在內連接的基礎上,保留左邊的數據,右邊沒有就爲空
左表 inner left 右表 on 條件
3、右連接:在內連接的基礎上,保留右邊的數據,左邊沒有就爲空
左表 inner right 右表 on 條件
4、全連接:左右連接都有,用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);


mysql中用命令行復製表結構的方法主要有一下幾種: 

1.只複製表結構到新表
1 CREATE TABLE 新表 SELECT * FROM 舊錶 WHERE 1=2;

1 CREATE TABLE 新表 LIKE 舊錶 ;
注意上面兩種方式,前一種方式是不會複製時的主鍵類型和自增方式是不會複製過去的,而後一種方式是把舊錶的所有字段類型都複製到新表。

 
2.複製表結構及數據到新表
1 CREATE TABLE 新表 SELECT * FROM 舊錶
 
3.複製舊錶的數據到新表(假設兩個表結構一樣) 
1 INSERT INTO 新表 SELECT * FROM 舊錶
 
4.複製舊錶的數據到新表(假設兩個表結構不一樣)
1 INSERT INTO 新表(字段1,字段2,.......) SELECT 字段1,字段2,...... FROM 舊錶

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章