一、數(shù)據(jù)庫的基本語法

一稚瘾、數(shù)據(jù)庫概述

  • 什么是數(shù)據(jù)庫
    數(shù)據(jù)庫就是存儲數(shù)據(jù)的倉庫牡昆,其本質(zhì)是一個文件系統(tǒng),數(shù)據(jù)按照特定的格式將數(shù)據(jù)存儲起來摊欠,用戶可以對數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行增加丢烘,修改,刪除及查詢操作些椒。

  • 什么是數(shù)據(jù)庫管理系統(tǒng)
    數(shù)據(jù)庫管理系統(tǒng)(DataBase Management System播瞳,DBMS):指一種操作和管理數(shù)據(jù)庫的大型軟件,用于建立免糕、使用和維護數(shù)據(jù)庫赢乓,對數(shù)據(jù)庫進(jìn)行統(tǒng)一管理和控制,以保證數(shù)據(jù)庫的安全性和完整性石窑。用戶通過數(shù)據(jù)庫管理系統(tǒng)訪問數(shù)據(jù)庫中表內(nèi)的數(shù)據(jù)牌芋。

  • 常見的數(shù)據(jù)庫管理系統(tǒng)
    MYSQL :開源免費的數(shù)據(jù)庫,小型的數(shù)據(jù)庫.已經(jīng)被Oracle收購了.MySQL6.x版本也開始收費松逊。
    Oracle :收費的大型數(shù)據(jù)庫躺屁,Oracle公司的產(chǎn)品。Oracle收購SUN公司经宏,收購MYSQL犀暑。
    DB2 :IBM公司的數(shù)據(jù)庫產(chǎn)品,收費的熄捍。常應(yīng)用在銀行系統(tǒng)中.
    SQLServer:MicroSoft 公司收費的中型的數(shù)據(jù)庫。C#母怜、.net等語言常使用。
    SyBase :已經(jīng)淡出歷史舞臺缚柏。提供了一個非常專業(yè)數(shù)據(jù)建模的工具PowerDesigner苹熏。
    SQLite : 嵌入式的小型數(shù)據(jù)庫,應(yīng)用在手機端币喧。
    Java相關(guān)的數(shù)據(jù)庫:MYSQL轨域,Oracle
    這里使用MySQL數(shù)據(jù)庫。MySQL中可以有多個數(shù)據(jù)庫杀餐,數(shù)據(jù)庫是真正存儲數(shù)據(jù)的地方干发。

數(shù)據(jù)庫與數(shù)據(jù)庫管理系統(tǒng)的關(guān)系


數(shù)據(jù)庫與數(shù)據(jù)庫管理系統(tǒng)的關(guān)系.png
  • 數(shù)據(jù)庫表

數(shù)據(jù)庫中以表為組織單位存儲數(shù)據(jù)。
表類似我們的Java類史翘,每個字段都有對應(yīng)的數(shù)據(jù)類型枉长。
那么用我們熟悉的java程序來與關(guān)系型數(shù)據(jù)對比,就會發(fā)現(xiàn)以下對應(yīng)關(guān)系:

類----------表
類中屬性----------表中字段
對象----------記錄

  • 表數(shù)據(jù)
    根據(jù)表字段所規(guī)定的數(shù)據(jù)類型琼讽,我們可以向其中填入一條條的數(shù)據(jù)必峰,而表中的每條數(shù)據(jù)類似類的實例對象。表中的一行一行的信息我們稱之為記錄钻蹬。


    表數(shù)據(jù).png

表記錄與java類對象的對應(yīng)關(guān)系:


表記錄與java類對象的對應(yīng)關(guān)系.png

二吼蚁、數(shù)據(jù)庫的安裝登錄

1. 安裝

安裝完成后,需要開啟對應(yīng)的數(shù)據(jù)庫服務(wù)才能使用问欠。
開啟和關(guān)閉服務(wù)的操作:右鍵點擊我的電腦→管理→服務(wù)→可以找到MySQL服務(wù)或Oracle服務(wù)開啟或停止肝匆。

  • 打開MySQL服務(wù)


    MySql服務(wù)開啟或停止
  • 而Oracle需要開啟OracleOraDb11g_home1TNSListener和OracleServiceORCL這兩個服務(wù)才能使用:


    Oracle服務(wù)開啟或停止

OracleService<SID>:數(shù)據(jù)庫實例服務(wù)
OracleOraDb11g_hom1TNSListener :數(shù)據(jù)庫監(jiān)聽服務(wù)

每次進(jìn)到服務(wù)里面去打開相關(guān)服務(wù)很麻煩,所以我們可以寫個bat腳本:
Oracle服務(wù)腳本

net start OracleOraDb11g_home1TNSListener
net start OracleServiceORCL
pause

MySQL服務(wù)腳本

net start mysql

把文本的后綴改成bat就可以了顺献。
在dos窗口也可以使用腳本里的命令運行:


MySQL-dos.png

2. 登錄

2.1 MySQL的登錄

MySQL是一個需要賬戶名密碼登錄的數(shù)據(jù)庫旗国,登陸后使用,它提供了一個默認(rèn)的root賬號滚澜,使用安裝時設(shè)置的密碼即可登錄粗仓。
格式1:cmd> mysql –u用戶名 –p密碼
例如:mysql -uroot –proot
注意:-p后無空格

