1. 程式人生 > >(MY)SQL基本語句

(MY)SQL基本語句


簡介:

SQL是Structure Query Language的縮寫,是使用關係模式的資料庫應用語言。面對一個陌生的資料庫時,通常需要一種方式與它進行互動來完成使用者所需要的各個工作,這時候就得用到SQL語言。

SQL使用入門:
SQL主要劃分為以下三種類別:
1. DDL(Data definition Language),資料定義語句,這些語句定義了不同資料段,資料庫,表,列,索引等資料庫物件。
2. DML(Date Manipulation Language), 資料操作語句,用於新增,刪除,更新和查詢資料庫記錄,並檢查資料完整性。
3. DCL(Date Control Language), 資料控制語句,用於控制不同資料段直接的許可和訪問級別的語句。這些語句定義了資料庫,表,欄位,使用者訪問許可權和安全級別。

一. DDL語句

簡單來說,DDL語句就是對資料庫內部的物件進行建立,刪除,修改等操作語言。和DML最大的區別在於DML只是對錶內部進行資料操作,而不涉及表的定義,結構的修改,更不會涉及其他物件。DDL主要更多的由資料庫管理員使用,開發人員用的比較少。

show databases;/*顯示所有資料庫*/

create database database_name;/*建立一個新的資料庫*/

drop database database_name;/*刪除一個數據庫*/

use database_name;/*使用某個資料庫*/

show tables;/*顯示這個資料庫中的所有表*/

/*建立一張表*/
create table table_name(
column_name_1 column_type_1 constraints,
column_name_2 column_type_2 constraints,
...
column_name_n column_type_n constraints,
);
/*例子*/
create table student(
  Sno varchar(9) not null primary key comment '學生學號',
  Sname varchar(8) not null comment '學生姓名',
  Ssex char(2) not null comment '學生性別',
  Sdate date not null comment '學生入學日期',
  Spoint double(3,1) comment '學生績點'
);  

desc table_name;/*檢視這個表的結構*/

show create table table_name;/*顯示建立表的SQL語句*/

drop table table_name;/*刪除一張表*/

/*下面的[]表示可選*/
/*修改表型別*/
alter table table_name modify [column] column_difinition[first|after col_name];
/*例子*/
alter table student modify Sno char(12);

/*增加表字段*/
alter table table_name add [column] column_difinition[first|after col_name];
/*例子*/
 alter table student add Shome varchar(2) not null;

/*刪除表字段*/
alter table table_name drop [column] col_name;
/*例子*/
 alter table student drop Shome;

/*欄位改名*/
alter table table_name change [column] old_name column_definition [first|after col_name]
/*例子*/
 alter table student change Spoint Sdegree double(3,1);
/*##change 和 modify都可以修改表的定義,不同的是change後面需要寫兩次列名,相當於把自己改一下,但是名字不變,型別改變*/

/*修改欄位排列順序*/
/*[first|after col_name]用來修飾字段在表中位置,其中add,modify,change都有這個功能,不過add增加到欄位預設新增到標的最後,而其餘兩個預設不變位置*/
/*例子1:增加欄位Sbirth到Sdate後面*/
alter table student add Sbirth date after Sdate;
/*例子二:把Sname修改到Sno前面*/
alter table student modify Sno char(12) after Sname;

/*更改表明*/
alter table table_name rename [to] new_table_name;
/*例子*/ 
alter table student rename to students;

二.DML語句

DML操作是指對資料庫中表記錄的操作,主要包括記錄的插入(insert),更新(update),刪除(delete)和查詢(select),是開發人員日常使用最頻繁的操作。

1.插入記錄
基本語法:

insert into table_name(field1,field2,...fieldn) values(value1,value2,...valuen);
/*或者*/
insert into table_name value(value1,value2,...valuen);
/*只要value和列表一一對應就行了*/
/*例子*/
insert into students value('1','桐人','男','2017-10-21')('2','櫻木','男','2017-10-22'),('3','一戶','男','2017-10-21'),('4','井上','女','2017-10-22');

含可空欄位,非空但是含有預設值的欄位,自增欄位,可以不在insert後的欄位列表裡出現,values後面只要寫對應欄位名稱的value。其餘沒寫的自動設定為NULL,預設值,自增的下一個數字。

insert into students (Sno,Ssex,Sdate) value('6','男','2017-10-21')

2.更新記錄
基本語法:

update table_name set field1=value1,field2=value2,...fieldn=valuen where condition
/*例子*/
update students set Sdate='2017-10-23' where Sname='井上';

自然也能使多張表同時改變:

update table_name1,table_name2 set (...內容..) where (..條件..);

3.記錄欄位
基本語法:

delete from table_name where condition
/*例子*/
delete from students where Sno='4';
/*也可以多張表的欄位*/
delete t1,t2,..tn from table_name1 t1,table_name t2,table_namen tn where condition(條件)

不加where欄位會把整張表刪掉

4.查詢記錄

資料插入到資料庫中後,就可以用select命令進行各種各樣的查詢,使輸出的結果符合使用者的要求,聽說select語法很複雜。。

select * from table_name[where condition];
/* *表示將所有的記錄都選出來,也可以用逗號分割的所有欄位來表示,*的好處是當所需是所有欄位時,語句很方便,但只是一部分時,就必須得用欄位一一列出來 */

(1). 查詢不重複的記錄
當需要將表中的記錄去掉重複後顯示出來,可以用distinct關鍵字來實現

select distinct field from table_name;
/*例子*/
select distinct Sdate from students;

(2). 條件查詢
有時候並不需要全部查詢,而是需要根據限定條件來查詢一部分資料

/*例子:查詢所有日期為2017-10-21號的*/
select * from students where Sdate='2017-10-21';

