SQL用法操做合集

最近複習了一下SQL語句,用把SQL各類基本的用法小小地總結了下mysql

1、表的建立sql

一、建立表數據庫

格式:oracle

1     CREATE TABLE 表名 2        (列名 數據類型(寬度)[DEFAULT 表達式][COLUMN CONSTRAINT], 3  ... 4           [TABLE CONSTRAINT]
5           [TABLE_PARTITION_CLAUSE]
6     );

例子:函數

1 CREATE TABLE book( 2       book_number  VARCHAR2(5), 3       book_name  VARCHAR2(30), 4       pub_com_number  VARCHAR2(2), 5       author  VARCHAR2(10), 6    publishing_date DATE, 7       volume  INT(3), 8       price  FLOAT9 );

  經過上面的SQL語句,咱們就在數據庫中建立了一個簡單的數據表,這裏咱們使用mysql來進行演示spa

二、經過現有的表建立表3d

   CREATE TABLE tablename(column_name1,column_name2) AS SQL 查詢語句日誌

Eg:code

(1)徹底複製表結構和數據blog

    create table book1 as select * from book;

PS.關於查看數據表結構,有兩種方式:

   a.DESCRIBE(簡寫DESC)`table_name`;

 

 b.SHOW FULL COLUMNS FROM `table_name`;

 

 

   能夠看出,二者的區別使用SHOW FULL COLUMNS還會顯示數據表的一些鍵還有字段註釋。

 說到這裏,順帶說說在win下面如何使用mysql的dos終端:

   a.進入mysql.exe所在目錄

   b.執行mysql.exe -u用戶名 -p密碼

    

   c.選擇你要進行操做的數據庫,語法爲:use 數據庫名 ,若是你不知道都有哪些數據庫,可使用show databases;來查看

         

 

 

  d.查看數據庫中的數據表,使用show tables;

  

 

(2)只複製數據表中的某些字段建表

    create table copy_table_name as select `column_name1`,`column_name2`,..., from table;

  

 

  若是你想在複製的時候對這些字段進行重命名,能夠這樣作

  create table copy_table_name(`new_column_name1`,`new_column_name2`,..) as select `column_name1`,`column_name2`,... From table;

  不過這種語法在MySQL裏不支持,在Oracle中支持

 

 

(2)刪除已建立的數據表

 

        DROP TABLE table_name;

  

 

 

 

2、表的結構修改

一、爲數據表增長新列,即增長一個字段

   ALTER TABLE `table_name`

   ADD `column_name` dataType(maxLength) [DEFAULT `默認值`][字段約束];

   (中括號意爲可選)

  

二、對數據表某一列即某個字段進行修改

   語法跟增長差很少只是把ADD關鍵字改爲MODIFY

   ALTER TABLE `table_name`

   MODIFY `column_name` dataType(maxLength) [DEFAULT `默認值`][字段約束];

  

 

注意:字段名沒法被修改!!!若是要改變列名,只能先刪除該列,而後從新增長。其餘部分   均可以進行修改,若是沒有給出新的定義,表示該部分屬性不變。

  

 

修改列定義還有如下一些特色:

(1) 列的寬度能夠增長或減少,在表的列沒有數據或數據爲NULL時才能減少寬度。

(2) 在表的列沒有數據或數據爲NULL時才能改變數據類型,CHAR和VARCHAR2之間能夠隨意轉換。

(3) 只有當列的值非空時,才能增長約束條件NOT NULL。

(4) 修改列的默認值,隻影響之後插入的數據。

 

三、刪除數據表的一列即一個字段

 

    ALTER TABLE `table_name` DROP COLUMN `column_name`;

  

 

 

 

3、表的數據更新

一、插入

   INSERT INTO `table_name`(`column_name1`,`column_name2`,..) VALUES (val1,val2,..);

  

 

  遇到字段不少的表,若是要插入所有字段的值,一個一個字段名聲明很麻煩,能夠直接省去這一步

  INSERT INTO `table_name` values (val1,val2,...)

  

 

有的時候咱們想從一個表中複製數據數據過來,能夠嗎?沒問題

