DB_003_關係數據庫標準語言(SQL)

SQL是什麼?java

  SQL的全稱是:Structured Query Language,是一種結構化查詢語言,主要用於管理關係型數據庫系統,對數據庫進行增刪改查操做。也是數據庫腳本文件的擴展名。更多瞭解詳見百度百科:https://baike.baidu.com/item/%E7%BB%93%E6%9E%84%E5%8C%96%E6%9F%A5%E8%AF%A2%E8%AF%AD%E8%A8%80/10450182?fromtitle=sql&fromid=86007&fr=aladdinpython

SQL語言特色:c++

  1. 能夠聯機交互
  2. 也可嵌入到高級程序c、c++、java、python等語言匯種,不一樣的語言中,使用方式基本相同。
  3. 簡單易學,操做靈活。核心語句只有9條:create、alter、select、insert、delete、update、grant、revoke
  4. 是一種非過程化的語言

SQL語言操做分類:sql

  1. 數據庫定義語言。DDL,用於定義數據庫的邏輯結構,含表、索引、視圖
  2. 數據操縱語言。DML,用於數據的查詢、更新
  3. 數據庫控制語言。DCL,用於實現數據完整性和徹底性、一致性控制的SQL語句

SQL語句建立數據庫:數據庫

  1. 建立空數據庫,命名;
  2. 打開SQL視圖;
    1. 建立-》查詢-》查詢視圖,功能區左側,顯示SQL視頻,數據定義項
    2. 設計-》SQL視圖button/數據定義
    3. SQL語句:每一個單詞間至少有一個空格或必要的逗號
  3. 執行SQL
  4. 保存SQL。快速工具欄保存
  5. 使用已存的SQL,新建

實踐_定義表結構:函數

  1 create table語法:工具

create table 《表名》(測試

列名 《數據類型》,spa

列名n 《數據類型》,設計

primary key (列名),

foreign key (列名) reference 表名 (主鍵列名))

  1. 數據類型

  2 alter修改表結構:

增長新列:alter table 表名 add 新列名 數據類型

修改某列的屬性:alter 表名 alter column  要求改的列名  修改後的數據類型

刪除列:alter table 表名 drop column 要刪除的列名

  3 刪除表:

drop table 表名

  4 建立索引:

create index 索引名 on 表名 (列名)

建立惟一索引:

  create unique index 索引名 on  表名 (列名)

建立後,怎麼查看索引?????,以下:

  選中表區-》字段區,可左右選中某個字段進行查看

遇到的問題::

1 建立入庫單表,有一個外鍵廠商編號,沒法關聯到廠商表,刪除關係後,能夠正常建立

2 建立入口明細,商品編號的外鍵也會報錯,刪除關係OK

!!數據庫的增刪改:

 

  1. 增=插入數據。三種方式:
    1. 在表中插入數據:insert into 表名 values (值1,值2,,,值n)。列名與列值的順序必須一一對應
    2. 在表中插入部分列的值:insert into 表名(列名1,列名2)values (列名1值,列名2值)
    3. 將values子句寫成一個查詢語句:insert into 表名(列名1) select 列名1 from 表名
  2. 改=更新數據。
    1. 語法:update 表名 set 列名1=列名1值,列名2=列名2值 where 條件表達式
  3. 刪=刪除數據。
    1. 語法1刪除部分數據行:delete from 表名 where 條件表達式
    2. 語法2刪全部數據:delete  from 表名 
    3. 注意::刪除僅刪除數據,不刪除表結構