登錄MySQL.png

格式2:cmd> mysql --host=ip地址 --user=用戶名 --password=密碼
例如:mysql --host=127.0.0.1 --user=root --password=root

mysql登錄方式2.png

三、 SQL語法

數(shù)據(jù)庫是不認(rèn)識JAVA語言的设捐,但是我們同樣要與數(shù)據(jù)庫交互,這時需要使用到數(shù)據(jù)庫認(rèn)識的語言SQL語句萝招,它是數(shù)據(jù)庫的代碼槐沼。

結(jié)構(gòu)化查詢語言(Structured Query Language)簡稱SQL曙蒸,是一種數(shù)據(jù)庫查詢和程序設(shè)計語言捌治,用于存取數(shù)據(jù)以及查詢、更新和管理關(guān)系數(shù)據(jù)庫系統(tǒng)纽窟。

創(chuàng)建數(shù)據(jù)庫肖油、創(chuàng)建數(shù)據(jù)表、向數(shù)據(jù)表中添加一條條數(shù)據(jù)信息均需要使用SQL語句臂港。

SQL語句分類:

  • 數(shù)據(jù)定義語言:簡稱DDL(Data Definition Language)森枪,用來定義數(shù)據(jù)庫對象:數(shù)據(jù)庫,表审孽,列等县袱。關(guān)鍵字:create,alter佑力,drop
  • 數(shù)據(jù)操作語言:簡稱DML(Data Manipulation Language)式散,用來對數(shù)據(jù)庫中表的記錄進(jìn)行更新。關(guān)鍵字:insert打颤,delete暴拄,update
  • 數(shù)據(jù)控制語言:簡稱DCL(Data Control Language),用來定義數(shù)據(jù)庫的訪問權(quán)限和安全級別编饺,及創(chuàng)建用戶揍移。關(guān)鍵字:grant revoke drop等。
  • 數(shù)據(jù)查詢語言:簡稱DQL(Data Query Language)那伐,用來查詢數(shù)據(jù)庫中表的記錄罕邀。關(guān)鍵字:select,from肾胯,where等。

SQL語法規(guī)則

  • SQL語句可以單行或多行書寫束析,以分號結(jié)尾
  • 可使用空格和縮進(jìn)來增強語句的可讀性
  • MySQL和Oracle數(shù)據(jù)庫的SQL語句都不區(qū)分大小寫第美,建議使用大寫什往,例如:SELECT * FROM user。
  • 同樣可以使用/**/的方式完成注釋

MySQL中的我們常使用的數(shù)據(jù)類型:


MySQL中的我們常使用的數(shù)據(jù)類型.png

Oracle中常用數(shù)據(jù)類型:


Oracle常用數(shù)據(jù)類型.jpg

1. 數(shù)據(jù)定義語言-DDL

1.1 DDL-數(shù)據(jù)庫操作
  • 創(chuàng)建數(shù)據(jù)庫:

    create database 數(shù)據(jù)庫名;
    create database 數(shù)據(jù)庫名 character set 字符集;

例如:

#創(chuàng)建數(shù)據(jù)庫 數(shù)據(jù)庫中數(shù)據(jù)的編碼采用的是安裝數(shù)據(jù)庫時指定的默認(rèn)編碼 utf8
  CREATE DATABASE day21_1; 
#創(chuàng)建數(shù)據(jù)庫 并指定數(shù)據(jù)庫中數(shù)據(jù)的編碼
  CREATE DATABASE day21_2 CHARACTER SET utf8;
  • 查看數(shù)據(jù)庫

    查看數(shù)據(jù)庫MySQL服務(wù)器中的所有的數(shù)據(jù)庫:
    show databases;
    查看某個數(shù)據(jù)庫的定義的信息:
    show create database 數(shù)據(jù)庫名;

例如:

show create database day21_1;
  • 刪除數(shù)據(jù)庫

    drop database 數(shù)據(jù)庫名稱;

例如:

drop database day21_2;
  • 切換數(shù)據(jù)庫:

    use 數(shù)據(jù)庫名;

例如:

use day21_1;
  • 查看正在使用的數(shù)據(jù)庫:

    select database();

1.2 DDL-表結(jié)構(gòu)相關(guān)語句
  • 創(chuàng)建表

    create table 表名(
    字段名 類型(長度) 約束,
    字段名 類型(長度) 約束
    );

例如:

#創(chuàng)建分類表

CREATE TABLE sort (

 sid INT, #分類ID

 sname VARCHAR(100) #分類名稱

);
  • 主鍵約束
    主鍵是用于標(biāo)識當(dāng)前記錄的字段。它的特點是非空利花,唯一炒事。在開發(fā)中一般情況下主鍵是不具備任何含義,只是用于標(biāo)識當(dāng)前記錄睡扬。
    格式:
    1. 在創(chuàng)建表時創(chuàng)建主鍵,在字段后面加上 primary key.
      create table tablename(
      id int primary key,
      .......
      )
    2. 在創(chuàng)建表時創(chuàng)建主鍵马靠,在表創(chuàng)建的最后來指定主鍵
      create table tablename(
      id int,
      .......娩贷,
      primary key(id)
      )
    3. 刪除主鍵:alter table 表名 drop primary key;
      alter table sort drop primary key;
    4. 主鍵自動增長:一般主鍵是自增長的字段茁瘦,不需要指定。
      實現(xiàn)添加自增長語句,主鍵字段后加auto_increment(只適用MySQL)

