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++
- 能夠聯機交互
- 也可嵌入到高級程序c、c++、java、python等語言匯種,不一樣的語言中,使用方式基本相同。
- 簡單易學,操做靈活。核心語句只有9條:create、alter、select、insert、delete、update、grant、revoke
- 是一種非過程化的語言
SQL語言操做分類:sql
- 數據庫定義語言。DDL,用於定義數據庫的邏輯結構,含表、索引、視圖
- 數據操縱語言。DML,用於數據的查詢、更新
- 數據庫控制語言。DCL,用於實現數據完整性和徹底性、一致性控制的SQL語句
SQL語句建立數據庫:數據庫
- 建立空數據庫,命名;
- 打開SQL視圖;
- 建立-》查詢-》查詢視圖,功能區左側,顯示SQL視頻,數據定義項
- 設計-》SQL視圖button/數據定義
- SQL語句:每一個單詞間至少有一個空格或必要的逗號
- 執行SQL
- 保存SQL。快速工具欄保存
- 使用已存的SQL,新建
實踐_定義表結構:函數
1 create table語法:工具
create table 《表名》(測試
列名 《數據類型》,spa
列名n 《數據類型》,設計
primary key (列名),
foreign key (列名) reference 表名 (主鍵列名))
- 數據類型
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
!!數據庫的增刪改:
- 增=插入數據。三種方式:
- 在表中插入數據:insert into 表名 values (值1,值2,,,值n)。列名與列值的順序必須一一對應
- 在表中插入部分列的值:insert into 表名(列名1,列名2)values (列名1值,列名2值)
- 將values子句寫成一個查詢語句:insert into 表名(列名1) select 列名1 from 表名
- 改=更新數據。
- 語法:update 表名 set 列名1=列名1值,列名2=列名2值 where 條件表達式
- 刪=刪除數據。
- 語法1刪除部分數據行:delete from 表名 where 條件表達式
- 語法2刪全部數據:delete from 表名
- 注意::刪除僅刪除數據,不刪除表結構
!!SQL查詢語句:
語法:select 列名 from 表名 where 條件表達式。
- select後的子句,有如下幾種狀況:
- 指定列名查詢:select 列1,列2 from 表名 where 表達式
- *指定查詢條件的全部列信息:select * from 表名 where 表達式
- 指定表達式或函數,並利用as 關鍵字指定輸出結果的新列名
- SELECT 姓名,year(date())-year(出生年月) as 年齡 from 職工 where 性別="男"
- year()函數。是一個內部函數,參數是一個日期類型,返回日期型數據的年份.如:year("1994/8/15")返回1994。date()是當前日期的函數
- where子句。
- 做用:指定從表中選擇行的條件;
- 子句通常是:條件表達式
- 條件表達式:能夠使用邏輯運算符(and、or、not)、比較運算符(>、>=、<、<=、=、<>)、算術運算符
- from子句。
- 最用:指定表,也可指定多個表進行聯接運算
- where子句給出鏈接條件
- SQL容許from子句中使用表的別名,代替表名,使用在條件表達式中
- 實踐:select 訂單號,客戶名稱,姓名,簽單日期 from 客戶 C,訂單 D,職工 E where C.客戶編號=D.客戶編號 and E.職工號=D.職工號 and 簽單日期 >=#2015/1/1#
- 字符串的操做。
- Access系統只能用英文雙引號,最爲字符串的定界符
- 字符串的操做符:like、not like
- 經常使用的字符串符號:*表示任意字符串;?表示任何一個字符
- " A* "表示任何以A開頭的字符串
- " *A* "表示任何包含A的字符串
- " ?? "表示只含有2個字符的字符串
- " ??* "表示至少包含兩個字符的字符串
- like應用。
- SELECT 姓名 from 職工 where 姓名 like " 沈* "
- SELECT 姓名 from 職工 where 姓名 like "??萍???????" < =>select 姓名 from 職工 where 姓名 like "李?生*" →→特別注意,模糊匹配須要把該字段的長度,用?佔位符填充。若輸<10個字符,無結果
- not like應用。
- 查找全部不是經理的人:
- 方式一:SELECT 姓名 from 職工 where 職務 not like "經*"
- 方式二:SELECT 姓名 from 職工 where 職務 <> "經理"
- 其餘特殊運算符:
- 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 指定字段的值不屬於指定集合的元素
- 排序order by。
- 做用:對查詢結果的指定列排序。
- 兩種方式:DESC降序 ASC升序。默認升序
- 實踐:select 客戶名稱,簽單日期 from 客戶 C,訂單 D where C.客戶編號=D.客戶編號 and 簽單日期 in(#2015/5/6#,#2015/5/12#) order by 簽單日期 desc
- 並操做union
- 做用:兩次查詢結果,列相同的狀況下,可進行並操做
- 兩種形式:不去重union all;去重union
- 實踐:SELECT 入庫單號 as 單號,商品編號,單價 from 入庫明細 where 商品編號="P1" union select 出庫單號 as 單號,商品編號,單價 from 出庫明細 where 商品編號="P1";
- 彙集函數
- 做用:對一組值進行運算,並返回單個值的函數。常與查詢語句group by 一塊兒使用
- 求均值。SELECT avg(工資) as 平均工資 from 職工 where 職務 = "銷售員"
- 求總和。SELECT sum(單價*訂購數量) as 總金額 from 訂單 D,訂單明細 M where D.訂單號=M.訂單號 and 客戶編號="C2"
- 求最大值和最小值。類型:數值型或其餘類型。。
- 如數值型:SELECT max(工資) as 最高工資,min(工資) as 最低工資 from 職工
- 如其餘類型:SELECT max(出生年月) as 最晚年齡,min(出生年月) as 最先年齡 from 職工
- count函數:做用統計表中的行數。有三種格式
- count(*):統計全部行數。SELECT count(*) as 總訂單數 from 訂單
- count(表達式):統計表達式中的行數。SELECT count(身份證號) AS 有身份證信息的員工數量 FROM 職工;
- count(distinct(表達式)):去重後的字段總數。SELECT distinct(職務) AS 職務種類 FROM 職工;
- 分組。group by和having。執行順序1.where條件2.group針對結果列分類去重3.having針對結果列的條件判斷
- group by:功能將在分組表達式上具備條
- SELECT 職務,count(職務) as 人數 from 職工 group by 職務
- SELECT 商品編號,max(訂購數量) as 最大訂購量,min(訂購數量) as 最小訂購量 from 訂單明細 group by 商品編號
- having子句:where條件在groupby前生效,having條件在group by後生效
- SELECT 客戶編號,sum(單價*訂購數量) as 總金額 from 訂單 D,訂單明細 M where D.訂單號=M.訂單號 and 簽單日期 between #2015-1-1# and #2015-12-31# group by 客戶編號 having sum(單價*訂購數量) >18000
- 空值Null
- SQL中容許使用null表示某個屬性值爲空
- 測試空值的方法。有兩種:is null:空值;is not null:非空值
- is null:SELECT 職工號,姓名,出生年月 from 職工 where 出生年月 is null
- is not null:SELECT 職工號,姓名,出生年月 from 職工 where 出生年月 is not null
- 空值的處理原則。
- 算術運算+-*/的參數含有空值null,則運算結果爲null
- 比較運算符><>=<= =<>中做爲比較對象,則比較結果爲「unknown」
- 除此外的其餘狀況,均爲FALSE
- 彙集函數對null的處理
- sum、avg、max、min函數對參數中的null忽略不計,若全部參數值都是空值,則返回至null
- count函數對參數中的null值不計數,若全部參數值都是空值,則返回至0
SQL的聯接操做
- 內鏈接
- 等值鏈接。屬性值相等的條件鏈接,不能消除重複列
- inner join
- ??????(內鏈接教材是錯的。。)
- 天然鏈接
- 以公共屬性值相等爲條件的鏈接,能消除重複列。是最經常使用的鏈接方式
- 一般的公共屬性是一個表的主鍵和另外一個表的外鍵,這剛好是關係之間的聯繫方法。SELECT 客戶名稱,訂購數量 from ((客戶 A inner join 訂單 B (A.客戶編號=B.客戶編號)) inner join 訂單明細 C (C.訂單號=B.訂單號)) inner join 商品 D (D.訂單編號=C.訂單編號) where 規格="245";
- 左外鏈接
- left outer join:左表不相匹配的元組,右表爲空值。select A.客戶編號,客戶名稱,訂單號 from 客戶 A left outer join 訂單 B on(A.客戶編號=B.客戶編號)
- 右外鏈接
- right outer join:右表不匹配,左表值爲空。同左鏈接相反。
- 自鏈接
- 做用:利用別名實現同一個表的自鏈接
- select r.姓名,r.工資 from 職工 r,職工 s where r.工資>s.工資 and s.姓名="何乃雲"
嵌套查詢
- 又稱子查詢。子查詢的結果也是一個關係。select from where嵌套在一個子查詢語句中
- in:select 客戶名稱,聯繫人 from 客戶 where 客戶編號 in (select 客戶編號 from 訂單 where 訂單號 in(select 訂單號 from 訂單明細 where 商品編號="P1"))
- not in:select 客戶編號 from 訂單 where 訂單號 not in (select 訂單號 from 訂單明細 where 商品編號="P1")
- 聚合函數:select 客戶編號 from 訂單 where 訂單號 in (select 訂單號 from 訂單明細 where 訂購數量=(select max(訂購數量) from 訂單明細 where 商品編號="P2"))
- 算術運算:select 姓名,工資 from 職工 where 工資>(select 工資 from 職工 where 姓名="何乃雲" )
- 在其餘語句中使用嵌套查詢
- select子句嵌入子查詢,子查詢做爲一個表達式。select 職工號,姓名,工資,(select avg(工資) from 職工) as 平均工資,工資-(select avg(工資) from 職工) as 差額 from 職工
- update語句中嵌入子查詢
- update 訂單明細 set 單價=單價*0.95 where 訂單號 in (select 訂單號 from 訂單 where 客戶編號="C1" )
- delete語句嵌入子查詢
- 更具參照實體的完整性,須要銑刪除關聯關係,再刪除改用戶。