!!SQL查詢語句:

 語法:select  列名 from 表名 where 條件表達式。

  1. select後的子句,有如下幾種狀況:
    1. 指定列名查詢:select 列1,列2 from 表名 where 表達式
    2. *指定查詢條件的全部列信息:select * from 表名 where 表達式
    3. 指定表達式或函數,並利用as 關鍵字指定輸出結果的新列名
      1. SELECT 姓名,year(date())-year(出生年月) as 年齡 from 職工 where 性別="男"
      2. year()函數。是一個內部函數,參數是一個日期類型,返回日期型數據的年份.如:year("1994/8/15")返回1994。date()是當前日期的函數
  2. where子句。
    1. 做用:指定從表中選擇行的條件;
    2. 子句通常是:條件表達式
    3. 條件表達式:能夠使用邏輯運算符(and、or、not)、比較運算符(>、>=、<、<=、=、<>)、算術運算符
  3. from子句。
    1. 最用:指定表,也可指定多個表進行聯接運算
    2. where子句給出鏈接條件
    3. SQL容許from子句中使用表的別名,代替表名,使用在條件表達式中
      1. 實踐:select 訂單號,客戶名稱,姓名,簽單日期 from 客戶 C,訂單 D,職工 E where C.客戶編號=D.客戶編號 and E.職工號=D.職工號 and 簽單日期 >=#2015/1/1#
  4. 字符串的操做。
    1. Access系統只能用英文雙引號,最爲字符串的定界符
    2. 字符串的操做符:like、not like 
      • 經常使用的字符串符號:*表示任意字符串;?表示任何一個字符
        • " A* "表示任何以A開頭的字符串
        • " *A* "表示任何包含A的字符串
        • " ?? "表示只含有2個字符的字符串
        • " ??* "表示至少包含兩個字符的字符串
      • like應用。
        • SELECT 姓名 from 職工 where 姓名 like " 沈* "
        • SELECT 姓名 from 職工 where 姓名 like "??萍???????" < =>select 姓名 from 職工 where 姓名 like "李?生*"   →→特別注意,模糊匹配須要把該字段的長度,用?佔位符填充。若輸<10個字符,無結果
      • not like應用。
        • 查找全部不是經理的人:
          1. 方式一:SELECT 姓名 from 職工 where 職務 not like "經*"
          2. 方式二:SELECT 姓名 from 職工 where 職務 <> "經理"
    3. 其餘特殊運算符:
      • between and   在某個範圍之間。如:SELECT * from 職工 where 工資 between 3000 and 5000
      • not between and      不在某個範圍之間。如:SELECT * from 職工 where 工資not  between 3000 and 5000
      • in     指定字段的值屬於指定集合的元素。                                                                                                                                                     實踐:select 客戶名稱,簽單日期 from 客戶 C,訂單 D where C.客戶編號=D.客戶編號 and 簽單日期 in(#2015/5/6#,#2015/5/12#)
      • not in      指定字段的值不屬於指定集合的元素 
  5. 排序order by。
    1. 做用:對查詢結果的指定列排序。
    2. 兩種方式:DESC降序   ASC升序。默認升序
    3. 實踐:select 客戶名稱,簽單日期 from 客戶 C,訂單 D where C.客戶編號=D.客戶編號 and 簽單日期 in(#2015/5/6#,#2015/5/12#) order by 簽單日期 desc
  6. 並操做union
    1. 做用:兩次查詢結果,列相同的狀況下,可進行並操做
    2. 兩種形式:不去重union all;去重union
    3. 實踐:SELECT 入庫單號 as 單號,商品編號,單價 from 入庫明細 where 商品編號="P1" union select 出庫單號 as 單號,商品編號,單價 from 出庫明細 where 商品編號="P1";
  7. 彙集函數
    1. 做用:對一組值進行運算,並返回單個值的函數。常與查詢語句group by 一塊兒使用
      1. 求均值。SELECT avg(工資) as 平均工資 from 職工 where 職務 = "銷售員"
      2. 求總和。SELECT sum(單價*訂購數量) as 總金額 from 訂單 D,訂單明細 M where D.訂單號=M.訂單號 and 客戶編號="C2"
      3. 求最大值和最小值。類型:數值型或其餘類型。。
        1. 如數值型:SELECT max(工資) as 最高工資,min(工資) as 最低工資 from 職工       
        2. 如其餘類型:SELECT max(出生年月) as 最晚年齡,min(出生年月) as 最先年齡 from 職工
      4. count函數:做用統計表中的行數。有三種格式
        1. count(*):統計全部行數。SELECT count(*) as 總訂單數 from 訂單
        2. count(表達式):統計表達式中的行數。SELECT count(身份證號) AS 有身份證信息的員工數量 FROM 職工;
        3. count(distinct(表達式)):去重後的字段總數。SELECT distinct(職務) AS 職務種類 FROM 職工;
  8. 分組。group by和having。執行順序1.where條件2.group針對結果列分類去重3.having針對結果列的條件判斷
    1. group by:功能將在分組表達式上具備條
      1. SELECT 職務,count(職務) as 人數 from 職工 group by 職務
      2. SELECT 商品編號,max(訂購數量) as 最大訂購量,min(訂購數量) as 最小訂購量 from 訂單明細 group by 商品編號
    2. having子句:where條件在groupby前生效,having條件在group by後生效
      1. SELECT 客戶編號,sum(單價*訂購數量) as 總金額 from 訂單 D,訂單明細 M where D.訂單號=M.訂單號 and 簽單日期 between #2015-1-1# and #2015-12-31#  group by 客戶編號 having sum(單價*訂購數量) >18000
  9. 空值Null
    1. SQL中容許使用null表示某個屬性值爲空
      1. 測試空值的方法。有兩種:is null:空值;is not null:非空值
        1. is null:SELECT 職工號,姓名,出生年月 from 職工 where 出生年月 is null
        2. is not null:SELECT 職工號,姓名,出生年月 from 職工 where 出生年月 is not null
    2. 空值的處理原則。
      1. 算術運算+-*/的參數含有空值null,則運算結果爲null
      2. 比較運算符><>=<= =<>中做爲比較對象,則比較結果爲「unknown」
      3. 除此外的其餘狀況,均爲FALSE
      4. 彙集函數對null的處理
        1. sum、avg、max、min函數對參數中的null忽略不計,若全部參數值都是空值,則返回至null
        2. count函數對參數中的null值不計數,若全部參數值都是空值,則返回至0

SQL的聯接操做

  1.  內鏈接
    1. 等值鏈接。屬性值相等的條件鏈接,不能消除重複列
    2. inner join
    3. ??????(內鏈接教材是錯的。。)
  2. 天然鏈接
    1. 以公共屬性值相等爲條件的鏈接,能消除重複列。是最經常使用的鏈接方式
    2. 一般的公共屬性是一個表的主鍵和另外一個表的外鍵,這剛好是關係之間的聯繫方法。SELECT 客戶名稱,訂購數量 from ((客戶 A inner join 訂單 B (A.客戶編號=B.客戶編號)) inner join 訂單明細 C (C.訂單號=B.訂單號)) inner join 商品 D (D.訂單編號=C.訂單編號) where 規格="245";
  3. 左外鏈接
    1. left outer join:左表不相匹配的元組,右表爲空值。select A.客戶編號,客戶名稱,訂單號 from 客戶 A left outer join 訂單 B on(A.客戶編號=B.客戶編號)

       

  4. 右外鏈接
    1. right outer join:右表不匹配,左表值爲空。同左鏈接相反。
  5. 自鏈接
    1. 做用:利用別名實現同一個表的自鏈接
    2. select r.姓名,r.工資 from 職工 r,職工 s  where r.工資>s.工資 and s.姓名="何乃雲"

嵌套查詢

  1. 又稱子查詢。子查詢的結果也是一個關係。select  from where嵌套在一個子查詢語句中 
    1. in:select 客戶名稱,聯繫人 from 客戶 where 客戶編號 in (select 客戶編號 from 訂單 where 訂單號 in(select 訂單號 from 訂單明細 where 商品編號="P1"))
    2. not in:select 客戶編號 from 訂單 where 訂單號 not in (select 訂單號 from 訂單明細 where 商品編號="P1")
    3. 聚合函數:select 客戶編號 from 訂單 where 訂單號 in (select 訂單號 from 訂單明細 where 訂購數量=(select max(訂購數量) from 訂單明細 where 商品編號="P2"))
    4. 算術運算:select 姓名,工資 from 職工 where 工資>(select 工資 from 職工 where 姓名="何乃雲" )
  2. 在其餘語句中使用嵌套查詢
    1. select子句嵌入子查詢,子查詢做爲一個表達式。select 職工號,姓名,工資,(select avg(工資) from 職工) as 平均工資,工資-(select avg(工資) from 職工) as 差額 from 職工
    2. update語句中嵌入子查詢
      1. update 訂單明細 set 單價=單價*0.95 where 訂單號 in (select 訂單號 from 訂單 where 客戶編號="C1" )
  3. delete語句嵌入子查詢
    1. 更具參照實體的完整性,須要銑刪除關聯關係,再刪除改用戶。
相關文章
相關標籤/搜索