1. 程式人生 > >MySQL的常用操作命令詳解

MySQL的常用操作命令詳解

系統管理

啟動MySQL服務

  1. 通過windows服務管理器啟動MySQL服務

    開始-->執行-->輸入services.msc命令-->啟動MySQL服務
  2. 通過DOS命令啟動MySQL服務

    net start mysql

停止MySQL服務

  1. 通過windows服務管理器啟動MySQL服務

    開始-->執行-->輸入services.msc命令-->停止MySQL服務
  2. 通過DOS命令停止MySQL服務

    net stop mysql

登入MySQL資料庫

  1. 通過DOS命令來登陸:

    mysql -h 主機的地址 -u 使用者名稱 -p 密碼
  2. 使用MySQL Command Line Client 登入,它在你安裝MySQL的目錄中

資料庫的基本操作

建立資料庫的語法格式:

create database 資料庫名稱 ;

例:建立一個名稱為xiaoxu的資料庫,SQL語句如下:

create database xiaoxu ;

檢視資料庫的語法格式:

show databases ;

檢視某個已建立好的資料庫的語法格式:

show create databases 資料庫名稱 ;

刪除資料庫的語法格式:

drop database 資料庫名稱 ;

資料表的基本操作

建立資料表語法格式:

create table 表名 ( 
欄位名 1,資料型別[完整性約束條件],
欄位名 2,資料型別[完整性約束條件],
...
欄位名 n,資料型別[完整性約束條件],
)

檢視資料表的語法格式:

show create table 表名 ; 
或者
describe 表名 ;
簡寫為
desc 表名 ;

新增、更新與刪除資料的操作

新增資料

1. 在表中,為所有欄位新增資料的insert語句有兩種,分別如下:

insert 語句中指定所有欄位名,其語法語法格式

insert into 表名(欄位名1,欄位名2, ...) 
value(值1,值2, ...)

例:向student表中新增一條新記錄,記錄中 id 欄位的值為 1,name欄位的值為’zhangsan’,grade欄位的值為98.5

假設已建立如下表:

create table student( 
id int(4),
name varchar(20) not null,
grade float
);

向student表中插入一條資料,程式碼如下所示

insert into student(id,name,grade) 
values(1,'zhangsan',98.5);

insert語句中不指定欄位名,其語法格式

insert into 表名 values(值1,值2, ...)

注意:由於insert語句中沒有指定欄位名,新增值的順序,必須和欄位在表中已經定義的順序相同

例:向已新增紀錄的student表中新增一條新記錄,記錄中 id 欄位的值為3,name欄位的值為’wangwu’,grade欄位的值為61.5,可參考第一種方法的例子

insert into student 
values(3,'wangwu',61.5)

2. 為表中的指定欄位新增資料,其語法格式

insert into 表名(欄位名1,欄位2, ...) 
values(值1,值2, ...)

例:向student表中新增一條新記錄,記錄中 id 欄位的值為 4,name欄位的值為“zhaoliu”,grade欄位不指定值

insert into student(id,name) 
values(4,'zhaoliu') ;

insert語句的其它用法:

  • 為表中指定的欄位或者全部欄位新增資料,其語法格式

    insert into 表名 
    set 欄位名1 = 值1 [,欄位名2 = 值2, ...]

例:向student表中新增一條新記錄,該條記錄中 id 欄位的值為5,name欄位的值為’boya’,grade欄位的值為 99

insert into student 
set id = 5, name = 'boya', grade = 99 ;

為表中同時新增多條記錄,其語法格式

insert into 表名 [(欄位名1,欄位名2, ...)] 
values(值1,值2, ...),(值1,值2, ...),
...
(值1,值2, ...) ;

例:向student表中新增三條新記錄。

假設已建立如下表:

create table student( 
id int(4),
name varchar(20) not null,
grade float
);

新增新記錄如下

insert into student 
values (6,'lilei',99),
(7,'hanmeimei',100),
(8,'poly',40.5) ;

更新資料

更新表中的記錄,其語法格式

update 表名 
set 欄位名1 = 值1 [,欄位名2 = 值2, ...]
[where 條件表示式]

update更新部分資料

更新student標準那個id欄位值為1的記錄,將記錄中的name欄位的值更改為’caocao’,grade欄位的值更改為50。
在更新資料前,首先使用查詢語句檢視id欄位值為1的記錄,執行結果如下

select * from student 
where id = 1 ;

更新結果如下

select * from student 
set name = 'caocao', grade = 50
where id = 1 ;

例2:更新student表中 id 欄位值小於4的記錄,將這些記錄的grade欄位值都更新為 100。
在更新資料前,首先使用查詢語句檢視 id 欄位值小於 4 的記錄,執行結果如下