例如:

###創(chuàng)建分類表
CREATE TABLE sort (
  sid INT PRIMARY KEY auto_increment, #分類ID 
  sname VARCHAR(100) #分類名稱
);

其他約束:其他約束還有如外鍵腔稀、唯一、非空等诵闭。
唯一約束:unique
非空約束:not null

  • 查看表

    查看數(shù)據(jù)庫中的所有表:
    格式:show tables;
    查看表結(jié)構(gòu):
    格式:desc 表名;

例如:desc sort;

  • 刪除表

    格式:drop table 表名;

例如:drop table sort;

  • 修改表結(jié)構(gòu)格式:

alter table 表名 add 列名 類型(長度) 約束;
作用:修改表添加列.

例如:

#1,為分類表添加一個新的字段為  分類描述 varchar(20)

ALTER TABLE sort ADD sdesc VARCHAR(20);


alter table 表名 modify 列名 類型(長度) 約束;
作用:修改表修改列的類型長度及約束.

例如:

#2, 為分類表的分類名稱字段進(jìn)行修改,類型varchar(50) 添加約束 not null

ALTER TABLE sort MODIFY sname VARCHAR(50) NOT NULL;


alter table 表名 change 舊列名 新列名 類型(長度) 約束;
作用:修改表修改列名.

例如:

#3, 為分類表的分類名稱字段進(jìn)行更換  更換為 snamesname varchar(30)

ALTER TABLE sort CHANGE sname snamename VARCHAR(30);


alter table 表名 drop 列名;
作用:修改表刪除列.

例如:

#4, 刪除分類表中snamename這列

ALTER TABLE sort DROP snamename;


rename table 表名 to 新表名;
作用:修改表名

例如:

#5, 為分類表sort 改名成 category

RENAME TABLE sort TO category;


alter table 表名 character set 字符集;
作用:修改表的字符集

例如:

#6, 為分類表 category 的編碼表進(jìn)行修改,修改成 gbk

ALTER TABLE category CHARACTER SET gbk;


2.數(shù)據(jù)操作語言-DML

  • 插入表記錄:

insert into 表 (列名1,列名2,列名3..) values (值1,值2,值3..); -- 向表中插入某些列
insert into 表 values (值1,值2,值3..); --向表中插入所有列

注意:

  1. 插入的數(shù)據(jù)應(yīng)與字段的數(shù)據(jù)類型相同
  2. 數(shù)據(jù)的大小應(yīng)該在列的長度范圍內(nèi)
  3. 在values中列出的數(shù)據(jù)位置必須與被加入列的排列位置相對應(yīng)驱富。
  4. 除了數(shù)值類型外,其它的字段類型的值必須使用引號引起叫榕。
  5. 如果要插入空值,可以不寫字段荞下,或者插入 null仰税。
  6. 對于自動增長的列在操作時,直接插入null值即可河绽。

例如:

INSERT INTO sort(sid,sname) VALUES('s001', '電器');

INSERT INTO sort(sid,sname) VALUES('s002', '服飾');

INSERT INTO sort VALUES('s003', '化妝品');

INSERT INTO sort VALUES('s004','書籍');


  • 更新表記錄:
    用來修改指定條件的數(shù)據(jù)纹份,將滿足條件的記錄指定列修改為指定值
    語法:

update 表名 set 字段名=值,字段名=值;
update 表名 set 字段名=值,字段名=值 where 條件;

注意:

  1. 列名的類型與修改的值要一致.
  2. 修改值得時候不能超過最大長度.
  3. 值如果是字符串或者日期需要加’’.

例如:

#1牍疏,將指定的sname字段中的值  修改成  日用品

UPDATE sort SET sname='日用品';

#2, 將sid為s002的記錄中的sname改成  日用品

UPDATE sort SET sname='日用品' WHERE sid='s002';

UPDATE sort SET sname='日用品' WHERE sid='s003';


  • 刪除記錄:delete
    語法:

delete from 表名 [where 條件];
或者
truncate table 表名;

面試題:
刪除表中所有記錄使用delete from 表名,還是用truncate table 表名?
刪除方式:
delete 一條一條刪除昨寞,不清空auto_increment記錄數(shù)。
truncate 直接將表刪除,重新建表添瓷,auto_increment將置為零鳞贷,從新開始。

例如:

DELETE FROM sort WHERE sname='日用品';

#表數(shù)據(jù)清空

DELETE FROM sort;


  • DOS操作數(shù)據(jù)亂碼解決
    我們在dos命令行操作中文時搓幌,可能會報錯:
    insert into user(username,password) values(‘張三’,’123’);
    ERROR 1366 (HY000): Incorrect string value: '\xD5\xC5\xC8\xFD' for column 'username' at row 1
    原因:因為mysql的客戶端編碼的問題我們的是utf8,而系統(tǒng)的cmd窗口編碼是gbk
    解決方案(臨時解決方案):修改mysql客戶端編碼眷蚓。
    查看所有mysql的編碼:show variables like 'character%';

    查看所有mysql的編碼.png

  • 在圖中與客戶端有關(guān)的編碼設(shè)置:
    client connetion result 三個和客戶端相關(guān)
    database server system 三個和服務(wù)器端相關(guān)

  • 將客戶端編碼修改為gbk
    set character_set_results=gbk; / set names gbk;

