Mysql之SQL語句、約束

Mysql之SQL使用

簡介
什麼是 SQL?
SQL 指結構化查詢語言
SQL 使我們有能力訪問數據庫
SQL 是一種 ANSI 的標準計算機語言
備註:ANSI,美國國家標準化組織

一、SQL語句、語法

1、查:SELECT 語句用於從表中選取數據。結果被存儲在一個結果表中(稱爲結果集)。
sql select 語法
select 列 from table_name;
select * from table_name;

2、插:INSERT INTO 語句用於向表格中插入新的行。
sql insert 語法
insert into table_name values (值1,值2,...);
insert into table_name (列1,列2,...) values (值1,值2,...);

3、改:Update 語句用於修改表中的數據。
sql update 語法
update table_name set 列1 = 新值 where 列2 = 某值  # 列2指定誰修改,列1指定修改的內容

4、刪:DELETE 語句用於刪除表中的行。
sql delete 語法
delete from table_name where 列 = 值;     # 刪除某一行
delete from table_name; 或 delete * from table_name;     #刪除所有行(表的結構、屬性和索引都是完整的)

sql truncate table 語法
truncate table table_name;      # 與delete一樣刪除表中所有行,效率更快

5、top:TOP 子句用於規定要返回的記錄的數目。
列(s) = *
sql top 語法
select top number|precent 列(s) from table_name;     # 列(s) 表示 所有的列名稱 
top number例:select top 2 * from table_name; 或 select * from table_name limit 2;
top precent例:select top 50 precent * from table_name; # 選取表中50%的記錄

6、like:LIKE 操作符用於在 WHERE 子句中搜索列中的指定模式
sql like 語法
select 列(s) from table_name where 列 like pattern;
例:select * from table_name where 列 like 'A%'(在表中搜尋以A開頭的)|'%B'(以B結尾的)|'%AB%'(包含AB的);

7、in:IN 操作符允許我們在 WHERE 子句中規定多個值
sql in 語法
select * from table_name where 列 in(值1,值2,...);

8、between:操作符 BETWEEN ... AND 會選取介於兩個值之間的數據範圍。這些值可以是數值、文本或者日期。
sql between 語法
select * from table_name where 列 between 值1 and 值2;  # 範圍取頭不取尾

9、alias:爲列名稱和表名稱指定別名(Alias)。
sql alias 語法
表:select * from table_name as alias_name;
表別名例:select p.列1,p.列2,p.列3 from table_name1 as p,table_name2 as po where p.列1='值1' and p.列2='值2';
列:select 列 as alias_name from table_name;
列別名例:select 列1 as alias_name1,列2 as alias_name2 from table_name;

10、join:用於根據兩個或多個表中的列之間的關係,從這些表中查詢數據。
sql join 語法
select tb1.列1,tb1.列2,tb2.列 from tb1 inner join tb2 on tb1.列3=tb2.列3 order by tb1.列1;
或
select tb1.列1,tb1.列2,tb2.列 from tb1,tb2 where tb1.列3=tb2.列3;
備註:不同的 SQL JOIN
除了在上面的例子中使用的 INNER JOIN(內連接),還可以使用其他幾種連接。
下面列出了可以使用的 JOIN 類型,以及它們之間的差異。
JOIN: 如果表中有至少一個匹配,則返回行
LEFT JOIN: 即使右表中沒有匹配,也從左表返回所有的行
RIGHT JOIN: 即使左表中沒有匹配,也從右表返回所有的行
FULL JOIN: 只要其中一個表中存在匹配,就返回行

inner join 關鍵字語法:在表中存在至少一個匹配時,INNER JOIN 關鍵字返回行。
select * from tb1 inner join tb2 on tb1.列=tb2.列;        # inner join 與join是相同的

left join 關鍵字語法:LEFT JOIN 關鍵字會從左表(tb1)那裏返回所有的行,即使在右表(tb2)中沒有匹配的行。
select * from tb1 left join tb2 on tb1.列=tb2.列;

right join 關鍵字語法:RIGHT JOIN 關鍵字會右表(tb2)那裏返回所有的行,即使在左表(tb1)中沒有匹配的行。
select * from tb1 right join tb2 on tb1.列=tb2.列;

full join 關鍵字語法:只要其中某個表存在匹配,FULL JOIN 關鍵字就會返回行
select * from tb1 full join tb2 on tb1.列=tb2.列;

11、union:用於合併兩個或多個 SELECT 語句的結果集(UNION 內部的 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的數據類型。同時,每條 SELECT 語句中的列的順序必須相同)
sql union 與 union all 語法
select * from table_name1 union select * from table_name2;
select * from table_name1 union all select * from table_name2;
備註:默認地,union 選取不同的值,如果允許重複的值,就使用 union all(列出所有的值)

