国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
MySQL基礎(chǔ)入門
一、數(shù)據(jù)庫(kù)1 數(shù)據(jù)庫(kù)概念(了解)
1.1 什么是數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)就是用來(lái)存儲(chǔ)和管理數(shù)據(jù)的倉(cāng)庫(kù)!
數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù)的優(yōu)先:
l  可存儲(chǔ)大量數(shù)據(jù);
l  方便檢索;
l  保持?jǐn)?shù)據(jù)的一致性、完整性;
l  安全,可共享;
l  通過(guò)組合分析,可產(chǎn)生新數(shù)據(jù)。
數(shù)據(jù)庫(kù)具有原子性,數(shù)據(jù)不可再分割!
1.2 數(shù)據(jù)庫(kù)的發(fā)展歷程
l  沒(méi)有數(shù)據(jù)庫(kù),使用磁盤文件存儲(chǔ)數(shù)據(jù);
l  層次結(jié)構(gòu)模型數(shù)據(jù)庫(kù) ;
l  網(wǎng)狀結(jié)構(gòu)模型數(shù)據(jù)庫(kù);
l  關(guān)系結(jié)構(gòu)模型數(shù)據(jù)庫(kù):使用二維表格來(lái)存儲(chǔ)數(shù)據(jù);
l  關(guān)系-對(duì)象模型數(shù)據(jù)庫(kù);
MySQL就是關(guān)系型數(shù)據(jù)庫(kù)!
1.3 常見(jiàn)數(shù)據(jù)庫(kù)
l  Oracle:甲骨文;
l  DB2:IBM;
l  SQL Server:微軟;
l  Sybase:賽爾斯;
l  MySQL:甲骨文;
1.4 理解數(shù)據(jù)庫(kù)
我們現(xiàn)在所說(shuō)的數(shù)據(jù)庫(kù)泛指”關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS - Relational database management system)”,即“數(shù)據(jù)庫(kù)服務(wù)器”。
當(dāng)我們安裝了數(shù)據(jù)庫(kù)服務(wù)器后,就可以在數(shù)據(jù)庫(kù)服務(wù)器中創(chuàng)建數(shù)據(jù)庫(kù),每個(gè)數(shù)據(jù)庫(kù)中還可以包含多張表。
數(shù)據(jù)庫(kù)表就是一個(gè)多行多列的表格。在創(chuàng)建表時(shí),需要指定表的列數(shù),以及列名稱,列類型等信息。而不用指定表格的行數(shù),行數(shù)是沒(méi)有上限的。下面是tab_student表的結(jié)構(gòu):
當(dāng)把表格創(chuàng)建好了之后,就可以向表格中添加數(shù)據(jù)了。向表格添加數(shù)據(jù)是以行為單位的!下面是s_student表的記錄:
大家要學(xué)會(huì)區(qū)分什么是表結(jié)構(gòu),什么是表記錄。
1.5 應(yīng)用程序與數(shù)據(jù)庫(kù)
應(yīng)用程序使用數(shù)據(jù)庫(kù)完成對(duì)數(shù)據(jù)的存儲(chǔ)!
2 安裝MySQL數(shù)據(jù)庫(kù)
2.1 安裝MySQL
參考:MySQL安裝圖解.doc
2.2 MySQL目錄結(jié)構(gòu)
MySQL的數(shù)據(jù)存儲(chǔ)目錄為data,data目錄通常在C:\Documents and Settings\All Users\Application Data\MySQL\MySQL Server 5.1\data位置。在data下的每個(gè)目錄都代表一個(gè)數(shù)據(jù)庫(kù)。
MySQL的安裝目錄下:
l  bin目錄中都是可執(zhí)行文件;
l  my.ini文件是MySQL的配置文件;
3 基本命令
3.1 啟動(dòng)和關(guān)閉mysql服務(wù)器
l  啟動(dòng):net start mysql(后面不加分號(hào));
l
l  關(guān)閉:net stop mysql(后面不加分號(hào));
在啟動(dòng)mysql服務(wù)后,打開(kāi)windows任務(wù)管理器,會(huì)有一個(gè)名為mysqld.exe的進(jìn)程運(yùn)行,所以mysqld.exe才是MySQL服務(wù)器程序。
3.2 客戶端登錄退出mysql
在啟動(dòng)MySQL服務(wù)器后,我們需要使用管理員用戶登錄MySQL服務(wù)器,然后來(lái)對(duì)服務(wù)器進(jìn)行操作。登錄MySQL需要使用MySQL的客戶端程序:mysql.exe
l  登錄:mysql -u root -p 123 -h localhost;
-u:后面的root是用戶名,這里使用的是超級(jí)管理員root;
-p:后面的123是密碼,這是在安裝MySQL時(shí)就已經(jīng)指定的密碼;
-h:后面給出的localhost是服務(wù)器主機(jī)名,它是可以省略的,例如:mysql -u root -p 123;
l  退出:quit或exit;
在登錄成功后,打開(kāi)windows任務(wù)管理器,會(huì)有一個(gè)名為mysql.exe的進(jìn)程運(yùn)行,所以mysql.exe是客戶端程序。Q
二、SQL語(yǔ)句
1        SQL概述
1.1 什么是SQL
SQL(Structured Query Language)是“結(jié)構(gòu)化查詢語(yǔ)言”,它是對(duì)關(guān)系型數(shù)據(jù)庫(kù)的操作語(yǔ)言。它可以應(yīng)用到所有關(guān)系型數(shù)據(jù)庫(kù)中,例如:MySQL、Oracle、SQL Server等。SQ標(biāo)準(zhǔn)(ANSI/ISO)有:
l  SQL-92:1992年發(fā)布的SQL語(yǔ)言標(biāo)準(zhǔn);
l  SQL:1999:1999年發(fā)布的SQL語(yǔ)言標(biāo)簽;
l  SQL:2003:2003年發(fā)布的SQL語(yǔ)言標(biāo)簽;
這些標(biāo)準(zhǔn)就與JDK的版本一樣,在新的版本中總要有一些語(yǔ)法的變化。不同時(shí)期的數(shù)據(jù)庫(kù)對(duì)不同標(biāo)準(zhǔn)做了實(shí)現(xiàn)。
雖然SQL可以用在所有關(guān)系型數(shù)據(jù)庫(kù)中,但很多數(shù)據(jù)庫(kù)還都有標(biāo)準(zhǔn)之后的一些語(yǔ)法,我們可以稱之為“方言”。例如MySQL中的LIMIT語(yǔ)句就是MySQL獨(dú)有的方言,其它數(shù)據(jù)庫(kù)都不支持!當(dāng)然,Oracle或SQL Server都有自己的方言。
1.2 語(yǔ)法要求
l  SQL語(yǔ)句可以單行或多行書(shū)寫(xiě),以分號(hào)結(jié)尾;
l  可以用空格和縮進(jìn)來(lái)來(lái)增強(qiáng)語(yǔ)句的可讀性;
l  關(guān)鍵字不區(qū)別大小寫(xiě),建議使用大寫(xiě);
2 分類
l  DDL(Data Definition Language):數(shù)據(jù)定義語(yǔ)言,用來(lái)定義數(shù)據(jù)庫(kù)對(duì)象:庫(kù)、表、列等;
l  DML(Data Manipulation Language):數(shù)據(jù)操作語(yǔ)言,用來(lái)定義數(shù)據(jù)庫(kù)記錄(數(shù)據(jù));
l  DCL(Data Control Language):數(shù)據(jù)控制語(yǔ)言,用來(lái)定義訪問(wèn)權(quán)限和安全級(jí)別;
l  DQL(Data Query Language):數(shù)據(jù)查詢語(yǔ)言,用來(lái)查詢記錄(數(shù)據(jù))。
3 DDL
3.1 基本操作
l  查看所有數(shù)據(jù)庫(kù)名稱:SHOW DATABASES;
l  切換數(shù)據(jù)庫(kù):USE mydb1,切換到mydb1數(shù)據(jù)庫(kù);
3.2 操作數(shù)據(jù)庫(kù)
l  創(chuàng)建數(shù)據(jù)庫(kù):CREATE DATABASE [IF NOT EXISTS] mydb1;
創(chuàng)建數(shù)據(jù)庫(kù),例如:CREATE DATABASE mydb1,創(chuàng)建一個(gè)名為mydb1的數(shù)據(jù)庫(kù)。如果這個(gè)數(shù)據(jù)已經(jīng)存在,那么會(huì)報(bào)錯(cuò)。例如CREATE DATABASE IF NOT EXISTS mydb1,在名為mydb1的數(shù)據(jù)庫(kù)不存在時(shí)創(chuàng)建該庫(kù),這樣可以避免報(bào)錯(cuò)。
l  刪除數(shù)據(jù)庫(kù):DROP DATABASE [IF EXISTS] mydb1;
刪除數(shù)據(jù)庫(kù),例如:DROP DATABASE mydb1,刪除名為mydb1的數(shù)據(jù)庫(kù)。如果這個(gè)數(shù)據(jù)庫(kù)不存在,那么會(huì)報(bào)錯(cuò)。DROP DATABASE IF EXISTS mydb1,就算mydb1不存在,也不會(huì)的報(bào)錯(cuò)。
l  修改數(shù)據(jù)庫(kù)編碼:ALTER DATABASE mydb1 CHARACTER SET utf8
修改數(shù)據(jù)庫(kù)mydb1的編碼為utf8。注意,在MySQL中所有的UTF-8編碼都不能使用中間的“-”,即UTF-8要書(shū)寫(xiě)為UTF8。
3.3 數(shù)據(jù)(列)類型
MySQL與Java一樣,也有數(shù)據(jù)類型。MySQL中數(shù)據(jù)類型主要應(yīng)用在列上。
常用類型:
l  int:整型
l  double:浮點(diǎn)型,例如double(5,2)表示最多5位,其中必須有2位小數(shù),即最大值為999.99;
l  decimal:浮點(diǎn)型,在表示錢方面使用該類型,因?yàn)椴粫?huì)出現(xiàn)精度缺失問(wèn)題;
l  char:固定長(zhǎng)度字符串類型;
l  varchar:可變長(zhǎng)度字符串類型;
l  text:字符串類型;
l  blob:字節(jié)類型;
l  date:日期類型,格式為:yyyy-MM-dd;
l  time:時(shí)間類型,格式為:hh:mm:ss
l  datatime:時(shí)間戳類型;
3.4 操作表
l  創(chuàng)建表:
CREATE TABLE 表名(
列名 列類型,
列名 列類型,
......
);
例如:
CREATE TABLE stu(
sid        CHAR(6),
sname      VARCHAR(20),
age            INT,
gender     VARCHAR(10)
);
再例如:
CREATE TABLE emp(
eid             CHAR(6),
ename     VARCHAR(50),
age            INT,
gender     VARCHAR(6),
birthday  DATE,
hiredate  DATE,
salary       DECIMAL(7,2),
resume    VARCHAR(1000)
);
l  查看當(dāng)前數(shù)據(jù)庫(kù)中所有表名稱:SHOW TABLES;
l  查看指定表的創(chuàng)建語(yǔ)句:SHOW CREATE TABLE emp,查看emp表的創(chuàng)建語(yǔ)句;
l  查看表結(jié)構(gòu):DESC emp,查看emp表結(jié)構(gòu);
l  刪除表:DROP TABLE emp,刪除emp表;
l  修改表:
修改之添加列:給stu表添加classname列:
ALTER TABLE stu ADD (classname varchar(100));
修改之修改列類型:修改stu表的gender列類型為CHAR(2):
ALTER TABLE stu MODIFY gender CHAR(2);
修改之修改列名:修改stu表的gender列名為sex:
ALTER TABLE stu change gender sex CHAR(2);
修改之刪除列:刪除stu表的classname列:
ALTER TABLE stu DROP classname;
修改之修改表名稱:修改stu表名稱為student:
ALTER TABLE stu RENAME TO student;
4 DML
4.1 插入數(shù)據(jù)
語(yǔ)法:INSERT INTO 表名(列名1,列名2, …) VALUES(值1, 值2)
INSERT INTO stu(sid, sname,age,gender) VALUES('s_1001', 'zhangSan', 23, 'male');
語(yǔ)法:
INSERT INTO 表名 VALUES(值1,值2,…)
因?yàn)闆](méi)有指定要插入的列,表示按創(chuàng)建表時(shí)列的順序插入所有列的值:
INSERT INTO stu VALUES('s_1002', 'liSi', 32, 'female');
注意:所有字符串?dāng)?shù)據(jù)必須使用單引用!
4.2 修改數(shù)據(jù)
語(yǔ)法:
UPDATE 表名 SET 列名1=值1, … 列名n=值n [WHERE 條件]
UPDATE stu SET sname=’zhangSanSan’, age=’32’, gender=’female’ WHERE sid=’s_1001’;
UPDATE stu SET sname=’liSi’, age=’20’ WHERE age>50 AND gender=’male’;
UPDATE stu SET sname=’wangWu’, age=’30’ WHERE age>60 OR gender=’female’;
UPDATE stu SET gender=’female’ WHERE gender IS NULL
UPDATE stu SET age=age+1 WHERE sname=’zhaoLiu’;
4.3 刪除數(shù)據(jù)
語(yǔ)法:
DELETE FROM 表名 [WHERE 條件]
DELETE FROM stu WHERE sid=’s_1001’003B
DELETE FROM stu WHERE sname=’chenQi’ OR age > 30;
DELETE FROM stu;
語(yǔ)法:
TRUNCATE TABLE 表名
TRUNCATE TABLE stu;
雖然TRUNCATE和DELETE都可以刪除表的所有記錄,但有原理不同。DELETE的效率沒(méi)有TRUNCATE高!
TRUNCATE其實(shí)屬性DDL語(yǔ)句,因?yàn)樗窍菵ROP TABLE,再CREATE TABLE。而且TRUNCATE刪除的記錄是無(wú)法回滾的,但DELETE刪除的記錄是可以回滾的(回滾是事務(wù)的知識(shí)?。?div style="height:15px;">
5 DCL
5.1 創(chuàng)建用戶
語(yǔ)法:
CREATE USER 用戶名@地址 IDENTIFIED BY '密碼';
CREATE USER user1@localhost IDENTIFIED BY ‘123’;
CREATE USER user2@’%’ IDENTIFIED BY ‘123’;
5.2 給用戶授權(quán)
語(yǔ)法:
GRANT 權(quán)限1, … , 權(quán)限n ON 數(shù)據(jù)庫(kù).* TO 用戶名
GRANT CREATE,ALTER,DROP,INSERT,UPDATE,DELETE,SELECT ON mydb1.* TO user1@localhost;
GRANT ALL ON mydb1.* TO user2@localhost;
5.3 撤銷授權(quán)
語(yǔ)法:
REVOKE權(quán)限1, … , 權(quán)限n ON 數(shù)據(jù)庫(kù).* FORM 用戶名
REVOKE CREATE,ALTER,DROP ON mydb1.* FROM user1@localhost;
5.4 查看用戶權(quán)限
語(yǔ)法:
SHOW GRANTS FOR 用戶名
SHOW GRANTS FOR user1@localhost;
5.5 刪除用戶
語(yǔ)法:
DROP USER 用戶名
DROP USER user1@localhost;
5.6 修改用戶密碼
語(yǔ)法:
USE mysql;
UPDATE USER SET PASSWORD=PASSWORD(‘密碼’) WHERE User=’用戶名’ and Host=’IP’;
FLUSH PRIVILEGES;
UPDATE USER SET PASSWORD=PASSWORD('1234') WHERE User='user2' and Host=’localhost’;
FLUSH PRIVILEGES;
三、數(shù)據(jù)查詢語(yǔ)法(DQL)
DQL就是數(shù)據(jù)查詢語(yǔ)言,數(shù)據(jù)庫(kù)執(zhí)行DQL語(yǔ)句不會(huì)對(duì)數(shù)據(jù)進(jìn)行改變,而是讓數(shù)據(jù)庫(kù)發(fā)送結(jié)果集給客戶端。
語(yǔ)法:
SELECT selection_list /*要查詢的列名稱*/
FROM table_list /*要查詢的表名稱*/
WHERE condition /*行條件*/
GROUP BY grouping_columns /*對(duì)結(jié)果分組*/
HAVING condition /*分組后的行條件*/
ORDER BY sorting_columns /*對(duì)結(jié)果分組*/
LIMIT offset_start, row_count /*結(jié)果限定*/
創(chuàng)建名:
學(xué)生表:stu
字段名稱
字段類型
說(shuō)明
sid
char(6)
學(xué)生學(xué)號(hào)
sname
varchar(50)
學(xué)生姓名
age
int
學(xué)生年齡
gender
varchar(50)
學(xué)生性別
CREATE TABLE stu (
sid    CHAR(6),
sname               VARCHAR(50),
age            INT,
gender     VARCHAR(50)
);
INSERT INTO stu VALUES('S_1001', 'liuYi', 35, 'male');
INSERT INTO stu VALUES('S_1002', 'chenEr', 15, 'female');
INSERT INTO stu VALUES('S_1003', 'zhangSan', 95, 'male');
INSERT INTO stu VALUES('S_1004', 'liSi', 65, 'female');
INSERT INTO stu VALUES('S_1005', 'wangWu', 55, 'male');
INSERT INTO stu VALUES('S_1006', 'zhaoLiu', 75, 'female');
INSERT INTO stu VALUES('S_1007', 'sunQi', 25, 'male');
INSERT INTO stu VALUES('S_1008', 'zhouBa', 45, 'female');
INSERT INTO stu VALUES('S_1009', 'wuJiu', 85, 'male');
INSERT INTO stu VALUES('S_1010', 'zhengShi', 5, 'female');
INSERT INTO stu VALUES('S_1011', 'xxx', NULL, NULL);
雇員表:emp
字段名稱
字段類型
說(shuō)明
empno
int
員工編號(hào)
ename
varchar(50)
員工姓名
job
varchar(50)
員工工作
mgr
int
領(lǐng)導(dǎo)編號(hào)
hiredate
date
入職日期
sal
decimal(7,2)
月薪
comm
decimal(7,2)
獎(jiǎng)金
deptno
int
部分編號(hào)
CREATE TABLE emp(
empno               INT,
ename               VARCHAR(50),
job             VARCHAR(50),
mgr           INT,
hiredate   DATE,
sal             DECIMAL(7,2),
comm                decimal(7,2),
deptno               INT
) ;
INSERT INTO emp values(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
INSERT INTO emp values(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
INSERT INTO emp values(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
INSERT INTO emp values(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
INSERT INTO emp values(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
INSERT INTO emp values(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);
INSERT INTO emp values(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);
INSERT INTO emp values(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20);
INSERT INTO emp values(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
INSERT INTO emp values(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);
INSERT INTO emp values(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20);
INSERT INTO emp values(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30);
INSERT INTO emp values(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20);
INSERT INTO emp values(7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);
部門表:dept
字段名稱
字段類型
說(shuō)明
deptno
int
部分編碼
dname
varchar(50)
部分名稱
loc
varchar(50)
部分所在地點(diǎn)
CREATE TABLE dept(
deptno               INT,
dname               varchar(14),
loc             varchar(13)
);
INSERT INTO dept values(10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO dept values(20, 'RESEARCH', 'DALLAS');
INSERT INTO dept values(30, 'SALES', 'CHICAGO');
INSERT INTO dept values(40, 'OPERATIONS', 'BOSTON');
1 基礎(chǔ)查詢
1.1 查詢所有列
SELECT * FROM stu;
1.2 查詢指定列
SELECT sid, sname, age FROM stu;
2 條件查詢
2.1 條件查詢介紹
條件查詢就是在查詢時(shí)給出WHERE子句,在WHERE子句中可以使用如下運(yùn)算符及關(guān)鍵字:
l  =、!=、、、>=;
l  BETWEEN…AND;
l  IN(set);
l  IS NULL;
l  AND;
l  OR;
l  NOT;
2.2 查詢性別為女,并且年齡50的記錄
SELECT * FROM stu
WHERE gender='female' AND age
2.3 查詢學(xué)號(hào)為S_1001,或者姓名為liSi的記錄
SELECT * FROM stu
WHERE sid ='S_1001' OR sname='liSi';
2.4 查詢學(xué)號(hào)為S_1001,S_1002,S_1003的記錄
SELECT * FROM stu
WHERE sid IN ('S_1001','S_1002','S_1003');
2.5 查詢學(xué)號(hào)不是S_1001,S_1002,S_1003的記錄
SELECT * FROM tab_student
WHERE s_number NOT IN ('S_1001','S_1002','S_1003');
2.6 查詢年齡為null的記錄
SELECT * FROM stu
WHERE age IS NULL;
2.7 查詢年齡在20到40之間的學(xué)生記錄
SELECT *
FROM stu
WHERE age>=20 AND age
或者
SELECT *
FROM stu
WHERE age BETWEEN 20 AND 40;
2.8 查詢性別非男的學(xué)生記錄
SELECT *
FROM stu
WHERE gender!='male';
或者
SELECT *
FROM stu
WHERE gender'male';
或者
SELECT *
FROM stu
WHERE NOT gender='male';
2.9 查詢姓名不為null的學(xué)生記錄
SELECT *
FROM stu
WHERE NOT sname IS NULL;
或者
SELECT *
FROM stu
WHERE sname IS NOT NULL;
3 模糊查詢
當(dāng)想查詢姓名中包含a字母的學(xué)生時(shí)就需要使用模糊查詢了。模糊查詢需要使用關(guān)鍵字LIKE。
3.1 查詢姓名由5個(gè)字母構(gòu)成的學(xué)生記錄
SELECT *
FROM stu
WHERE sname LIKE '_____';
模糊查詢必須使用LIKE關(guān)鍵字。其中 “_”匹配任意一個(gè)字母,5個(gè)“_”表示5個(gè)任意字母。
3.2 查詢姓名由5個(gè)字母構(gòu)成,并且第5個(gè)字母為“i”的學(xué)生記錄
SELECT *
FROM stu
WHERE sname LIKE '____i';
3.3 查詢姓名以“z”開(kāi)頭的學(xué)生記錄
SELECT *
FROM stu
WHERE sname LIKE 'z%';
其中“%”匹配0~n個(gè)任何字母。
3.4 查詢姓名中第2個(gè)字母為“i”的學(xué)生記錄
SELECT *
FROM stu
WHERE sname LIKE '_i%';
3.5 查詢姓名中包含“a”字母的學(xué)生記錄
SELECT *
FROM stu
WHERE sname LIKE '%a%';
4 字段控制查詢
4.1 去除重復(fù)記錄
去除重復(fù)記錄(兩行或兩行以上記錄中系列的上的數(shù)據(jù)都相同),例如emp表中sal字段就存在相同的記錄。當(dāng)只查詢emp表的sal字段時(shí),那么會(huì)出現(xiàn)重復(fù)記錄,那么想去除重復(fù)記錄,需要使用DISTINCT:
SELECT DISTINCT sal FROM emp;
4.2 查看雇員的月薪與傭金之和
因?yàn)閟al和comm兩列的類型都是數(shù)值類型,所以可以做加運(yùn)算。如果sal或comm中有一個(gè)字段不是數(shù)值類型,那么會(huì)出錯(cuò)。
SELECT *,sal+comm FROM emp;
comm列有很多記錄的值為NULL,因?yàn)槿魏螙|西與NULL相加結(jié)果還是NULL,所以結(jié)算結(jié)果可能會(huì)出現(xiàn)NULL。下面使用了把NULL轉(zhuǎn)換成數(shù)值0的函數(shù)IFNULL:
SELECT *,sal+IFNULL(comm,0) FROM emp;
4.3 給列名添加別名
在上面查詢中出現(xiàn)列名為sal+IFNULL(comm,0),這很不美觀,現(xiàn)在我們給這一列給出一個(gè)別名,為total:
SELECT *, sal+IFNULL(comm,0) AS total FROM emp;
給列起別名時(shí),是可以省略AS關(guān)鍵字的:
SELECT *,sal+IFNULL(comm,0) total FROM emp;
5 排序
5.1 查詢所有學(xué)生記錄,按年齡升序排序
SELECT *
FROM stu
ORDER BY sage ASC;
或者
SELECT *
FROM stu
ORDER BY sage;
5.2 查詢所有學(xué)生記錄,按年齡降序排序
SELECT *
FROM stu
ORDER BY age DESC;
5.3 查詢所有雇員,按月薪降序排序,如果月薪相同時(shí),按編號(hào)升序排序
SELECT * FROM emp
ORDER BY sal DESC,empno ASC;
6 聚合函數(shù)
聚合函數(shù)是用來(lái)做縱向運(yùn)算的函數(shù):
l  COUNT():統(tǒng)計(jì)指定列不為NULL的記錄行數(shù);
l  MAX():計(jì)算指定列的最大值,如果指定列是字符串類型,那么使用字符串排序運(yùn)算;
l  MIN():計(jì)算指定列的最小值,如果指定列是字符串類型,那么使用字符串排序運(yùn)算;
l  SUM():計(jì)算指定列的數(shù)值和,如果指定列類型不是數(shù)值類型,那么計(jì)算結(jié)果為0;
l  AVG():計(jì)算指定列的平均值,如果指定列類型不是數(shù)值類型,那么計(jì)算結(jié)果為0;
6.1 COUNT
當(dāng)需要縱向統(tǒng)計(jì)時(shí)可以使用COUNT()。
l  查詢emp表中記錄數(shù):
SELECT COUNT(*) AS cnt FROM emp;
l  查詢emp表中有傭金的人數(shù):
SELECT COUNT(comm) cnt FROM emp;
注意,因?yàn)閏ount()函數(shù)中給出的是comm列,那么只統(tǒng)計(jì)comm列非NULL的行數(shù)。
l  查詢emp表中月薪大于2500的人數(shù):
SELECT COUNT(*) FROM emp
WHERE sal > 2500;
l  統(tǒng)計(jì)月薪與傭金之和大于2500元的人數(shù):
SELECT COUNT(*) AS cnt FROM emp WHERE sal+IFNULL(comm,0) > 2500;
l  查詢有傭金的人數(shù),以及有領(lǐng)導(dǎo)的人數(shù):
SELECT COUNT(comm), COUNT(mgr) FROM emp;
6.2 SUM和AVG
當(dāng)需要縱向求和時(shí)使用sum()函數(shù)。
l  查詢所有雇員月薪和:
SELECT SUM(sal) FROM emp;
l  查詢所有雇員月薪和,以及所有雇員傭金和:
SELECT SUM(sal), SUM(comm) FROM emp;
l  查詢所有雇員月薪+傭金和:
SELECT SUM(sal+IFNULL(comm,0)) FROM emp;
l  統(tǒng)計(jì)所有員工平均工資:
SELECT SUM(sal), COUNT(sal) FROM emp;
或者
SELECT AVG(sal) FROM emp;
6.3 MAX和MIN
l  查詢最高工資和最低工資:
SELECT MAX(sal), MIN(sal) FROM emp;
7 分組查詢
當(dāng)需要分組查詢時(shí)需要使用GROUP BY子句,例如查詢每個(gè)部門的工資和,這說(shuō)明要使用部分來(lái)分組。
7.1 分組查詢
l  查詢每個(gè)部門的部門編號(hào)和每個(gè)部門的工資和:
SELECT deptno, SUM(sal)
FROM emp
GROUP BY deptno;
l  查詢每個(gè)部門的部門編號(hào)以及每個(gè)部門的人數(shù):
SELECT deptno,COUNT(*)
FROM emp
GROUP BY deptno;
l  查詢每個(gè)部門的部門編號(hào)以及每個(gè)部門工資大于1500的人數(shù):
SELECT deptno,COUNT(*)
FROM emp
WHERE sal>1500
GROUP BY deptno;
7.2 HAVING子句
l  查詢工資總和大于9000的部門編號(hào)以及工資和:
SELECT deptno, SUM(sal)
FROM emp
GROUP BY deptno
HAVING SUM(sal) > 9000;
注意,WHERE是對(duì)分組前記錄的條件,如果某行記錄沒(méi)有滿足WHERE子句的條件,那么這行記錄不會(huì)參加分組;而HAVING是對(duì)分組后數(shù)據(jù)的約束。
8 LIMIT
LIMIT用來(lái)限定查詢結(jié)果的起始行,以及總行數(shù)。
8.1 查詢5行記錄,起始行從0開(kāi)始
SELECT * FROM emp LIMIT 0, 5;
注意,起始行從0開(kāi)始,即第一行開(kāi)始!
8.2 查詢10行記錄,起始行從3開(kāi)始
SELECT * FROM emp LIMIT 3, 10;
8.3 分頁(yè)查詢
如果一頁(yè)記錄為10條,希望查看第3頁(yè)記錄應(yīng)該怎么查呢?
l  第一頁(yè)記錄起始行為0,一共查詢10行;
l  第二頁(yè)記錄起始行為10,一共查詢10行;
l  第三頁(yè)記錄起始行為20,一共查詢10行;
四、完整性約束
完整性約束是為了表的數(shù)據(jù)的正確性!如果數(shù)據(jù)不正確,那么一開(kāi)始就不能添加到表中。
1 主鍵
當(dāng)某一列添加了主鍵約束后,那么這一列的數(shù)據(jù)就不能重復(fù)出現(xiàn)。這樣每行記錄中其主鍵列的值就是這一行的唯一標(biāo)識(shí)。例如學(xué)生的學(xué)號(hào)可以用來(lái)做唯一標(biāo)識(shí),而學(xué)生的姓名是不能做唯一標(biāo)識(shí)的,因?yàn)閷W(xué)習(xí)有可能同名。
主鍵列的值不能為NULL,也不能重復(fù)!
指定主鍵約束使用PRIMARY KEY關(guān)鍵字 (primary key);
l  創(chuàng)建表:定義列時(shí)指定主鍵:
CREATE TABLE stu(
sid        CHAR(6) PRIMARY KEY,
sname      VARCHAR(20),
age            INT,
gender     VARCHAR(10)
);
l  創(chuàng)建表:定義列之后獨(dú)立指定主鍵:
CREATE TABLE stu(
sid        CHAR(6),
sname      VARCHAR(20),
age            INT,
gender     VARCHAR(10),
PRIMARY KEY(sid)
);
l  修改表時(shí)指定主鍵:
ALTER TABLE stu
ADD PRIMARY KEY(sid);
l  刪除主鍵(只是刪除主鍵約束,而不會(huì)刪除主鍵列):
ALTER TABLE stu DROP PRIMARY KEY;
2 主鍵自增長(zhǎng)
MySQL提供了主鍵自動(dòng)增長(zhǎng)的功能!這樣用戶就不用再為是否有主鍵是否重復(fù)而煩惱了。當(dāng)主鍵設(shè)置為自動(dòng)增長(zhǎng)后,在沒(méi)有給出主鍵值時(shí),主鍵的值會(huì)自動(dòng)生成,而且是最大主鍵值+1,也就不會(huì)出現(xiàn)重復(fù)主鍵的可能了。
l  創(chuàng)建表時(shí)設(shè)置主鍵自增長(zhǎng)(主鍵必須是整型才可以自增長(zhǎng)):
CREATE TABLE stu(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname      VARCHAR(20),
age            INT,
gender     VARCHAR(10)
);
l  修改表時(shí)設(shè)置主鍵自增長(zhǎng):
ALTER TABLE stu CHANGE sid sid INT AUTO_INCREMENT;
l  修改表時(shí)刪除主鍵自增長(zhǎng):
ALTER TABLE stu CHANGE sid sid INT;
3 非空
指定非空約束的列不能沒(méi)有值,也就是說(shuō)在插入記錄時(shí),對(duì)添加了非空約束的列一定要給值;在修改記錄時(shí),不能把非空列的值設(shè)置為NULL。(int primary key auto_incement);
l  指定非空約束:
CREATE TABLE stu(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(10) NOT NULL,
age            INT,
gender     VARCHAR(10)
);
當(dāng)為sname字段指定為非空后,在向stu表中插入記錄時(shí),必須給sname字段指定值,否則會(huì)報(bào)錯(cuò):
INSERT INTO stu(sid) VALUES(1);
插入的記錄中sname沒(méi)有指定值,所以會(huì)報(bào)錯(cuò)!
4 唯一
還可以為字段指定唯一約束!當(dāng)為字段指定唯一約束后,那么字段的值必須是唯一的。這一點(diǎn)與主鍵相似!例如給stu表的sname字段指定唯一約束:
CREATE TABLE tab_ab(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(10) UNIQUE
);
INSERT INTO sname(sid, sname) VALUES(1001, 'zs');
INSERT INTO sname(sid, sname) VALUES(1002, 'zs');
當(dāng)兩次插入相同的名字時(shí),MySQL會(huì)報(bào)錯(cuò)!
5 外鍵
主外鍵是構(gòu)成表與表關(guān)聯(lián)的唯一途徑!
外鍵是另一張表的主鍵!例如員工表與部門表之間就存在關(guān)聯(lián)關(guān)系,其中員工表中的部門編號(hào)字段就是外鍵,是相對(duì)部門表的外鍵。
我們?cè)賮?lái)看BBS系統(tǒng)中:用戶表(t_user)、分類表(t_section)、帖子表(t_topic)三者之間的關(guān)系。
例如在t_section表中sid為1的記錄說(shuō)明有一個(gè)分類叫java,版主是t_user表中uid為1的用戶,即zs!
例如在t_topic表中tid為2的記錄是名字為“Java是咖啡”的帖子,它是java版塊的帖子,它的作者是ww。
外鍵就是用來(lái)約束這一列的值必須是另一張表的主鍵值!?。?div style="height:15px;">
l  創(chuàng)建t_user表,指定uid為主鍵列:(unique-獨(dú)一無(wú)二的 not null) (primary-主要的key auto_increment)
CREATE TABLE t_user(
uid   INT PRIMARY KEY AUTO_INCREMENT,
uname     VARCHAR(20) UNIQUE NOT NULL
);
l  創(chuàng)建t_section表,指定sid為主鍵列,u_id為相對(duì)t_user表的uid列的外鍵:
CREATE TABLE t_section(
sid    INT PRIMARY KEY AUTO_INCREMENT,
sname      VARCHAR(30),
u_id INT,
Constraint fk_t_user foreign key(u_id) referen ces t_user(uid)
CONSTRAINT fk_t_user FOREIGN KEY(u_id) REFERENCES t_user(uid)
);
l  修改t_section表,指定u_id為相對(duì)t_user表的uid列的外鍵:
ALTER TABLE t_section
ADD CONSTRAINT fk_t_user
FOREIGN KEY(u_id)
REFERENCES t_user(uid);
l  修改t_section表,刪除u_id的外鍵約束:
ALTER TABLE t_section
DROP FOREIGN KEY fk_t_user;
6 表與表之間的關(guān)系
l  一對(duì)一:例如t_person表和t_card表,即人和身份證。這種情況需要找出主從關(guān)系,即誰(shuí)是主表,誰(shuí)是從表。人可以沒(méi)有身份證,但身份證必須要有人才行,所以人是主表,而身份證是從表。設(shè)計(jì)從表可以有兩種方案:
在t_card表中添加外鍵列(相對(duì)t_user表),并且給外鍵添加唯一約束;
給t_card表的主鍵添加外鍵約束(相對(duì)t_user表),即t_card表的主鍵也是外鍵。
l  一對(duì)多(多對(duì)一):最為常見(jiàn)的就是一對(duì)多!一對(duì)多和多對(duì)一,這是從哪個(gè)角度去看得出來(lái)的。t_user和t_section的關(guān)系,從t_user來(lái)看就是一對(duì)多,而從t_section的角度來(lái)看就是多對(duì)一!這種情況都是在多方創(chuàng)建外鍵!
l  多對(duì)多:例如t_stu和t_teacher表,即一個(gè)學(xué)生可以有多個(gè)老師,而一個(gè)老師也可以有多個(gè)學(xué)生。這種情況通常需要?jiǎng)?chuàng)建中間表來(lái)處理多對(duì)多關(guān)系。例如再創(chuàng)建一張表t_stu_tea表,給出兩個(gè)外鍵,一個(gè)相對(duì)t_stu表的外鍵,另一個(gè)相對(duì)t_teacher表的外鍵。
五、編碼
1 查看MySQL編碼
SHOW VARIABLES LIKE 'char%'; (show variables-變量 like ‘char’%);
因?yàn)楫?dāng)初安裝時(shí)指定了字符集為UTF8,所以所有的編碼都是UTF8。
l  character_set_client:你發(fā)送的數(shù)據(jù)必須與client指定的編碼一致?。?!服務(wù)器會(huì)使用該編碼來(lái)解讀客戶端發(fā)送過(guò)來(lái)的數(shù)據(jù);
l  character_set_connection:通過(guò)該編碼與client一致!該編碼不會(huì)導(dǎo)致亂碼!當(dāng)執(zhí)行的是查詢語(yǔ)句時(shí),客戶端發(fā)送過(guò)來(lái)的數(shù)據(jù)會(huì)先轉(zhuǎn)換成connection指定的編碼。但只要客戶端發(fā)送過(guò)來(lái)的數(shù)據(jù)與client指定的編碼一致,那么轉(zhuǎn)換就不會(huì)出現(xiàn)問(wèn)題;
l  character_set_database:數(shù)據(jù)庫(kù)默認(rèn)編碼,在創(chuàng)建數(shù)據(jù)庫(kù)時(shí),如果沒(méi)有指定編碼,那么默認(rèn)使用database編碼;
l  character_set_server:MySQL服務(wù)器默認(rèn)編碼;
l  character_set_results:響應(yīng)的編碼,即查詢結(jié)果返回給客戶端的編碼。這說(shuō)明客戶端必須使用result指定的編碼來(lái)解碼;
2 控制臺(tái)編碼
修改character_set_client、character_set_results、character_set_connection為GBK,就不會(huì)出現(xiàn)亂碼了。但其實(shí)只需要修改character_set_client和character_set_results。
控制臺(tái)的編碼只能是GBK,而不能修改為UTF8,這就出現(xiàn)一個(gè)問(wèn)題。客戶端發(fā)送的數(shù)據(jù)是GBK,而character_set_client為UTF8,這就說(shuō)明客戶端數(shù)據(jù)到了服務(wù)器端后一定會(huì)出現(xiàn)亂碼。既然不能修改控制臺(tái)的編碼,那么只能修改character_set_client為GBK了。
服務(wù)器發(fā)送給客戶端的數(shù)據(jù)編碼為character_set_result,它如果是UTF8,那么控制臺(tái)使用GBK解碼也一定會(huì)出現(xiàn)亂碼。因?yàn)闊o(wú)法修改控制臺(tái)編碼,所以只能把character_set_result修改為GBK。
l  修改character_set_client變量:set character_set_client=gbk;
l  修改character_set_results變量:set character_set_results=gbk;
設(shè)置編碼只對(duì)當(dāng)前連接有效,這說(shuō)明每次登錄MySQL提示符后都要去修改這兩個(gè)編碼,但可以通過(guò)修改配置文件來(lái)處理這一問(wèn)題:配置文件路徑:D:\Program Files\MySQL\MySQL Server 5.1\ my.ini
3 MySQL工具
使用MySQL工具是不會(huì)出現(xiàn)亂碼的,因?yàn)樗鼈儠?huì)每次連接時(shí)都修改character_set_client、character_set_results、character_set_connection的編碼。這樣對(duì)my.ini上的配置覆蓋了,也就不會(huì)出現(xiàn)亂碼了。
六、MySQL數(shù)據(jù)庫(kù)備份與還原七、備份和回復(fù)數(shù)據(jù)1 生成SQL腳本
在控制臺(tái)使用mysqldump命令可以用來(lái)生成指定數(shù)據(jù)庫(kù)的腳本文本,但要注意,腳本文本中只包含數(shù)據(jù)庫(kù)的內(nèi)容,而不會(huì)存在創(chuàng)建數(shù)據(jù)庫(kù)的語(yǔ)句!所以在恢復(fù)數(shù)據(jù)時(shí),還需要自已手動(dòng)創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)之后再去恢復(fù)數(shù)據(jù)。
mysqldump –u用戶名 –p密碼 數(shù)據(jù)庫(kù)名>生成的腳本文件路徑
現(xiàn)在可以在C盤下找到mydb1.sql文件了!
注意,mysqldump命令是在Windows控制臺(tái)下執(zhí)行,無(wú)需登錄mysql?。?!
2 執(zhí)行SQL腳本
執(zhí)行SQL腳本需要登錄mysql,然后進(jìn)入指定數(shù)據(jù)庫(kù),才可以執(zhí)行SQL腳本!?。?div style="height:15px;">
執(zhí)行SQL腳本不只是用來(lái)恢復(fù)數(shù)據(jù)庫(kù),也可以在平時(shí)編寫(xiě)SQL腳本,然后使用執(zhí)行SQL 腳本來(lái)操作數(shù)據(jù)庫(kù)!大家都知道,在黑屏下編寫(xiě)SQL語(yǔ)句時(shí),就算發(fā)現(xiàn)了錯(cuò)誤,可能也不能修改了。所以我建議大家使用腳本文件來(lái)編寫(xiě)SQL代碼,然后執(zhí)行之!
SOURCE C:\mydb1.sql
注意,在執(zhí)行腳本時(shí)需要先行核查當(dāng)前數(shù)據(jù)庫(kù)中的表是否與腳本文件中的語(yǔ)句有沖突!例如在腳本文件中存在create table a的語(yǔ)句,而當(dāng)前數(shù)據(jù)庫(kù)中已經(jīng)存在了a表,那么就會(huì)出錯(cuò)!
還可以通過(guò)下面的方式來(lái)執(zhí)行腳本文件:
mysql -uroot -p123 mydb1
mysql –u用戶名 –p密碼 數(shù)據(jù)庫(kù)
這種方式無(wú)需登錄mysql!
八、多表查詢
多表查詢有如下幾種:
l  合并結(jié)果集;
l  連接查詢
內(nèi)連接
外連接
2  左外連接
2  右外連接
2  全外連接(MySQL不支持)
自然連接
l  子查詢
1 合并結(jié)果集
作用:合并結(jié)果集就是把兩個(gè)select語(yǔ)句的查詢結(jié)果合并到一起!(union-聯(lián)合)
合并結(jié)果集有兩種方式:
l  UNION:去除重復(fù)記錄,例如:SELECT * FROM t1 UNION SELECT * FROM t2;
l  UNION ALL:不去除重復(fù)記錄,例如:SELECT * FROM t1 UNION ALL SELECT * FROM t2。
2 連接查詢
連接查詢就是求出多個(gè)表的乘積,例如t1連接t2,那么查詢出的結(jié)果就是t1*t2。
連接查詢會(huì)產(chǎn)生笛卡爾積,假設(shè)集合A={a,b},集合B={0,1,2},則兩個(gè)集合的笛卡爾積為{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}??梢詳U(kuò)展到多個(gè)集合的情況。
那么多表查詢產(chǎn)生這樣的結(jié)果并不是我們想要的,那么怎么去除重復(fù)的,不想要的記錄呢,當(dāng)然是通過(guò)條件過(guò)濾。通常要查詢的多個(gè)表之間都存在關(guān)聯(lián)關(guān)系,那么就通過(guò)關(guān)聯(lián)關(guān)系去除笛卡爾積。
你能想像到emp和dept表連接查詢的結(jié)果么?emp一共14行記錄,dept表一共4行記錄,那么連接后查詢出的結(jié)果是56行記錄。
也就你只是想在查詢emp表的同時(shí),把每個(gè)員工的所在部門信息顯示出來(lái),那么就需要使用主外鍵來(lái)去除無(wú)用信息了。
使用主外鍵關(guān)系做為條件來(lái)去除無(wú)用信息
SELECT * FROM emp,dept WHERE emp.deptno=dept.deptno;
上面查詢結(jié)果會(huì)把兩張表的所有列都查詢出來(lái),也許你不需要那么多列,這時(shí)就可以指定要查詢的列了。
SELECT emp.ename,emp.sal,emp.comm,dept.dname
FROM emp,dept
WHERE emp.deptno=dept.deptno;
還可以為表指定別名,然后在引用列時(shí)使用別名即可。
SELECT e.ename,e.sal,e.comm,d.dname
FROM emp AS e,dept AS d
WHERE e.deptno=d.deptno;
2.1 內(nèi)連接
上面的連接語(yǔ)句就是內(nèi)連接,但它不是SQL標(biāo)準(zhǔn)中的查詢方式,可以理解為方言!SQL標(biāo)準(zhǔn)的內(nèi)連接為:
SELECT *
FROM emp e
INNER JOIN dept d
ON e.deptno=d.deptno;
內(nèi)連接的特點(diǎn):查詢結(jié)果必須滿足條件。例如我們向emp表中插入一條記錄:
其中deptno為50,而在dept表中只有10、20、30、40部門,那么上面的查詢結(jié)果中就不會(huì)出現(xiàn)“張三”這條記錄,因?yàn)樗荒軡M足e.deptno=d.deptno這個(gè)條件。
2.2 外連接(左連接、右連接)
外連接的特點(diǎn):查詢出的結(jié)果存在不滿足條件的可能。
左連接:
SELECT * FROM emp e
LEFT OUTER JOIN dept d
ON e.deptno=d.deptno;
左連接是先查詢出左表(即以左表為主),然后查詢右表,右表中滿足條件的顯示出來(lái),不滿足條件的顯示NULL。
這么說(shuō)你可能不太明白,我們還是用上面的例子來(lái)說(shuō)明。其中emp表中“張三”這條記錄中,部門編號(hào)為50,而dept表中不存在部門編號(hào)為50的記錄,所以“張三”這條記錄,不能滿足e.deptno=d.deptno這條件。但在左連接中,因?yàn)閑mp表是左表,所以左表中的記錄都會(huì)查詢出來(lái),即“張三”這條記錄也會(huì)查出,但相應(yīng)的右表部分顯示NULL。
2.3 右連接
右連接就是先把右表中所有記錄都查詢出來(lái),然后左表滿足條件的顯示,不滿足顯示NULL。例如在dept表中的40部門并不存在員工,但在右連接中,如果dept表為右表,那么還是會(huì)查出40部門,但相應(yīng)的員工信息為NULL。
SELECT * FROM emp e
RIGHT OUTER JOIN dept d
ON e.deptno=d.deptno;
連接查詢心得:
連接不限與兩張表,連接查詢也可以是三張、四張,甚至N張表的連接查詢。通常連接查詢不可能需要整個(gè)笛卡爾積,而只是需要其中一部分,那么這時(shí)就需要使用條件來(lái)去除不需要的記錄。這個(gè)條件大多數(shù)情況下都是使用主外鍵關(guān)系去除。
兩張表的連接查詢一定有一個(gè)主外鍵關(guān)系,三張表的連接查詢就一定有兩個(gè)主外鍵關(guān)系,所以在大家不是很熟悉連接查詢時(shí),首先要學(xué)會(huì)去除無(wú)用笛卡爾積,那么就是用主外鍵關(guān)系作為條件來(lái)處理。如果兩張表的查詢,那么至少有一個(gè)主外鍵條件,三張表連接至少有兩個(gè)主外鍵條件。
3 自然連接
大家也都知道,連接查詢會(huì)產(chǎn)生無(wú)用笛卡爾積,我們通常使用主外鍵關(guān)系等式來(lái)去除它。而自然連接無(wú)需你去給出主外鍵等式,它會(huì)自動(dòng)找到這一等式:
l  兩張連接的表中名稱和類型完成一致的列作為條件,例如emp和dept表都存在deptno列,并且類型一致,所以會(huì)被自然連接找到!
當(dāng)然自然連接還有其他的查找條件的方式,但其他方式都可能存在問(wèn)題!(natural-自然的);
SELECT * FROM emp NATURAL JOIN dept;
SELECT * FROM emp NATURAL LEFT JOIN dept;
SELECT * FROM emp NATURAL RIGHT JOIN dept;
4 子查詢
子查詢就是嵌套查詢,即SELECT中包含SELECT,如果一條語(yǔ)句中存在兩個(gè),或兩個(gè)以上SELECT,那么就是子查詢語(yǔ)句了。
l  子查詢出現(xiàn)的位置:
where后,作為條件的一部分;
from后,作為被查詢的一條表;
l  當(dāng)子查詢出現(xiàn)在where后作為條件時(shí),還可以使用如下關(guān)鍵字:
any
all
l  子查詢結(jié)果集的形式:
單行單列(用于條件)
單行多列(用于條件)
多行單列(用于條件)
多行多列(用于表)
練習(xí):
工資高于甘寧的員工。
分析:
查詢條件:工資>甘寧工資,其中甘寧工資需要一條子查詢。
第一步:查詢甘寧的工資
SELECT sal FROM emp WHERE ename='甘寧'
第二步:查詢高于甘寧工資的員工
SELECT * FROM emp WHERE sal > (${第一步})
結(jié)果:
SELECT * FROM emp WHERE sal > (SELECT sal FROM emp WHERE ename='甘寧')
l  子查詢作為條件
l  子查詢形式為單行單列
工資高于30部門所有人的員工信息
分析:
查詢條件:工資高于30部門所有人工資,其中30部門所有人工資是子查詢。高于所有需要使用all關(guān)鍵字。
第一步:查詢30部門所有人工資
SELECT sal FROM emp WHERE deptno=30;
第二步:查詢高于30部門所有人工資的員工信息
SELECT * FROM emp WHERE sal > ALL (${第一步})
結(jié)果:
SELECT * FROM emp WHERE sal > ALL (SELECT sal FROM emp WHERE deptno=30)
l  子查詢作為條件
l  子查詢形式為多行單列(當(dāng)子查詢結(jié)果集形式為多行單列時(shí)可以使用ALL或ANY關(guān)鍵字)
1、查詢工作和工資與殷天正完全相同的員工信息
分析:
查詢條件:工作和工資與殷天正完全相同,這是子查詢
第一步:查詢出殷天正的工作和工資
SELECT job,sal FROM emp WHERE ename='殷天正'
第二步:查詢出與殷天正工作和工資相同的人
SELECT * FROM emp WHERE (job,sal) IN (${第一步})
結(jié)果:
SELECT * FROM emp WHERE (job,sal) IN (SELECT job,sal FROM emp WHERE ename='殷天正')
l  子查詢作為條件
l  子查詢形式為單行多列
1、查詢員工編號(hào)為1006的員工名稱、員工工資、部門名稱、部門地址
分析:
查詢列:?jiǎn)T工名稱、員工工資、部門名稱、部門地址
查詢表:emp和dept,分析得出,不需要外連接(外連接的特性:某一行(或某些行)記錄上會(huì)出現(xiàn)一半有值,一半為NULL值)
條件:?jiǎn)T工編號(hào)為1006
第一步:去除多表,只查一張表,這里去除部門表,只查員工表
SELECT ename, sal FROM emp e WHERE empno=1006
第二步:讓第一步與dept做內(nèi)連接查詢,添加主外鍵條件去除無(wú)用笛卡爾積
SELECT e.ename, e.sal, d.dname, d.loc
FROM emp e, dept d
WHERE e.deptno=d.deptno AND empno=1006
第二步中的dept表表示所有行所有列的一張完整的表,這里可以把dept替換成所有行,但只有dname和loc列的表,這需要子查詢。
第三步:查詢dept表中dname和loc兩列,因?yàn)閐eptno會(huì)被作為條件,用來(lái)去除無(wú)用笛卡爾積,所以需要查詢它。
SELECT dname,loc,deptno FROM dept;
第四步:替換第二步中的dept
SELECT e.ename, e.sal, d.dname, d.loc
FROM emp e, (SELECT dname,loc,deptno FROM dept) d
WHERE e.deptno=d.deptno AND e.empno=1006
l  子查詢作為表
l  子查詢形式為多行多列
文章轉(zhuǎn)自:http://www.cnblogs.com/wangfengming/articles/7885721.html
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
SQL Server筆試題 解答
尚學(xué)堂馬士兵Oracle教程 筆記
MLDN筆記連載(下載)
表的復(fù)雜查詢 --多表的查詢
Oracle數(shù)據(jù)庫(kù)語(yǔ)句大全
數(shù)據(jù)庫(kù)SQL---數(shù)據(jù)庫(kù)、基本表、視圖、索引的定義、修改、刪除
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服