1. 程式人生 > >資料庫基本_SQL語句大全

資料庫基本_SQL語句大全

CREATE USER user_name1 IDENTIFIED BY ‘password’,
 user_name2 IDENTIFIED  BY ‘password’;
一次可以建立多個數據庫使用者
■刪除資料庫使用者:
DROP USER user_name;
■選擇使用者:
select user();
■使用者的許可權控制:
GRANT庫,表級的許可權控制:將某個庫中的某個表的控制權限賦予某個使用者
GRANT ALL ON db_name.table_name TO  uer_name [indentified by ‘password’];
■檢視所有的字元編碼:
SHOW CHARACTER SET;  
==============================================================================
■登入MySQL資料庫: 在DOS命令列登入MYSQL控制檯
mysql -u user_name -p(Enter,回車鍵入密碼,若直接輸入則為可顯)
Enter password:*********
Mysql –h hostname –u user_name –p
Enter password:*********
例:mysql –h 192.168.5.105 –uroot –p
Enter password:*******
■檢視執行環境資訊:
進入MYSQL命令列工具後 , 使用status;或\s 檢視執行環境資訊
■建立資料庫:
create database db_name;
[default]CHARACTER SET charset_name        //設定資料庫的編碼發方式
[default]COLLATE collation_name ;          //設定按collation_name欄位排序
//不能寫成utf-8,utf8的預設校對為utf8_general_ci(通過show character set檢視)
CREATE DATABASE db_name CHARACTER SET utf8 COLLATE  utf8_general_ci; 
CHARACTER SET:指定資料庫採用的字符集
COLLATE:指定資料庫字符集的比較方式
■使用資料庫:
use db_name;           
■顯示資料庫:
SHOW DATABASES;
■顯示資料庫建立語句:
SHOW CREATE DATABASE db_name;
■刪除資料庫:
DROP DATABASE  db_name;
刪除時可先判斷是否存在,寫成:DROP DATABASE IF EXISTS db_name;
■檢視建立資料庫的指令並檢視資料庫使用的編碼:
show create databasedb_name;
■檢視資料庫編碼:
showvariables like ‘char%’;
■檢視資料庫當前引擎:
SHOW CREATE TABLE table_name;
■修改資料庫當前引擎:
ALTER TABLE table_name ENGINE=MYISAM| INNODB;( ‘|’表示‘或者’,選其一)
你能用的資料庫引擎取決於mysql在安裝的時候是如何被編譯的。要新增一個新的引擎,就必須重新編譯MYSQL。在預設情況下,MYSQL支援三個引擎:ISAM、MYISAM和HEAP。另外兩種型別INNODB和BERKLEY(BDB),也常常可以使用。
■設定資料庫編碼:
setcharacter_set_client=gbk;//可以存中文
setcharacter_set_results=gbk;//可以看中文
■備份資料庫:
MYSQLDUMP –u使用者名稱(根使用者) –p密碼 db_name >  存放路徑級/檔名(檔案格式:.sql)
(不是在mysql控制檯執行,而要退出控制檯在DOS下執行)
例子:
MYSQLDUMP –u root –p******* mydb > D:/mydb.sql;
■恢復資料庫:
前提:要建立一個空資料庫
SOURCE 存放路徑/檔名.sql (在Mysql控制檯執行)
■如何將大量資料存入資料庫中的表中:
首先,將資料按表的結構(欄位的順序要對應)存入文字文件中;
然後,某欄位若沒有值則填入NULL,注意,每個欄位值之間用Tab鍵隔開(/r/n)。
最後,使用命令:LOAD DATA LOCAL INFILE ‘E:/Test/pet.txt’ INTO TABLE pet  LINES
               TERMINATED BY ‘\r\n’;



Terminate 結束,終止;
■建立表:
1.CREATE TABLE pet (
id int PRIMARY KEY AUTO_INCREMENT ,
name VARCHAR(20) NOT NULL UNIQUE,
owner VARCHAR(20) NOT NULL,
species VARCHAR(20),
sex CHAR(1),
birth DATE ,
);
2.CREATE TABLE table_name(
   field1  datatype,
   field2  datatype,
   ……
)CHARACTER SET 字符集 COLLATE 校對規則;
 field:指定列名    datatype:指定列型別