where後面的條件除了’=’外,還可以使用>,<,>=,<=,!=等較多運算子;多個條件之間還可以使用 or,and等邏輯運算子進行多條件聯合查詢。

/*例子:查詢所有日期為2017-10-21號並且Sno在前2的*/
select * from students where Sdate='2017-10-21' and Sno <= 2;

為了後面更好的舉例,重新定義兩張表:
sql

create table employee(/*職工表*/
  No int(4) not null primary key ,
  Name varchar(8) not null ,
  Salary int(6) not null,
  Date_In  date not null
);
insert into employee value(1,'Mike',5000,'2017-10-21'),
                      (2,'Ross',4000,'2017-10-24'),
                      (3,'Green',6000,'2017-10-23'),
                      (4,'Hellon',3000,'2017-10-22'),
                      (5,'Jan',5000,'2017-10-23');


create table department(/*部門表*/
    No int(4) not null primary key ,
    Dno int(4) not null ,
    Name varchar(8) not null ,
    Dname varchar(8) not null 
);

insert into department value(1,1,'Mike','sale'),
                      (2,2,'Ross','product'),
                      (3,1,'Green','sale'),
                      (4,3,'Hellon','logistics'),
                      (5,2,'Jan','product');
alter table department add  foreign key(`No`) references employee(`No`);//最好新增一下外來鍵

(3). 排序和限制
有時需要取出某個欄位排序後的記錄結果集,可以用關鍵字 ORDER BY 來實現
語法:

select * from table_name [where condition] order by field [desc/asc];
/*例子*/
select * from employee order by salary;

desc表示降序,asc表示升序,如果不寫預設asc。
而且order by 後面可跟多個欄位,優先順序從左向右,比如:

 select * from employee order by salary,No;

表示先排列salary,然後再把相同salary不同No的進行升序排列。

有時排列後我們只需要取出資料的一部分時我們就可以使用關鍵字LIMIT。
語法:

select ... [limit off_start,row_count];/*off_start表示起始偏移量,row_count表示行數*/
/*例子*/
 select * from employee order by salary desc limit 1,3;
/*這表示把把薪水降序排列後取出從第二個開始的3行。#和陣列一樣,從0開始標記*/

(4). 聚合
有時使用者需要進行一些彙總操作,比如統計公司的人數或者統計每個部門的人數,這時就需要用到聚合操作。
語法:

select [field1,field2,...fielfn] fun_name from table_name [where where_contition] [group by field1,field2,...fielfn] [with rollup] [having where contition];

fun_name: 表示要做的聚合操作,也就是說聚合函式,常用的有 :sum(求和) ,count(記錄數), max(最大值), min(最小值)。
group by: 關鍵字表示要進行分類聚合的欄位,比如說日期,那就寫在group by後面
with rollup是可選語法: 表明是否對分類聚合後的結果進行再彙總。
having: 表示對分類後的結果再進行條件的過濾。
having和where的區別在於,having是對聚合後的結果進行條件的過濾,而where是在聚合前就對記錄進行過濾,如果邏輯允許,那就儘可能使用where線過濾記錄,因為這樣條件會先減小,對聚合的效率大大調高,然後再根據邏輯情況看是否還需用having進行過濾。

 /*統計日期並彙總*/
 select Date_In,count(*) from employee group by Date_In with rollup;
 /*統計薪水並過濾出薪水相同人數大於1的*/
 select salary,count(1) from employee group by salary having count(1)>1;
 /*統計薪水並過濾出薪水大於4000的*/
 select salary,count(1) from employee group by salary having salary>4000;

(5). 表連線
當需要顯示多張表的欄位時,就可以用表連線的用來實現這樣的功能。從大類上分,表連線分為: 內連線 和 外連結,最大的區別就是內連線僅選出兩張表中互相匹配的記錄,而外連結會選出其他不匹配的記錄。最常用的還是內連線。

/*例子:把employee表和department表通過NO相同來連線起來*/
/*只不過不能直接select No,Name...因為兩張表都有這個列,所以得制定那張表,否則報出模稜兩可錯誤*/
 select employee.No,employee.Name,Salary,Date_In,Dno,Dname from employee,department where employee.No=department.No;;

外連結又分為左連結和右連結,具體定義:

左連結: 包含所有的左邊表中的記錄甚至是右邊表中沒有和它匹配的記錄;
右連結: 包含所有的右邊表中的記錄甚至是左邊表中沒有和它匹配的記錄;

/*例子*/
select employee.No,employee.Name,Salary,Date_In,Dno,Dname from employee left join department on employee.No=department.No;

這和where那句的不同之處在於where連結只能把全部對應的都連線了起來,但是不合法的就不能連結,而左右連結也能連線不合法的部分。

(6). 子查詢
有些查詢的時候,需要的條件是另一個select語句的結果,這個時候就需要子查詢。用於子查詢的關鍵字主要包括 in ,not in,=,!=,exists,not exists.

/*例子:從employee表中查詢所有編號在department表中的記錄*/
 select * from employee where No in(select No from department);
 /*例子如果記錄數唯一,還可以使用=代替in*/
select * from employee where No =(select No from department);
select * from employee where No =(select No from department limit 1);

(7). 記錄聯合
當我們碰到要將兩張表按照一定的查詢條件查詢出來後,獎結果合併到一起顯示出來,這時候需要用union和union all 關鍵字來實現這樣的功能。
語法:

select * from t1 
union/union all
select * from t2
...
union/union all
select * from tn;

union表示不重複顯示,union all表示全部顯示。

DCL語句

DCL語句主要是DBA用來管理系統中物件限制使用,一般開發人員很少使用。可能會用到建立資料庫使用者後,對他進行設定對錶的操作許可權。

參考書籍:深入淺出mysql
     mysql必知必會