Mysql之SQL使用
阿新 • • 發佈:2018-07-24
修改列 modify student 多表 描述 組織 sign 應用 ner 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
Mysql之SQL使用