select * from student 
where id < 4 ;

更新結果如下

 update student 
set grade = 100
where id < 4 ;

update 更新全部資料

例:更新student表中全部記錄,將grade欄位值都更新為80

update student  
set grade = 80 ;

刪除資料

刪除資料有兩種方法:

第一種:delete語句

刪除表中的記錄,其語法格式

delete from 表名 [where 條件表示式]

delete刪除部分資料

例:在student表中,刪除id欄位值為11的記錄。
在刪除之前,首先使用查詢語句檢視id欄位值為11的記錄,執行結果如下

select * from student
where id = 11 ;

delete刪除全部資料

在delete語句中,若沒用使用where子句,則會將表中的所有記錄都刪除

例:刪除student表中的所有記錄。

delete from student ;

第二種:truncate語句

truncate [table] 表名

例:刪除student表中的所有記錄

truncate table student ;

delete語句truncate語句的異同點

相同點:都能刪除表中的所有資料的功能。

不同點:

delte語句:

  • delete語句是DML語句;

  • delete 語句後面可以跟where子句,通過指定where子句中的條件表示式只刪除滿足條件的記錄;

  • delete語句刪除表中所有記錄後,再次向表中新增記錄時,自動增加欄位的值為刪除時該欄位的最大增加1;

  • 使用delete語句時,每刪除一條記錄都會在日誌中記錄。

truncate語句:

  • truncate語句通常被認為是DDL語句;

  • truncate語句只能用於刪除表中的所有記錄;

  • truncate語句刪除表中的資料後,再次向表中新增記錄時,自動增加欄位的預設初始值重新由1開始;

  • 使用truncate語句時,不會在日誌中記錄刪除的內容,因此truncate語句的執行效率比delete語句高。

查詢資料

簡單查詢

select語句的語法格式如下

select [distinct] *| {欄位名1,欄位名2,欄位名3, ...} 
from 表名
[where 條件表示式1]
[group by 欄位名 [having 條件表示式2]]
[order by 欄位名 [asc|desc]]
[limit [offset] 記錄數]

查詢所有欄位有兩種方法

第一種:

在select語句中列出所有欄位名來查詢表中的資料,其語法格式

select 欄位名1,欄位名2, ... from 表名 ;

第二種:

使用星號(“*”)萬用字元來代替所有的欄位名,其語法格式如下

select * from student ;

查詢指定欄位,其語法格式如下

select 欄位名1,欄位名2, ... from 表名 ;

按條件查詢

帶關係運算符的查詢

在select語句中,最常見的是使用where子句指定查詢條件對資料進行過濾,其語法格式如下

select 欄位名1,欄位名2, ... 
from 表名
where 條件表示式 ;

常見的關係運算符如下表所示

關係運算符 說明 關係運算符 說明
= 等 於 <= 小於等於
< > 不等於 > 大 於
!= 不等於 >= 大於等於
<

例:查詢student表中grade大於80的學生姓名。

select name, grade from student where grade > 80;

帶 in 關鍵字的查詢

in 關鍵字用於判斷某個欄位的值是否在指定集合中,若欄位的值在集合中,則滿足條件,該欄位所在的記錄將被查詢出來。其語法格式如下

select 欄位名1, 欄位名2, ... 
from 表名
where 欄位名 [not] in (元素1, 元素2, ...)

說明:在上面的語法格式中,“元素1, 元素2, …”表示集合眾的元素,即指定的條件範圍。not 是可選引數,使用not表示查詢不在in關鍵字指定集合範圍中的記錄。

例:查詢student表中id值為1、2、3的記錄。

select id, grade, name, gender from student where id in (1,2,3) ;

帶between and 關鍵字的查詢

between and用於判斷某個欄位的值是否在指定的範圍之內,其語法格式如下

select 欄位名1, 欄位名2, ... 
from 表名
where 欄位名 [not] between 值1 and 值2 ;

說明:在上面的語法格式中,“值1”表示範圍條件的起始值,“值2”表示範圍條件的結束值。not是可選引數,使用not表示查詢指定範圍之外的記錄,通常情況下,“值1”小於“值2”,否則查詢不到任何結果。

例:查詢student表中id值在2~5之間的學生姓名。

select id, name from student where id between 2 and 5 ;

空值查詢

在資料表中,某些列的值可能為空值(null),空值不同於0,也不同於空字串。在MySQL語句中,使用 is null 關鍵字來判斷欄位的值是否為空值,其語法格式如下

select 欄位名1, 欄位名2, ... 
from 表名
where 欄位名 is [not] null ;