以上操作鼻种,只針對當(dāng)前窗口有效果,如果關(guān)閉了服務(wù)器便失效沙热。如果想要永久修改叉钥,通過以下方式:

  • 在mysql安裝目錄下有my.ini文件
    default-character-set=gbk 客戶端編碼設(shè)置
    character-set-server=utf8 服務(wù)器端編碼設(shè)置
    注意:修改完成配置文件,重啟服務(wù)篙贸。

3.數(shù)據(jù)庫查詢語言-DQL

查詢語句爵川,在開發(fā)中使用的次數(shù)最多,此處使用“zhangwu” 賬務(wù)表。


創(chuàng)建賬務(wù)表:

CREATE TABLE zhangwu (

id INT PRIMARY KEY AUTO_INCREMENT, -- 賬務(wù)ID

name VARCHAR(200), -- 賬務(wù)名稱

money DOUBLE, -- 金額

);

插入表記錄:

INSERT INTO zhangwu(id,name,money) VALUES (1,'吃飯支出',247);

INSERT INTO zhangwu(id,name,money) VALUES (2,'工資收入',12345);

INSERT INTO zhangwu(id,name,money) VALUES (3,'服裝支出',1000);

INSERT INTO zhangwu(id,name,money) VALUES (4,'吃飯支出',325);

INSERT INTO zhangwu(id,name,money) VALUES (5,'股票收入',8000);

INSERT INTO zhangwu(id,name,money) VALUES (6,打麻將支出,8000);

INSERT INTO zhangwu(id,name,money) VALUES (7,null,5000);


  • 查詢指定字段信息
    select 字段1,字段2,...from 表名;
    例如:
    select id,name from zhangwu;

  • 查詢表中所有字段
    select * from 表名;
    例如:
    select * from zhangwu;
    注意:使用"*"在練習(xí)惦费、學(xué)習(xí)過程中可以使用,在實際開發(fā)中橡淑,不推薦使用男娄。原因,要查詢的字段信息不明確收擦,若字段數(shù)量很多叼旋,會導(dǎo)致查詢速度很慢陌兑。

  • distinct用于去除重復(fù)記錄
    select distinct 字段 from 表名;
    例如:
    select distinct money from zhangwu;

  • 別名查詢蒙畴,使用的as關(guān)鍵字著淆,as可以省略的.
    別名可以給表中的字段,表設(shè)置別名。
    當(dāng)查詢語句復(fù)雜時屠升,使用別名可以極大的簡便操作糙麦。

    1. 表別名格式:
      select * from 表名 as 別名;

      select * from 表名 別名;

    2.列別名格式:
    select 字段名 as 別名 from 表名;

    select 字段名 別名 from 表名;

例如
表別名:
select * from zhangwu as zw;
列別名:
select money as m from zhangwu;

select money m from zhangwu;

  • 我們在sql語句的操作中赡磅,可以直接對列進(jìn)行運算袒餐。
    例如:將所有賬務(wù)的金額+10000元進(jìn)行顯示.
    select pname,price+10000 from product;

  • 條件查詢
    where語句表條件過濾。滿足條件操作撵枢,不滿足不操作,多用于數(shù)據(jù)的查詢與修改精居。
    格式 :select 字段 from 表名 where 條件;
    where條件的種類如下:

    where條件

例如:

查詢所有吃飯支出記錄
SELECT * FROM zhangwu WHERE name = '吃飯支出';

查詢出金額大于1000的信息
SELECT * FROM zhangwu WHERE money >1000;

查詢出金額在2000-5000之間的賬務(wù)信息
SELECT * FROM zhangwu WHERE money >=2000 AND money <=5000;

SELECT * FROM zhangwu WHERE money BETWEEN 2000 AND 5000;

查詢出金額是1000或5000或3500的商品信息
SELECT * FROM zhangwu WHERE money =1000 OR money =5000 OR money =3500;

SELECT * FROM zhangwu WHERE money IN(1000,5000,3500);

查詢出賬務(wù)名稱包含”支出”的賬務(wù)信息锄禽。
SELECT * FROM zhangwu WHERE name LIKE "%支出%";

查詢出賬務(wù)名稱中是無五個字的賬務(wù)信息
SELECT * FROM gjp_ledger WHERE ldesc LIKE "_____"; -- 五個下劃線_

查詢出賬務(wù)名稱不為null賬務(wù)信息
SELECT * FROM zhangwu WHERE name IS NOT NULL;
SELECT * FROM zhangwu WHERE NOT (name IS NULL);

  • 排序
    通過order by語句,可以將查詢出的結(jié)果進(jìn)行排序靴姿。放置在select語句的最后沃但。
    格式:
    SELECT * FROM 表名 ORDER BY 字段 ASC;
    ASC 升序 (默認(rèn))
    DESC 降序