INSERT INTO `table_name` (`column_name1`,`column_name2`,..) SELECT

     (`column_name1`,`column_name2`,..) FROM `other_table_name`;

  

 

二、修改數據

   使用UPDATE關鍵字對數據進行修改,不過每每須要用WHERE子句加限制條件,否則會修改全部的行。

  UPDATE `table_name` SET `column1` = val1,`column2` = val2,... WHERE condition;

  特殊用法:經過其餘查詢結果更新數據

  UPDATE 表名 SET(字段名1, 字段名2, ...)=SELECT (字段名1, 字段名2, ...) FROM 另外的表名WHERE條件;

  

 

三、刪除數據

  刪除數據同樣很是敏感,在執行以前必定要檢查是否有where條件,不然會刪除數據表中的所有數據。

  DELETE FROM `table_name` WHERE condition;

  

  若是咱們想清空數據表中的全部數據,能夠用:

  DRUNCATE `table_name`

  這裏你可能會天然而然想到,我用delete from `table_name`不也能夠達到相同的效果麼?確實,但其實二者仍是有一些區別的:

  二者均是刪除數據表中所有數據,可是使用truncate的速度更快,且使用的系統和事務日誌資源少,delete語句每刪除一行,都要在事務日誌中爲所刪除的每行記錄一項;而truncate經過釋放存儲表數據所用的數據頁來刪除數據,並只在事務日誌中記錄頁的釋放。Truncate刪除內容釋放空間,delete刪除內容不釋放空間。

 

四、查詢數據

(1)指定索引字段

     SELECT 字段名列表 FROM 表名 WHRER 條件

   

(2)顯示計算列

 查詢語句中能夠有算術表達式,包括+、-、*

  

 

(3)使用別名

 

  

 

(4)字符串拼接

     在oracle中使用「||」,在MySQL中則使用concat()函數

   

     要達到相同的效果上圖sql語句在oracle中的用法應該爲:

     select ‘書名爲:’||`book_name`||’ 價格爲:’||`price` as `descript` from book2;

(5)消除重複

     若是在顯示結果中存在重複行,可使用關鍵字DISTINCT消除重複顯示

     SELECT DISTINCE 字段名 FROM 表名

   

  加入咱們對多個字段去重,那麼顯示的結果是多個字段的組合不重複結果

  

 

(6)排序

     使用ORDER BY關鍵字,有升序降序之分,ASC表示升序,DESC表示降序

升序

     SELECT * FROM表名 ORDER BY `字段名` ASC;

  

 

降序

  SELECT * FROM表名 ORDER BY `字段名` DESC;

 

   

多列排序

  SELECT * FROM表名 ORDER BY `字段名1`,`字段名2`,... ;

  多列排序中,前面字段名的排序優先級高,即後面字段的排序是在前面字段排序的結果的基礎上再進行排序的。

   

PS.多列排序中的字段名包括對字段的重命名和自定義字段

 

五、條件查詢

(1)簡單條件查詢

   要對顯示的行進行限定,可在FROM從句後使用WHERE從句,在WHERE從句中給出限定的條件,由於限定條件是一個表達式,因此稱爲條件表達式。條件表達式中能夠包含比較運算,表達式的值爲的記錄將被顯示。

 

     PS.只有數值和日期型的字段才能進行大小的比較,字符型字段只能比較是否相等

(2)符合條件查詢

   能夠用邏輯運算符構成複合的條件查詢,即把兩個或多個條件,用邏輯運算符鏈接成一個條件。有3個邏輯運算符,以下圖所示:

  運算的優先順序是NOT,AND,OR。若是要改變優先順序,可使用括號。

 (3)特殊運算表示法

   A.between

     對於數值型或日期型數據,表示範圍時可用如下運算表示方法

     [NOT] BETWEEN ... AND ...

  

   B.in

     顯示值知足特定集合的結果

     [NOT] IN ...

   

   C.like

     使用like操做符可完成按通配符查找字符串,適用於模糊查詢

     [NOT] LIKE 匹配模式

   匹配模式中除了能夠包含固定的字符以外,還能夠包含如下的通配符:

    %:表明0個或多個任意字符。

     _ :表明一個任意字符。

 Eg:

         查找開頭爲「我」的書籍信息

  

 若是想查找書名第二個字符爲「+」的書籍

  