例:查詢student表中gender為空值的記錄。

select id, name, grade, gender from student where gender is null ;

帶distinct關鍵字的查詢

很多表中某些欄位的資料存在重複的值。有時,需要過濾掉查詢記錄中重複的值,可以使用distinct關鍵字來實現這種功能,其語法格式如下

select distinct 欄位名 from 表名 ;

說明:“欄位名”表示要過濾重複記錄的欄位

例:查詢student表中gender欄位的值,查詢記錄不能重複。

select distinct gender from student ;

distinct關鍵字還可以作用於多個欄位,其語法格式如下

select distinct 欄位名1, 欄位名2, ... 
from 表名 ;

說明:只有distinct關鍵字指定的多個欄位值都相同,才會被認作是重複記錄

例:查詢student表中的gender和name欄位,使用distinct關鍵字作用於這兩個欄位。

select distinct gender, name, from student ;

帶like關鍵字的查詢

like關鍵字可以判斷連個字串是否相匹配,其語法格式如下

select 欄位名1, 欄位名2, ... 
from 表名
where 欄位名 [not] like '匹配字串' ;

說明:“匹配字串”指定用來匹配的字串,其值可以是一個普通字串,也可以是包含百分號(%)和下劃線(_)的通配字串。百分號和下劃線統稱為萬用字元。

百分號(%)萬用字元

百分號萬用字元能匹配任意長度的字串,包括空字串。例如,字串“c%”匹配以字元c開始,任意長度的字串,如“ct”、“cut”、“current”等等。

例1:查詢student表中name欄位值以欄位“s”開頭的學生 id。

select id, name, from student where name like "s%" ;

說明1:百分號萬用字元可以出現在通配字串的任意位置

例2:查詢student表中name欄位值以字元“w”開始,以字元“g”結束的學生id。

select id, name, from student where name like 'w%g' ;

說明2:在通配字串中可以出現多個百分號萬用字元

例:查詢student表中name欄位值包含字元“y”的學生id。

select id, name from student where name like '%y%' ;

下劃線(_)萬用字元

下劃線萬用字元與百分號萬用字元有些不同,下劃線萬用字元只匹配單個字元。若要匹配多個字元,需要使用多個下劃線萬用字元。

注意:若使用多個下劃線匹配多個連續的字元,下劃線之間不能有空格

例1:查詢student表中name欄位值以字串“wu”開始,以字串“ong”結束,並且兩個字串之間只有一個字元的記錄。

select * from student where name like "wu_ong" ;

例2:查詢student表中name欄位值包含7個字元,並且以字串“ing”結束的記錄。

select * from student where name like '____ing' ;

百分號和下劃線萬用字元進行的查詢操作

注意:若要匹配字串中的百分號和下劃線,則使用右斜線(“\”)對百分號和下劃線進行轉義

例:查詢student表中name欄位值包括“%”的記錄。
假設student表中以存在如下記錄

insert into student(name, grade, gender) 
values('sun%er', 95, '男') ;

帶and關鍵字的多條件查詢

在使用select語句中,有時為了使查詢結果更加精確,可以使用多個查詢條件,其語法格式如下

select 欄位名1, 欄位名2, ... 
from 表名
where 條件表示式1 and 條件表示式2 [... and 條件表示式n] ;

例:查詢student表中id欄位值小於5,並且gender欄位值為“女”的學生姓名。

select id, name, gender from student where id < 5 and gender = '女' ;

帶or關鍵字的多條件查詢

在使用or關鍵字時,只要記錄滿足任意一個條件就會被查詢出來,其語法格式如下

select 欄位名1, 欄位名2, ... 
from 表名
where 條件表示式1 or 條件表示式2 [... or 條件表示式n] ;

例:查詢student表中id欄位值小於3或者gender欄位值為“女”的學生姓名。

select id, name,gender from student where id < 3 or gender = '女' ;

or和and關鍵字一起使用的情況

注意:and的優先順序高於or

例:查詢student表中gender欄位值為“女”或者gender欄位值為“男”,並且grade欄位值為100的學生姓名。

select name, grade, gender 
from student
where gender = '女' or gender = '男' and grade = 100 ;

高階查詢

聚合函式

實際開發中,經常需要對某些資料進行統計,例如統計某個欄位的最大值、最小值、平均值等。

函式名稱 作用 函式名稱 作用
count() 返回某列的行數 max() 返回某列的最大值
sum() 返回某列值的和 min() 返回某列的最小值
avg() 返回某列的平均值


以上表中的函式對一組值進行統計,並返回唯一值,這些函式被稱為聚合函式。

count()函式

count()函式用來統計記錄的條數,其語法格式如下