例如:

  1. 查詢所有的商品,按金額進(jìn)行排序.(asc-升序,desc-降序)
    select * from zhangwu order by money;

  2. 查詢名稱包含“支出”的賬務(wù)信息佛吓,并按金額降序排序.
    select * from zhangwu where name like '%支出%' order by money desc;

  • 聚合
    之前我們做的查詢都是橫向查詢宵晚,它們都是根據(jù)條件一行一行的進(jìn)行判斷灶搜,而使用聚合函數(shù)查詢是縱向查詢丙唧,它是對一列的值進(jìn)行計算狐胎,然后返回一個單一的值斤贰;另外聚合函數(shù)會忽略空值氛改。
    今天我們學(xué)習(xí)如下五個聚合函數(shù):
    count:統(tǒng)計指定列不為NULL的記錄行數(shù)快骗;
    sum:計算指定列的數(shù)值和误墓,如果指定列類型不是數(shù)值類型甫何,那么計算結(jié)果為0唁影;
    max:計算指定列的最大值耕陷,如果指定列是字符串類型,那么使用字符串排序運算据沈;
    min:計算指定列的最小值哟沫,如果指定列是字符串類型,那么使用字符串排序運算锌介;
    avg:計算指定列的平均值嗜诀,如果指定列類型不是數(shù)值類型,那么計算結(jié)果為0孔祸;

例如:

  1. 統(tǒng)計賬務(wù)表中共有多少條記錄
    SELECT COUNT(*) FROM zhangwu;

  2. 統(tǒng)計賬務(wù)表中金額大于3000的有多少條記錄
    SELECT COUNT(*) FROM zhangwu WHERE money>3000;

  3. 統(tǒng)計有多少收入的賬務(wù)信息
    SELECT SUM(money) FROM zhangwu WHERE name like '%收入%';

  4. 統(tǒng)計出記錄中支出的平均值
    SELECT AVG(money) FROM zhangwu where name like '%支出%';

  5. 統(tǒng)計出商品表中收入的最大與最小值
    SELECT MAX(money),MIN(money) FROM zhangwu;

  • 分組

分組查詢是指使用group by字句對查詢信息進(jìn)行分組,例如:我們要統(tǒng)計出zhanguw表中所有分類賬務(wù)的總數(shù)量,這時就需要使用group by 來對zhangwu表中的賬務(wù)信息根據(jù)parent進(jìn)行分組操作隆敢。
格式:
SELECT 字段1,字段2… FROM 表名 GROUP BY 字段 HAVING 條件;
分組操作中的having子語句,是用于在分組后對數(shù)據(jù)進(jìn)行過濾的崔慧,作用類似于where條件拂蝎。

having與where的區(qū)別:

  1. having是在分組后對數(shù)據(jù)進(jìn)行過濾.
    where是在分組前對數(shù)據(jù)進(jìn)行過濾

  2. having后面可以使用分組函數(shù)(統(tǒng)計函數(shù))
    where后面不可以使用分組函數(shù)。

例如:

  1. 對賬務(wù)分種類統(tǒng)計惶室,求出每個種類的賬務(wù)總金額
    SELECT parent,SUM(money) FROM zhangwu GROUP BY parent;

  2. 對賬務(wù)分種類統(tǒng)計温自,求出每個種類的賬務(wù)總金額玄货,金額要大于500才顯示
    SELECT parent,SUM(money) FROM zhangwu GROUP BY parent HAVING SUM(money)>500;

  • 分頁查詢
    • Oracle的分頁查詢:
      先介紹兩個概念

      1. rowid
        1. rowid在記錄創(chuàng)建時生成,而且是不變悼泌,直接指向硬件上的存儲位置
        2. 用rowid直接訪問是最快的松捉,但也是人力所無法做到的
        3. 只要記錄沒被搬動過,rowid是不變的
      2. rownum
        1. rownum是個偽列馆里,查詢的時候除非特別指定惩坑,否則不會顯示。
        2. 其主要的用處是控制查詢返回的行數(shù)
        3. 只能使用:<,<=
        4. 當(dāng)rownum和order by一起使用時也拜,會首先選出符合rownum條件的記錄以舒,然后再進(jìn)行排序,這會給我們的查詢帶來難度慢哈。
          示例:
          image.png
    • 分頁模板1
      SELECT * FROM (SELECT ROWNUM RN, T.* FROM (SELECT * FROM 表名 [ WHERE 條件 ] [ ORDER BY ]) T WHERE ROWNUM <= A) WHERE RN > B
      在實際開發(fā)中蔓钟,前臺只會發(fā)送一個要查詢的頁碼 而后再就是每頁顯示多少條
      頁碼 :currentPage;
      每頁顯示多少條 : pageSize;
      頁碼 currentPage pageSize A B
      1 1 5 5 0
      2 2 5 10 5
      3 3 5 15 10
      以上: A=currentPagepageSize
      B=(currentPage-1)
      pageSize

    • 分頁模板2
      SELECT * FROM (SELECT ROWNUM RN, T.* FROM (SELECT * FROM 表名 [ WHERE 條件 ] [ ORDER BY ]) T) WHERE RN BETWEEN A AND B
      頁碼 :currentPage;
      每頁顯示多少條 : pageSize;
      頁碼 currentPage pageSize A B
      1 1 5 1 5
      2 2 5 6 10
      3 3 5 11 15
      以上 A=(currentPage-1)pageSize+1
      B=currentPage
      pageSize