12、select into:從一個表中選取數據,然後把數據插入另一個表中。常用於創建表的備份復件或者用於對記錄進行存檔。
sql select into 語法
select * into new_table_name [in externaldatabase] from old_table_name; # 所有列插入新表
select 列 into new_table_name [in externaldatabase] from old_table_name;  # 某一列插入新表
例:備份某張表  select * into tb1_backup from tb1;
向另一個數據庫中拷貝表  select * into tb1 in 'backup.mdb' from tb1;
多表查詢存入到新表   select tb1.列1,tb2.列2 into new_table_name from tb1 inner join tb2 on tb1.列3=tb2.列3;

13、create database:用於創建數據庫
sql create database 語法
create database database_name;

14、create table:用於創建數據庫中的表
sql create table 語法
create table table_name(列1 數據類型,列2 數據類型,...)
備註:常用數據類型有 int(size)-整數、decimal(size,d)-帶小數數字、char(size)-固定長度字符串、varchar(size)-可變長字符串
數據類型後續會繼續補充

15、create index:用於在表中創建索引。在不讀取整個表的情況下,索引使數據庫應用程序可以更快地查找數據。
註釋:更新一個包含索引的表需要比更新一個沒有索引的表更多的時間,這是由於索引本身也需要更新。因此,理想的做法是僅僅在常常被搜索的列(以及表)上面創建索引。
sql create index 語法
create index index_name on table_name(列);   # 簡單的索引,允許使用重複的值
create index index_name on table_name(列1 desc,列2);      # 默認是升序,希望降序在列名稱後添加保留字 desc,索引不止一個列可以逗號隔開

sql create unique index 語法      # 唯一的索引
create unique index index_name on table_name(列);    # 唯一的索引意味着兩個行不能擁有相同的索引值

16、DROP:刪除索引、表以及數據庫
sql drop 語法
刪除索引:drop index index_name on table_name;
刪除表:drop table table_name;
刪除庫:drop database database_name;

17、alter table : 語句用於在已有的表中添加、修改或刪除列。
sql alter table 語法
添加列:alter table table_name add 列 數據類型;
刪除列:alter table table_name drop column 列;
改變列中數據類型:alter table table_name modify column 列 需要修改的類型;
只修改列的數據類型的方法:
通常可以寫成 alter table 表名 modify column 列名 新的列的類型
例如:student表中列sname的類型是char(20),現在要修改爲varchar(20),SQL語句如下
     alter table student modify column sname varchar(20);
同時修改列名和列的數據類型的方法:
通常可以寫成 alter table 表名 change column 舊列名 新列名 新的列類型
例如:student表中列sname的類型是char(20),現在要修改爲stuname varchar(20),SQL語句如下
     alter table student change column sname stuname varchar(20);

alter table table_name add <新列名> <數據類型> [約束條件][FLRST(添加列到表的最前面)|AFTER(指定列後面)  <已存在的列>]; # 添加列
alter table table_name <舊列名> <新列名> <新數據類型>; # 修改列名
alter table table_name modify <列名> <數據類型>; # 修改列的數據類型
alter table table_name modify <列1(想要改變的列)> <數據類型> FLRST|AFTER <列2>; # 修改列的位置
alter table table_name drop <列>;  # 刪除列
alter table <舊錶名> rename to <新表名>; # 修改表名

18、auto increment:會在新記錄插入表中時生成一個唯一的數字
通常希望在每次插入新記錄時,自動地創建主鍵字段的值。可以在表中創建一個 auto-increment 字段。
sql auto-increment 語法
create table table_name(id int not null auto_increment,name varchar(255) not null,PRIMARY key(id)); #id定義爲auto_increment主鍵

19、view(視圖): 視圖是可視化的表。視圖包含行和列,就像一個真實的表
註釋:數據庫的設計和結構不會受到視圖中的函數、where 或 join 語句的影響。

sql create view 語法
create view view_name as select 列(s) from table_name where 條件;
註釋:視圖總是顯示最近的數據。每當用戶查詢視圖時,數據庫引擎通過使用 SQL 語句來重建數據。

更新視圖:create or replace view view_name as select 列(*) from table_name where 條件;
刪除視圖:drop view view_name;

二、SQL 約束(constraints)

sql約束:約束用於限制加入表的數據的類型。是一種限制,它通過對錶的行或列的數據做出限制,來確保表數據的完整性、唯一性
可以在創建表時規定約束(通過 CREATE TABLE 語句),或者在表創建之後也可以(通過 ALTER TABLE 語句)。

1、not null 約束:強制列不接受 NULL 值,強制字段始終包含值。這意味着,如果不向字段添加值,就無法插入新記錄或者更新記錄。
例:create table table_name(id int not null,name varchar(255) not null); # 強制id和name不能爲空