■顯示錶:
show tables; 
■顯示某個表建立時的全部資訊:
SHOW CREATE TABLE table_name;
■顯示錶的結構資訊:
DESCRIBE table_name;    縮寫形式 : desc table_name;
■查詢資料:
SELECT * FROM table_name;
■顯示錶的各欄位:
DESCRIBE table_name;
■清空表中的資料:
1.TRUNCATE table_name;
此方法會使表中的取號器(ID)從1開始
2.DELETE FROM table_name;
不帶where引數的delete語句可以刪除mysql表中所有內容,使用truncate table也可以清空mysql表中所有內容。效率上truncate比delete快,但truncate刪除後不記錄mysql日誌,不可以恢復資料。
delete的效果有點像將mysql表中所有記錄一條一條刪除到刪完,而truncate相當於保留mysql表的結構,重新建立了這個表,所有的狀態都相當於新表。 
注意:在MySQL中事務的特殊說明:
1.  mysql控制檯是預設自動提交事務(dml).
2.  若在控制檯使用事務,應該做以下設定:
*SETAUTOCOMMIT=FALSE;    //解除自動提交功能
*SAVEPOINT point;         //設定儲存點point
//一系列操作…
*ROLLBACK TOpoint;      //回滾到儲存點
使用TRUNCATE table_name刪除的表不能夠回滾,但刪除速度較快,
使用DELETE FROM table_name刪除的表可以回滾,刪除速度相對較慢。
■建立表:
CREATE TABLE table_name;
■刪除表:
DROP TABLE table_name;     
■插入資料:
1.INSERT INTO table_name [(欄位1,欄位2,欄位3,…)] VALUES (值1,值2,…);
如果向表中的每個欄位都插入一個值,那麼前面[]括號內欄位名可寫也可不寫。
2.INSERT INTO pet  VALUES('Puffball','Diane','hamster','f','1999-03-30',NULL);
3.從 源表 中篩選符合條件的記錄,批量插入到 (指定的)目標表 中:
insert into 目標表(欄位1, 欄位2,...欄位n) select 欄位1, 欄位2,...欄位n from 源表 where 條件
4.向表中插入條資料:
insert into articles (id, content,userid)
values (2,’hahaha’,11),(null,’xixixi’,10),(13,’aiaiai’,1),…;
■刪除資料:
DELETE FROM table_name WHERE id=’10’;
delete語句不能刪除某一列的值,可使用update更新列值。
使用delete語句僅刪除記錄,不刪除表本身,刪除表使用drop table語句。
■更新資料:
UPDATE pet SET birth = '1989-08-31'WHERE name = 'Bowser' ORDER BY birth DESC;
ASC(升序,預設方式);DESC(降序)
WHERE 和 ORDER 語句也可用於查詢select 與 刪除delete
■查詢資料:
1.SELECT * FROM pet WHERE name = 'Bowser';
SELECT * FROM pet WHERE birth > '1998-1-1';
SELECT * FROM pet WHERE species = 'dog' AND sex ='f';
SELECT * FROM pet WHERE species = 'snake' OR species= 'bird';
SELECT * FROM pet WHERE (species = 'cat' AND sex ='m')
          OR(species = 'dog' AND sex = 'f');
SELECT name, birth FROM pet;
SELECT chinese+english+math  FROM Students;    //列之間可以進行運算
2.增加關鍵字DISTINCT檢索出每個唯一的輸出記錄,把相同的記錄值取其中一個即可。
SELECT DISTINCT owner FROM pet; //distinct [dɪ'stɪŋkt] 截然不同的
3.使用一個WHERE子句結合行選擇與列選擇:
SELECT name, species, birth FROM pet
        WHEREspecies = 'dog' OR species = 'cat';