D.判斷某字段是否爲空值

  [NOT] NULL

 

4、表的高級查詢

一、多表聯合查詢

經過鏈接能夠創建多表查詢,多表查詢的數據能夠來自多個表,可是表之間必須有適當的鏈接條件。爲了從多張表中查詢,必須識別鏈接多張表的公共列。通常是在WHERE子句中用比較運算符指明鏈接的條件。

忘記說明表的鏈接條件是常見的一種錯誤,這時查詢將會產生錶鏈接的笛卡爾積(即一個表中的每條記錄與另外一個表中的每條記錄做鏈接產生的結果)。通常N個表進行鏈接,須要至少N-1個鏈接條件,纔可以正確鏈接。兩個錶鏈接是最多見的狀況,只須要說明一個鏈接條件。

兩個以上的表也能夠進行鏈接,在這裏不作專門介紹。

兩個表的鏈接有四種鏈接方式:

  • 相等鏈接。
  • 不等鏈接。
  • 外鏈接。
  • 自鏈接。

 

(1)相等鏈接

  經過兩個表具備相贊成義的列,能夠創建相等鏈接條件。使用相等鏈接進行兩個表的查詢時,只有鏈接列上在兩個表中都出現且值相等的行纔會出如今查詢結果中。

舉個例子:

   咱們假設有一個學生表student和一個老師表teacher。student表裏面有學生的信息,其中一個關鍵字段是老師的t_id,對應teacher表的id,這裏咱們簡化一下老師和學生的關係是一對一的,即一個老師只能執教一個學生,一個學生只能被一個老師執教

       咱們要求查詢學生和老師的對應關係和學生id,這時能夠聯表相等查詢:select s.id,s.name,t.name from student s,teacher t where s.t_id = t.id;

(2)不等鏈接

  跟上面相似

(3)外鏈接

  使用上面的相等或不等鏈接會產生一個問題,就是咱們只能看到有上老師的課的學生的信息而不能看到沒有選老師的課的學生的信息,若是咱們想在和老師的表進行鏈接時還想顯示所有學生的信息怎麼辦?外鏈接能夠達到這個目的!

     外鏈接不只顯示知足相等鏈接條件的記錄,還顯示不知足條件鏈接的行。

外鏈接的種類有三種,分別爲:

        左外鏈接:左邊的表不加限制

   右外鏈接:右邊的表不加限制

   全外鏈接:左右兩表都不加限制

這裏咱們用老師和學生的關係來講明這三種外鏈接:

  以下圖所示,學生表裏有個t_id表示被執教的老師id,老師表裏有個s_id表示老師執教的學生id,老師和學生是一對一的關係。

  

 

  咱們初始化數據,學生表裏陳六沒有被任何一名老師執教,老師kalay也沒有執教任何一名學生。

  當咱們想查詢被執教的學生和對應老師信息時,使用以下查詢:

 

   

  那假如同時咱們還想顯示其餘沒有被執教的學生的信息呢?使用左鏈接left join

  

  若是咱們想顯示的是所有老師執教狀況的信息呢?使用右鏈接right join

  

  若是咱們想顯示出了正常執教的老師和正常被執教的學生以外,還想顯示沒有被執教的學生和沒有執教的老師呢?用全鏈接full join,可是在mysql中是不支持full join的,那怎麼達到full join的效果呢?仔細觀察上面左右鏈接,咱們發現左右鏈接的合集就是全鏈接的集合了,這裏咱們可使用union去重達到全鏈接full join的效果了。

  

 

(4)自鏈接

   自鏈接就是一個表,同自己進行鏈接。對於自鏈接能夠想像存在兩個相同的表(表和表的副本),能夠經過不一樣的別名區別兩個相同的表

Eg:

  經理和僱員都在僱員表中,每一個僱員有一個對應管理的經理,要查詢僱員和對應經理的名稱。這種查詢在無限分類表中也很常見。

  假設僱員表的主鍵是id,僱員名稱是name,經理id是man_id,則上述查詢要求對應sql應該爲

  SELECT work.name,manager.name FROM `employ` worker,`employee` manager WHERE work.man_id = manager.id;

 