2、unique 約束:唯一標識數據庫表中的每條記錄,確保表中的一列數據沒有相同的值
UNIQUE 和 PRIMARY KEY 約束均爲列或列集合提供了唯一性的保證。
PRIMARY KEY 擁有自動定義的 UNIQUE 約束。
每個表可以有多個 UNIQUE 約束,但是每個表只能有一個 PRIMARY KEY 約束
例:create table時在id列創建unique約束
create table table_name(id int not null,name varchar(255) not null, unique (id));
例2:爲多個列定義unique
create table table_name(id int not null,name varchar(255) not null, constraint uc_personID unique (id,name))
例3:表已創建情況下,創建unique約束
alter table table_name add unique(id);
多個:alter table table_name add constraint uc_personid unique(id,name);
例4:撤銷unique
alter table table_name drop index uc_personid;

3、PRIMARY KEY 約束:PRIMARY KEY 約束唯一標識數據庫表中的每條記錄。
主鍵必須包含唯一的值。
主鍵列不能包含 NULL 值。
每個表都應該有一個主鍵,並且每個表只能有一個主鍵。 primary key = unique +  not null 
例:create table時在id列創建PRIMARY KEY約束
create table table_name(id int not null,name varchar(255) not null, PRIMARY KEY(id));
例2:爲多個列定義PRIMARY KEY
create table table_name(id int not null,name varchar(255) not null, constraint pk_personID PRIMARY KEY (id,name))
例3:表已創建情況下,創建PRIMARY KEY約束
alter table table_name add PRIMARY KEY(id);
多個:alter table table_name add constraint pk_personid PRIMARY KEY(id,name);
例4:撤銷PRIMARY KEY
alter table table_name drop index uc_personid;

4、FOREIGN KEY 約束:一個表中的 FOREIGN KEY 指向另一個表中的 PRIMARY KEY
外鍵
外鍵用來在兩個表數據之間建立鏈接,它可以是一列或多列。一個表可以有一個或多個外鍵
外鍵對應得是參照完整性,一個表得外鍵可以爲空值,若不爲空值,則每一個外鍵值必須等於另一個表中主鍵得某個值。
FOREIGN KEY 約束用於預防破壞表之間連接的動作。
FOREIGN KEY 約束也能防止非法數據插入外鍵列,因爲它必須是它指向的那個表中的值之一。
例:create table時在id列創建 FOREIGN KEY 約束
create table table_name1(id int not null,name varchar(255) not null,Id_P int, PRIMARY KEY(id),FOREIGN KEY (Id_P) REFERENCES table_name2(Id_P));
例2:爲多個列定義 FOREIGN KEY 
create table table_name1(id int not null,name varchar(255) not null,Id_P int, PRIMARY KEY(id) constraint fk_pertb2 FOREIGN KEY (Id_P)
REFERENCES table_name2(Id_P) )
例3:表已創建情況下,創建 FOREIGN KEY 約束
alter table table_name add ADD FOREIGN KEY (Id_P) REFERENCES table_name1(Id_P);
多個:alter table table_name add constraint pk_personid PRIMARY KEY(id,name);
例4:撤銷 FOREIGN KEY 
alter table table_name drop FOREIGN KEY fk_pertb2;

外鍵約束
mysql> create table bookcategory(
    -> category_id int primary key,
    -> category varchar(20),
    -> parent_id int);
mysql> create table bookinfo(
    -> book_id int primary key,
    -> book_category_id int,
    -> constraint fk_cid foreign key(book_category_id) references bookcategory(category_id));

5、CHECK 約束:用於限制列中的值的範圍
如果對單個列定義 CHECK 約束,那麼該列只允許特定的值。
如果對一個表定義 CHECK 約束,那麼此約束會在特定的列中對值進行限制。
例:create table時在id列創建 CHECK 約束
create table table_name(id int not null,name varchar(255) not null,CHECK(id>0));
例2:爲多個列定義 CHECK 約束
create table table_name(id int not null,name varchar(255) not null, constraint chk_tbname CHECK(id>0 and name='xxx'));
例3:表已創建情況下,創建 CHECK 約束
alter table table_name ADD constraint chk_tbname CHECK (Id_P>0 AND name='xxx'); 
例4:撤銷 CHECK
alter table table_name drop constraint chk_tbname;

6、DEFAULT 約束:用於向列中插入默認值
如果沒有規定其他的值,那麼會將默認值添加到所有的新記錄。
例:create table時在id列創建 DEFAULT 約束,類似 GETDATE() 這樣的函數,DEFAULT 約束也可以用於插入系統值
create table table_name(id int not null,name varchar(255) not null DEFAULT 'lxq',timedate date DEFAULT GETDATE());
例2:表已創建情況下,創建 DEFAULT 約束
alter table table_name alter name set DEFAULT 'lxq2';
例3:撤銷 DEFAULT
alter table table_name ALTER name DROP DEFAULT;