以上的兩種主法哪一種好?
模板1的速度快卵贱,隨著頁碼越來越從滥沫,速度將接近于模板2
模板2的速度慢,因為是第二個子查詢把所有數(shù)據(jù)都查詢出來

分頁實例:分頁按照薪水高低顯示數(shù)據(jù)键俱,每頁5條數(shù)據(jù)兰绣,顯示第2頁數(shù)據(jù)。

--1,按薪水高低排序
SELECT * FROM EMP ORDER BY SAL  DESC
--2编振,以上的查詢結(jié)果為基礎(chǔ)   再查詢出前10條數(shù)據(jù)
SELECT ROWNUM RN,T.* FROM (SELECT * FROM EMP ORDER BY SAL  DESC) T WHERE ROWNUM<=10;
--3,以上的的查詢結(jié)果上再套一層缀辩,查詢RN>5的數(shù)據(jù)
SELECT *
  FROM (SELECT ROWNUM RN, T.*
          FROM (SELECT * FROM EMP ORDER BY SAL DESC) T
         WHERE ROWNUM <= 10)
 WHERE RN > 5;
--4,第二種寫法
SELECT *
  FROM (SELECT ROWNUM RN, T.* FROM (SELECT * FROM EMP ORDER BY SAL DESC) T)
 WHERE RN BETWEEN 1 AND 5;


  • MySQL的分頁查詢:
    語法
    SELECT * FROM EMP LIMIT A,B;
    第一頁
    SELECT * FROM EMP LIMIT 0,5;
    第二頁
    select * from emp limit 5,10;
    CURRENTPAGE:當(dāng)前頁
    A=(CURRENTPAGE-1)*PAGESIZE
    B=PAGESIZE

4. 數(shù)據(jù)控制語言-DCL

因為MySQL和Oracle存儲方式有較大區(qū)別,所以它們管理用戶和權(quán)限的方式也有很大不同踪央。

4.1 MySql的用戶權(quán)限管理

Mysql中的用戶臀玄,存儲在系統(tǒng)數(shù)據(jù)庫mysql中的user表中,表初始內(nèi)容只有l(wèi)ocalhost-----root用戶畅蹂。

MySql的用戶管理
  • 創(chuàng)建用戶:
    Create user ‘用戶名’@‘允許登錄的地址/服務(wù)器’indentified by ‘密碼’健无;
    允許登錄的地址/服務(wù)器:允許該設(shè)定的位置,來使用設(shè)定的用戶名和密碼登錄液斜,其他位置不可以累贤。
    如:
    Create user ‘user1’@‘localhost’ indentifiedby ‘000’;
    (只有本地用戶可以使用用戶名和密碼登錄)
    Create user ‘user2’@‘192.168.40.37’ indentified by ‘000’少漆;
    (只有該地址192.168.40.37的用戶可以使用用戶名和密碼登錄)

  • 刪除用戶:
    Drop user ‘用戶名’@‘允許登錄的地址/服務(wù)器’臼膏;

  • 修改用戶密碼:
    修改自己的密碼:set password=password('密碼');
    修改他人的密碼(有權(quán)限的情況下):set password for '用戶名'@'允許登錄的地址/服務(wù)器'=password('密碼')检疫;

MySql的權(quán)限管理:

權(quán)限:mysql數(shù)據(jù)庫將其中所能做的所有操作都進(jìn)行分類讶请,分配到不同的權(quán)限(30多個)祷嘶,其中每個權(quán)限都用一個單詞表示屎媳。
如:select 表示查詢夺溢,delete表示刪除等,all表示所有權(quán)限

  • 授予權(quán)限:
    形式:
    grant 權(quán)限列表 on 某庫.某個對象 to '用戶名'@'允許登錄的地址/服務(wù)器' indentifiedby '密碼';
    說明:
    1.權(quán)限列表:就是多個權(quán)限的名詞烛谊,相互之間用逗號隔開风响。
    2.某庫.某對象:表示給指定的某個數(shù)據(jù)庫的某個下級單位(表名、視圖名丹禀、存儲過程名状勤,存儲函數(shù)名)授權(quán);
    特殊情況:
    *.*:代表所有數(shù)據(jù)中的所有下級單位
    某庫.*:代表指定的該庫中的所有下級單位
    3.indentified by '密碼':可省略双泪,表示授權(quán)的同時也可修改密碼持搜。如果該用戶不存在,表示創(chuàng)建一個新用戶焙矛。

如:
Grant select on php39.* to ’user1‘@’localhost’;

  • 剝奪權(quán)限:
    形式:
    revoke 權(quán)限列表 on 某庫.某個對象 from '用戶名'@'允許登錄的地址/服務(wù)器'葫盼;

4.2 Oracle中的用戶權(quán)限管理

安裝完Oracle之后系統(tǒng)為開發(fā)者提供了一些用戶如SCOTT SYSTE SYS等用戶,但是這都是系統(tǒng)給的村斟,能不能自己創(chuàng)建用戶呢?顯然是可以的贫导。
Oarcle的數(shù)據(jù)是存在放到目錄下的oraldata目錄下的DBF文件里面,那么可以不可以創(chuàng)建自己的存放數(shù)據(jù)庫的DBF文件呢蟆盹?顯然是可以孩灯。