4.為了排序結果,使用ORDER BY子句:
SELECT name, birth FROM pet WHERE species = 'dog' ORDERBY birth;
預設排序是升序,最小的值在第一。要想以降序排序,在你正在排序的列名上增加DESC(降
序)關鍵字:
SELECT name, birth FROM pet ORDER BY birth DESC;
5.可以對多個列進行排序,並且可以按不同的方向對不同的列進行排序:
SELECT name, species, birth FROM pet
ORDER BY species, birth DESC;
注意DESC關鍵字僅適用於在它前面的列名(birth);不影響species列的排列順序。
6.MySQL提供了幾個函式,可以用來計算日期,例如,計算年齡或提取日期部分:
SELECT name, birth, CURDATE(),((YEAR(CURDATE())-YEAR(birth))-(RIGHT(CURDATE(),5)<RIGHT(CURDATE(),5)) AS age FROM pet;
YEAR()提取日期的年部分,RIGHT()提取日期的MM-DD (日曆年)部分的最右面5個字元。比較MM-DD值的表示式部分的值一般為1或0,若birth月份比當前月份大,則年份應減去1。
SELECT name, birth, death FROM pet WHERE death ISNOT NULL ORDER BY birth;
使用deathIS NOT NULL而非death != NULL,因為NULL是特殊的值,不能使用普通比較符來比較。
7.MySQL提供幾個日期部分的提取函式,例如YEAR( )、MONTH( )和DAYOFMONTH()。
SELECT name, birth, MONTH(birth) FROM pet;
SELECT name, birth FROM pet WHEREMONTH(birth) = 5;
概念上,NULL意味著“沒有值”或“未知值”,且它被看作與眾不同的值。不能使用算術比較操作符例如=、<或!=。
請注意在MySQL中,0或NULL意味著假而其它意味著真。布林運算的預設值是1.
8.同表查詢:
SELECTa.id,a.nikename,a.address FROM users a,users b WHERE b.nikename=’haha’
anda.id>b.id;
也可寫成
SELECT id,nikename,addressFROM users WHERE id>(SELECT id FROM users WHERE nikename=’haha’);
補充:在WHERE子句中經常使用的運算子

比較運算子 >、< 、<= 、>= 、= 、<> 大於、小於、大於(小於)等於、不等於 BETWEEN   …AND… 顯示在某一區間的值 IN(set) 顯示在IN列表中的值,例:IN(100,200) LIKE ‘張pattern’ 模糊查詢 IS NULL  判斷是否為空   邏輯運算子 AND 多個條件同時成立 OR 多個條件任一成立 NOT 不成立,例:where not(salary>100); 
注:LIKE語句中,%代表零個或多個任意字元,_代表一個字元,例firstname like ‘_a%’;
9.使用GROUP BY子句對列進行分組:
SELECTcolumn1,column2,column3… FROM table_name GROUP BY column;
SELECTproduct,sum(price) FROM orders GROUP BY product;
10.使用HAVING 子句過濾:
SELECT column1,column2,column3…FROMtable_name GROUP BY column HAVING…
SELECTproduct,sum(price) FROM orders GROUP BY product HAVING sum(price)>100;
HAVING和WHERE均可實現過濾,但在HAVING可以使用合計函式,HAVING通常跟在GROUP BY後,它作用於組。
…GROUP BY …HAVING…ORDERBY…
■對錶進行重新命名:
1.RENAME TABLE table_name TO new_name;
2.ALTER TABLE table_name RENAME TO new_table_name;
■  修改表結構:增加欄位
1.增加一個欄位
ALTER TABLE table_name ADD COLUMN(欄位名 欄位型別);---此方法帶括號
2.增加一個欄位在指定的位置
ALTER TABLE table_name ADDCOLUMN 欄位名 欄位型別 AFTER 某欄位;
■  修改表結構:刪除欄位
ALTER TABLE table_name drop 欄位名;
■修改表結構:改變欄位名稱/型別:
ALTER TABLE table_name CHANGE COLUMN field_namenewfield_name varchar(10) not null;
其中char(20) notnull是newcolumn_name欄位的create_definition.
■增加約束:約束(主鍵Primary Key、唯一性Unique、非空Not NULL)
1.ALTER TABLE table_name CHANGE old_id new_id INT(16) NOT NULL PRIMARY KEY;
2.自動增長:
ALTER TABLE table_name CHANGE old_id  new_id INT(16) NOT NULL AUTO_INCREMENT;
■修改表的字符集:
ALTER TABLE table_name CHARACTER SET UTF8;
■  檢視某欄位使用的編碼:
SELECTCHARSET(column_name) FROM table_name;
==============================================================================

插入資料庫是出現亂碼的參考解決方案:
1。 資料庫字符集設定為GB2312。(但就是插不成功顯示Datato lang 吧!)
2。關鍵在建立表的時候:
create table (欄位) Default character set gb2312;
3。表建立好的情況下:
修改表編碼: alter table 表名 Default character set gb2312;
修改欄位編碼: ALTERTABLE 表名 CHANGE COLUMN 欄位名CHARACTER SET gb2312;

==============================================================================

#檢視資料庫的版本,當前日期(不區分大小寫)
Mysql> selectVERSION(),CURRENT_DATE,NOW();