二、統計查詢

  一般須要對數據進行統計,彙總出數據庫的統計信息。好比,可能想了解公司的總人數和總工資額,或各個部門的人數和工資額,這個功能能夠由統計查詢完成。

  數據庫中提供了一些函數來完成統計工做,這些函數稱爲組函數,組函數不一樣於前面介紹和使用的函數(單行函數)。組函數能夠對分組的數據進行求和、求平均值等運算。組函數只能應用於SELECT子句、HAVING子句或ORDER BY子句中。組函數也能夠稱爲統計函數。

 

三、子查詢

      不少狀況下,咱們須要作這樣的操做,把一個查詢的結果做爲另外一個查詢的一部分,第一個查詢能夠做爲第二個查詢的一部分出如今第二個查詢的條件中,這樣的查詢叫作子查詢。

      子查詢通常出如今SELECT語句的WHERE子句中,Oracle也支持在FROM或HAVING子句中出現子查詢。子查詢比主查詢先執行,結果做爲主查詢的條件,在書寫上要用圓括號擴起來,並放在比較運算符的右側。子查詢能夠嵌套使用,最裏面的查詢最早執行。子查詢能夠在SELECT、INSERT、UPDATE、DELETE等語句中使用。

      這裏已僱員和工資的關係爲例,假設有一個僱員表emp,每一行表明一名僱員的信息,有ename、sal、empno、job、deptno字段分別表明僱員名、僱員工資、僱員號、工做崗位和部門。

(1)單行子查詢

      若是子查詢只返回一行結果,咱們稱之爲單行子查詢

      例子: 查詢一個比SCOTT工資高的僱員名字和工資

      分析:對SCOTT工資的查詢爲子查詢,只有先查出這個,才能差距SCOTT的工資查到咱們想要查詢的結果

      SQL語句:SELECT ename,sal FROM emp WHERE sal > (SELECT sal FROM emp WHERE ename == 'SCOTT');

(2)多行子查詢

       若是子查詢返回多行結果,稱之爲多行子查詢。多行子查詢常用不用的比較運算符,它們是IN、ANY和ALL

       例子:查詢工資低於任何一個「CLERK」的工資的僱員信息

       分析:有任何的關鍵字,故使用ANY比較運算符

       SQL語句:SELECT * FROM emp WHERE sal < ANY(SELECT sal FROM emp WHERE job = 'CLERK') AND job != 'CLERK';

 

       例子:查詢工資比全部的「SALESMAN」都高的僱員的編號、名字和工資

       分析:有全部關鍵字,使用ALL比較運算符

       SQL語句:SELECT empno,ename,sal FROM emp WHERE sal > ALL(SELECT sal FROM emp WHERE job = 'SALESMAN');

 

       例子:查詢部門20中職務同部門10的僱員同樣的僱員信息

       分析:有在什麼中的範圍關鍵字,用IN比較運算符

       SQL語句:SELECT * FROM emp WHERE job in (SELECT job FROM emp WHERE deptno = 10) AND deptno = 20;

(3)多列子查詢

  若是子查詢返回多列,則對應的比較條件中也應該出現多列,這種查詢成爲多列子查詢。

  例子:查詢職務和部門與SCOTT相同的僱員的信息

  SQL語句:SELECT * FROM emp WHERE (job,deptno) = (SELECT job,deptno FROM emp WHERE ename = 'SCOTT');     

 

四、集合運算

  多個查詢語句的結果能夠作集合運算,結果集的字段類型、數量和順序應該同樣。

     並集

    

  

  

   差集

  MySQL不支持MINUS

  要達到相似的效果,可以使用IN、NOT IN,也能夠配合使用UNION ALL來實現,不過只建議數據量比較小的時候使用,不然效率比較低

  

      使用union all實現差集

     

      使用not in實現交集

  

     交集

       使用union all實現交集

  

      使用in實現交集

  

相關文章
相關標籤/搜索