oraldata目錄下的DBF
Oracle的表空間管理

Oracle的權(quán)限控制主要是對表空間的權(quán)限控制,即將表賦給某個用戶逾滥。所以我們先學(xué)習(xí)如何創(chuàng)建Oracle的表空間

1峰档,創(chuàng)建臨時表空間
create temporary tablespace erp_temp
tempfile 'D:\oracledata\erp_temp.dbf' DBF文件的位置自定義
size 50m 初始大小
autoextend on 大小自動增加
next 50m maxsize 20480m 每次增加的大小和最大空間
extent management local[本地管理]/dictionary[數(shù)據(jù)字典管理];

2,創(chuàng)建表空間
create tablespace erp_data
datafile 'D:\oracledata\erp_data.dbf'
size 50m
autoextend on
next 50m maxsize 20480m ;

3寨昙,修改表空間
語法: alter tablespace 舊名稱 rename to 新名稱;
alter tablespace newspace rename to myspace;

4面哥,刪除表空間,并把包含的數(shù)據(jù)和約束刪除
語法:drop tablespace 表空間名 [including contents and datafiles];
drop tablespace ERP_TEMP including CONTENTS AND DATAFILES;

5,查看表空間
select * from v$tablespace;

Oracle的用戶管理
  • 創(chuàng)建用戶
    create user erp identified by erp 創(chuàng)建一個用戶名為erp密碼為erp的用戶
    default tablespace erp_data 默認(rèn)的數(shù)據(jù)存放的表空間
    temporary tablespace erp_temp; 臨時的數(shù)據(jù)存放表空間

  • 刪除用戶
    drop user erp;

Oracle的權(quán)限管理
  • 添加權(quán)限
    grant connect,resource,dba to erp;

  • 取消權(quán)限
    revoke connect,resource,dba from erp;

  • 關(guān)于權(quán)限
    權(quán)限指執(zhí)行特定類型SQL 命令或訪問其他對象的權(quán)利
    角色是具有名稱的一組權(quán)限的組合
    常用系統(tǒng)預(yù)定義角色:
    1.CONNECT:臨時用戶
    2.RESOURCE:更為可靠和正式的用戶
    3.DBA:數(shù)據(jù)庫管理員角色毅待,擁有管理數(shù)據(jù)庫的最高權(quán)限

  • 開發(fā)中的注意點
    在開發(fā)中尚卫,系統(tǒng)集成開發(fā)會用到其它系統(tǒng)要能查詢當(dāng)前系統(tǒng)的表的功能,這時候一般是創(chuàng)建一個新的用戶給新用戶查詢的權(quán)限尸红,而不會把當(dāng)前系統(tǒng)的用戶給別人.
    grant select any table to test(用戶名需要查詢表的用戶);
    使用用戶test去訪問別的用戶下(如test2)的T表的時候
    select * from test2.T(表名);

四吱涉、創(chuàng)建多表及多表關(guān)系

【外鍵約束】
多個表之間是有關(guān)系的,那么關(guān)系靠誰來維護?
多表約束:外鍵約束.
alter table product add foreign key (cno) references category(cid);
【多表的關(guān)系】

  • 一對多關(guān)系:
    客戶和訂單外里,分類和商品怎爵,部門和員工.
    一對多建表原則:在多的一方創(chuàng)建一個字段,字段作為外鍵指向一的一方的主鍵.
  • 多對多關(guān)系:
    學(xué)生和課程:
    多對多關(guān)系建表原則:需要創(chuàng)建第三張表,中間表中至少兩個字段盅蝗,這兩個字段分別作為外鍵指向各自一方的主鍵.
  • 一對一關(guān)系:
    在實際的開發(fā)中應(yīng)用不多.因為一對一可以創(chuàng)建成一張表.
    兩種建表原則:
    唯一外鍵對應(yīng):假設(shè)一對一是一個一對多的關(guān)系鳖链,在多的一方創(chuàng)建一個外鍵指向一的一方的主鍵,將外鍵設(shè)置為unique.
    主鍵對應(yīng):讓一對一的雙方的主鍵進(jìn)行建立關(guān)系.

1. 網(wǎng)上商城案例實體抽取和表關(guān)系建立

網(wǎng)上商城案例實體抽取和表關(guān)系建立.png
一對多的實現(xiàn)

###創(chuàng)建分類表(已存在)
create table category(
  cid varchar(32) PRIMARY KEY ,
  cname varchar(100)        #分類名稱
);

# 商品表(已存在,刪除芙委,重新創(chuàng)建)
CREATE TABLE `products` (
  `pid` varchar(32) PRIMARY KEY  ,
  `name` VARCHAR(40) ,
  `price` DOUBLE 
);

#添加外鍵字段
alter table products add column category_id varchar(32);

#添加約束
alter table products add constraint product_fk foreign key (category_id) references category (cid);



多對多的實現(xiàn)
### 訂單表
create table `orders`(
  `oid` varchar(32) PRIMARY KEY ,
  `totalprice` double   #總計
);

### 訂單項表
create table orderitem(
  oid varchar(50),-- 訂單id
  pid varchar(50)-- 商品id
);
### 聯(lián)合主鍵(可省略)
alter table `orderitem` add primary key (oid,pid);