select count (*) from 表名 ;

例:查詢student表中一共有多少條記錄

select count(*) from student ;

sum()函式

sum()函式是求和函式,用於求出表中某個欄位所有值的總和,其語法格式如下

select sum(欄位名) from 表名 ;

例:求出student表中grade欄位的總和。

select sum(grade) from student ;

avg()函式

avg()函式用於求出某個欄位所有值的平均值,其語法格式如下

select avg(欄位名) from 表名 ;

例:求出student表中grade欄位的平均值

select avg(grade) from student ;

max()函式

max()函式是求最大值的函式,用於求出某個欄位的最大值,其語法格式如下

select max(欄位名) from 表名 ;

例:求出student表中grade欄位的最大值

select max(grade) from student ;

min()函式

min()函式是求最小值的函式,用於求出某個欄位的最小值,其語法格式如下

select min(欄位名) from 表名 ;

例:求出student表中grade欄位的最小值

select min(grade) from student ;

對查詢結果排序

使用 order by 對查詢結果進行排序,其語法格式如下

select 欄位名1, 欄位名2, ... 
from 表名
order by 欄位名1[asc|desc], 欄位名2 [asc|desc] ...

說明:引數 asc 表示按照升序進行排序,desc表示按照降序進行排序。預設情況下,按照 asc 方式進行排序。

例:查出 student 表中的所有記錄,並使用引數 asc 按照grade欄位升序方式進行排列。

select * from student 
order by grade asc ;

注意:在按照指定欄位進行排序時,若某條記錄的欄位值為null,則這條記錄會在第一條顯示,因為 null 值可以被認為是最小值

分組查詢

使用 group by 按某個欄位或者多個欄位中的值進行分組,欄位中值相同的為一組,其語法格式如下

select 欄位名1, 欄位名2, ... 
from 表名
group by 欄位名1, 欄位名2, ... [having 條件表示式]

說明:having關鍵字指定條件表示式對分組後的內容進行過濾,需要注意的是,group by 一般和聚合函式一起使用。

由於分組查詢比較複雜,下面分幾種情況對分組查詢進行詳解。

單獨使用 group by 分組

單獨使用 group by 關鍵字,查詢的是每個分組中的一條記錄。

例:查詢student表中的記錄,按照gender欄位值進行分組。

select * from student group by gender ;

group by 和聚合函式一起使用

group by 和聚合函式一起使用,可以統計出某個或者某些欄位在一個分組中的最大值、最小值、平均值等。
例:將student表按照gender欄位值進行分組查詢,計算出每個分組中各有多少名學生。

select count(*), gender from student group by gender ;

結果說明:group by 對student表按照gender欄位中的不同值進行了分組,並通過count()函式統計出每個組個數。

group by 和 having關鍵字一起使用

例:將student表按照gender欄位進行分組查詢,查詢出grade欄位值之和小於300的分組。

select sum(grade), gender from student group by gender having sum(grade) < 300 ;

having 關鍵字和where關鍵字的異同點

相同點:都用於設定條件表示式對查詢結果進行過濾

不同點:

having關鍵字:

having關鍵字後可以跟聚合函式,通常情況下,having關鍵字都和group by 一起使用,用於對分組後的結果進行過濾。

where關鍵字:

where關鍵字不能後跟聚合函式。

使用 limit 限制查詢結果的數量

limit關鍵字可以指定查詢結果從哪一條記錄開始以及一共查詢多少條資訊,其語法格式如下

select 欄位名1, 欄位名2, ... 
from 表名
limit [offset,]記錄數

說明:limit 後面可以跟兩個引數,第一個引數“offset”表示偏移量,若偏移量為0,則從查詢結果的第一條記錄開始;偏移量為1,則從查詢結果中的第二條記錄開始,以此類推。offset為可選值,若不指定,其預設值為0。第二個引數“記錄數”表示返回查詢記錄的條數。

例1:查詢student表中的前4條記錄。

select * from student limit 4 ;

例2:查詢student表中grade欄位值從第5位到第8位的學生(從高到底)。

select * from student order by grade desc limit 4, 4 ;

為表和欄位取別名

為表取別名的語法格式如下

select * from 表名 [as] 別名 ;

例:為student表起一個別名 s,並查詢student表中gender欄位值為“女”的記錄。

select * from student as s where s.gender = '女' ;

為欄位取別名的語法格式如下

select 欄位名 [as] 別名 [, 欄位名 [as] 別名, ...] from 表名 ;

例:查詢student表中的所有記錄的name和gender欄位值,併為這兩個欄位起別名 stu_name 和 stu_gender。

select name as stu_name, gender stu_gender from student ;