三、sql函數

1、date

函數及描述
NOW():返回當前的日期和時間
CURDATE():返回當前的日期
CURTIME():返回當前的時間
DATE():提取日期或日期/時間表達式的日期部分
EXTRACT():返回日期/時間按的單獨部分
DATE_ADD():給日期添加指定的時間間隔
DATE_SUB():從日期減去指定的時間間隔
DATEDIFF():返回兩個日期之間的天數
DATE_FORMAT():用不同的格式顯示日期/時間

四、數字類型

MySQL中,有三種主要的類型:文本、數字和日期/時間類型
1、Text 類型

CHAR(size):保存固定長度的字符串(可包含字母、數字以及特殊字符)。在括號中指定字符串的長度。最多 255 個字符。

VARCHAR(size):保存可變長度的字符串(可包含字母、數字以及特殊字符)。在括號中指定字符串的最大長度。最多 255 個字符。
註釋:如果值的長度大於 255,則被轉換爲 TEXT 類型。

TINYTEXT:存放最大長度爲 255 個字符的字符串。

TEXT:存放最大長度爲 65,535 個字符的字符串。

BLOB:用於 BLOBs (Binary Large OBjects)。存放最多 65,535 字節的數據。

MEDIUMTEXT:存放最大長度爲 16,777,215 個字符的字符串。

MEDIUMBLOB:用於 BLOBs (Binary Large OBjects)。存放最多 16,777,215 字節的數據。

LONGTEXT:存放最大長度爲 4,294,967,295 個字符的字符串。

LONGBLOB:用於 BLOBs (Binary Large OBjects)。存放最多 4,294,967,295 字節的數據。

ENUM(x,y,z,etc.):允許你輸入可能值的列表。可以在 ENUM 列表中列出最大 65535 個值。如果列表中不存在插入的值,則插入空值。
註釋:這些值是按照你輸入的順序存儲的。
可以按照此格式輸入可能的值:ENUM('X','Y','Z')

SET:與 ENUM 類似,SET 最多隻能包含 64 個列表項,不過 SET 可存儲一個以上的值。

2、Number 類型

TINYINT(size):-128 到 127 常規。0 到 255 無符號*。在括號中規定最大位數。

SMALLINT(size):-32768 到 32767 常規。0 到 65535 無符號*。在括號中規定最大位數。

MEDIUMINT(size):-8388608 到 8388607 普通。0 to 16777215 無符號*。在括號中規定最大位數。

INT(size):-2147483648 到 2147483647 常規。0 到 4294967295 無符號*。在括號中規定最大位數。

BIGINT(size):-9223372036854775808 到 9223372036854775807 常規。0 到 18446744073709551615 無符號*。在括號中規定最大位數。

FLOAT(size,d):帶有浮動小數點的小數字。在括號中規定最大位數。在 d 參數中規定小數點右側的最大位數。

DOUBLE(size,d):帶有浮動小數點的大數字。在括號中規定最大位數。在 d 參數中規定小數點右側的最大位數。

DECIMAL(size,d):作爲字符串存儲的 DOUBLE 類型,允許固定的小數點。
重點:這些整數類型擁有額外的選項 UNSIGNED。通常,整數可以是負數或正數。如果添加 UNSIGNED 屬性,那麼範圍將從 0 開始,而不是某個負數。

3、Date 類型

DATE():日期。格式:YYYY-MM-DD
註釋:支持的範圍是從 '1000-01-01' 到 '9999-12-31'

DATETIME():*日期和時間的組合。格式:YYYY-MM-DD HH:MM:SS
註釋:支持的範圍是從 '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59'

TIMESTAMP():*時間戳。TIMESTAMP 值使用 Unix 紀元('1970-01-01 00:00:00' UTC) 至今的描述來存儲。格式:YYYY-MM-DD HH:MM:SS
註釋:支持的範圍是從 '1970-01-01 00:00:01' UTC 到 '2038-01-09 03:14:07' UTC

TIME():時間。格式:HH:MM:SS 註釋:支持的範圍是從 '-838:59:59' 到 '838:59:59'
YEAR():2 位或 4 位格式的年。
註釋:4 位格式所允許的值:1901 到 2155。2 位格式所允許的值:70 到 69,表示從 1970 到 2069。

重點:即便 DATETIME 和 TIMESTAMP 返回相同的格式,它們的工作方式很不同。在 INSERT 或 UPDATE 查詢中,
TIMESTAMP 自動把自身設置爲當前的日期和時間。TIMESTAMP 也接受不同的格式,比如 YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD 或 YYMMDD
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章