###---- 訂單表和訂單項表的主外鍵關(guān)系
alter table `orderitem` add constraint orderitem_orders_fk foreign key (oid) references orders(oid);

###---- 商品表和訂單項表的主外鍵關(guān)系
alter table `orderitem` add constraint orderitem_product_fk foreign key (pid) references products(pid);


初始化數(shù)據(jù)
-- 給商品表初始化數(shù)據(jù)
insert into products(pid,name,price,category_id) values('p001','聯(lián)想',5000,'c001');
insert into products(pid,name,price,category_id) values('p002','海爾',3000,'c001');
insert into products(pid,name,price,category_id) values('p003','雷神',5000,'c001');
insert into products(pid,name,price,category_id) values('p004','JACK JONES',800,'c002');
insert into products(pid,name,price,category_id) values('p005','真維斯',200,'c002');
insert into products(pid,name,price,category_id) values('p006','花花公子',440,'c002');
insert into products(pid,name,price,category_id) values('p007','勁霸',2000,'c002');
insert into products(pid,name,price,category_id) values('p008','香奈兒',800,'c003');
insert into products(pid,name,price,category_id) values('p009','相宜本草',200,'c003');
insert into products(pid,name,price,category_id) values('p010','梅明子',200,null);


-- 給分類表初始化數(shù)據(jù)
insert into category values('c001','電器');
insert into category values('c002','服飾');
insert into category values('c003','化妝品');
insert into category values('c004','書籍');

2. 使用商城表關(guān)系完成多表的查詢

【多表查詢】

  • 交叉連接查詢(基本不會使用-得到的是兩個表的乘積)
    語法:
    select * from A,B;

  • 內(nèi)連接查詢(使用的關(guān)鍵字 inner join -- inner可以省略)

    • 隱式內(nèi)連接:
      select * from A,B where 條件;
    • 顯示內(nèi)連接:
      select * from A inner join B on 條件;
  • 外連接查詢(使用的關(guān)鍵字 outer join -- outer可以省略)

    • 左外連接:left join
      select * from A left join B on 條件;
    • 右外連接:right join
      select * from A right join B on 條件;

我們以一對多為例來練習(xí)一下

初始化數(shù)據(jù):
-- 用戶表(user) 
   create table `user` (                                  
          `id` int auto_increment primary key,                
          `username` varchar(50)  -- 用戶姓名                                                
        );

-- 訂單表(orders)
   create table `orders` (                                                  
          `id` int  auto_increment primary key,                                  
          `price` double,                                           
          `user_id` int                                       
        );
-- 給訂單表添加外鍵約束
alter table orders add constraint user_fk foreign key (user_id) references user(id); 

-- 向user表中添加數(shù)據(jù)
        insert into user values(3,'張三');
        insert into user values(4,'李四');
        insert into user values(5,'王五');
        insert into user values(6,'趙六');

-- 向orders 表中插入數(shù)據(jù)
        insert into orders values(1,1314,3);
        insert into orders values(2,1314,3);
        insert into orders values(3,15,4);
        insert into orders values(4,315,5);
        insert into orders values(5,1014,null);

【子查詢】
在sql語言中逞敷,當(dāng)一個查詢是另一個查詢的條件時,稱之為子查詢

【分頁查詢】
分頁查詢每個數(shù)據(jù)庫的語句是不通用的.

MYSQL:使用limit的關(guān)鍵字.
select * from product limit a,b;
--a:從哪開始,b:查詢多少條.

Oracle:使用SQL語句嵌套.
SQLServer:使用top的關(guān)鍵字.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末灌侣,一起剝皮案震驚了整個濱河市推捐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌侧啼,老刑警劉巖牛柒,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異痊乾,居然都是意外死亡皮壁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進(jìn)店門哪审,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闪彼,“玉大人,你說我怎么就攤上這事协饲∥吠螅” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵茉稠,是天一觀的道長描馅。 經(jīng)常有香客問我,道長而线,這世上最難降的妖魔是什么铭污? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮膀篮,結(jié)果婚禮上嘹狞,老公的妹妹穿的比我還像新娘。我一直安慰自己誓竿,他們只是感情好磅网,可當(dāng)我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著筷屡,像睡著了一般涧偷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上毙死,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天燎潮,我揣著相機與錄音,去河邊找鬼扼倘。 笑死确封,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播爪喘,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼颜曾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了腥放?” 一聲冷哼從身側(cè)響起泛啸,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤绿语,失蹤者是張志新(化名)和其女友劉穎秃症,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吕粹,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡种柑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了匹耕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片聚请。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖稳其,靈堂內(nèi)的尸體忽然破棺而出驶赏,到底是詐尸還是另有隱情,我是刑警寧澤既鞠,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布煤傍,位于F島的核電站,受9級特大地震影響嘱蛋,放射性物質(zhì)發(fā)生泄漏蚯姆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一洒敏、第九天 我趴在偏房一處隱蔽的房頂上張望龄恋。 院中可真熱鬧,春花似錦凶伙、人聲如沸郭毕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽铣卡。三九已至,卻和暖如春偏竟,著一層夾襖步出監(jiān)牢的瞬間煮落,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工踊谋, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蝉仇,地道東北人。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像轿衔,于是被迫代替她去往敵國和親沉迹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容