MySQL数据库学习教程,从0到入门
mysql day01課堂筆記
1、什么是數(shù)據(jù)庫(kù)?什么是數(shù)據(jù)庫(kù)管理系統(tǒng)?什么是SQL?他們之間的關(guān)系是什么?
數(shù)據(jù)庫(kù):英文單詞DataBase,簡(jiǎn)稱DB。按照一定格式存儲(chǔ)數(shù)據(jù)的一些文件的組合。顧名思義:存儲(chǔ)數(shù)據(jù)的倉(cāng)庫(kù),實(shí)際上就是一堆文件。這些文件中存儲(chǔ)了具有特定格式的數(shù)據(jù)。數(shù)據(jù)庫(kù)管理系統(tǒng):DataBaseManagement,簡(jiǎn)稱DBMS。數(shù)據(jù)庫(kù)管理系統(tǒng)是專門用來(lái)管理數(shù)據(jù)庫(kù)中數(shù)據(jù)的,數(shù)據(jù)庫(kù)管理系統(tǒng)可以對(duì)數(shù)據(jù)庫(kù)當(dāng)中的數(shù)據(jù)進(jìn)行增刪改查。常見的數(shù)據(jù)庫(kù)管理系統(tǒng):MySQL、Oracle、MS SqlServer、DB2、sybase等....SQL:結(jié)構(gòu)化查詢語(yǔ)言程序員需要學(xué)習(xí)SQL語(yǔ)句,程序員通過(guò)編寫SQL語(yǔ)句,然后DBMS負(fù)責(zé)執(zhí)行SQL語(yǔ)句,最終來(lái)完成數(shù)據(jù)庫(kù)中數(shù)據(jù)的增刪改查操作。SQL是一套標(biāo)準(zhǔn),程序員主要學(xué)習(xí)的就是SQL語(yǔ)句,這個(gè)SQL在mysql中可以使用,同時(shí)在Oracle中也可以使用,在DB2中也可以使用。三者之間的關(guān)系?DBMS--執(zhí)行--> SQL --操作--> DB先安裝數(shù)據(jù)庫(kù)管理系統(tǒng)MySQL,然后學(xué)習(xí)SQL語(yǔ)句怎么寫,編寫SQL語(yǔ)句之后,DBMS 對(duì)SQL語(yǔ)句進(jìn)行執(zhí)行,最終來(lái)完成數(shù)據(jù)庫(kù)的數(shù)據(jù)管理。2、安裝MySQL數(shù)據(jù)庫(kù)管理系統(tǒng)。
第一步:先安裝,選擇“經(jīng)典版”
第二步:需要進(jìn)行MySQL數(shù)據(jù)庫(kù)實(shí)例配置。
3、MySQL數(shù)據(jù)庫(kù)的完美卸載!
第一步:雙擊安裝包進(jìn)行卸載刪除。
第二步:刪除目錄:
把C:\ProgramData下面的MySQL目錄干掉。
把C:\Program Files (x86)下面的MySQL目錄干掉。
4、看一下計(jì)算機(jī)上的服務(wù),找一找MySQL的服務(wù)在哪里?
計(jì)算機(jī)–>右鍵–>管理–>服務(wù)和應(yīng)用程序–>服務(wù)–>找mysql服務(wù)
MySQL的服務(wù),默認(rèn)是“啟動(dòng)”的狀態(tài),只有啟動(dòng)了mysql才能用。
默認(rèn)情況下是“自動(dòng)”啟動(dòng),自動(dòng)啟動(dòng)表示下一次重啟操作系統(tǒng)的時(shí)候
自動(dòng)啟動(dòng)該服務(wù)。
5、在windows操作系統(tǒng)當(dāng)中,怎么使用命令來(lái)啟動(dòng)和關(guān)閉mysql服務(wù)呢?
語(yǔ)法:
net stop 服務(wù)名稱;
net start 服務(wù)名稱;
6、mysql安裝了,服務(wù)啟動(dòng)了,怎么使用客戶端登錄mysql數(shù)據(jù)庫(kù)呢?
使用bin目錄下的mysql.exe命令來(lái)連接mysql數(shù)據(jù)庫(kù)服務(wù)器
7、mysql常用命令:
退出mysql :exit查看mysql中有哪些數(shù)據(jù)庫(kù)?show databases; 注意:以分號(hào)結(jié)尾,分號(hào)是英文的分號(hào)。mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | +--------------------+ mysql默認(rèn)自帶了4個(gè)數(shù)據(jù)庫(kù)。怎么選擇使用某個(gè)數(shù)據(jù)庫(kù)呢?mysql> use test;Database changed表示正在使用一個(gè)名字叫做test的數(shù)據(jù)庫(kù)。怎么創(chuàng)建數(shù)據(jù)庫(kù)呢?mysql> create database bjpowernode;Query OK, 1 row affected (0.00 sec)mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || bjpowernode || mysql || performance_schema || test |+--------------------+查看某個(gè)數(shù)據(jù)庫(kù)下有哪些表?mysql> show tables;注意:以上的命令不區(qū)分大小寫,都行。查看mysql數(shù)據(jù)庫(kù)的版本號(hào): mysql> select version();+-----------+| version() |+-----------+| 5.5.36 |+-----------+查看當(dāng)前使用的是哪個(gè)數(shù)據(jù)庫(kù)? mysql> select database(); +-------------+ | database() | +-------------+ | bjpowernode | +-------------+mysql> show -> databases -> ; +--------------------+ | Database | +--------------------+ | information_schema | | bjpowernode | | mysql | | performance_schema | | test | +--------------------+注意:mysql是不見“;”不執(zhí)行,“;”表示結(jié)束!mysql> show -> -> -> -> -> -> -> -> -> \c mysql> \c用來(lái)終止一條命令的輸入。8、數(shù)據(jù)庫(kù)當(dāng)中最基本的單元是表:table
什么是表table?為什么用表來(lái)存儲(chǔ)數(shù)據(jù)呢?姓名 性別 年齡(列:字段) ---------------------------張三 男 20 ------->行(記錄)李四 女 21 ------->行(記錄)王五 男 22 ------->行(記錄)數(shù)據(jù)庫(kù)當(dāng)中是以表格的形式表示數(shù)據(jù)的。 因?yàn)楸肀容^直觀。任何一張表都有行和列:行(row):被稱為數(shù)據(jù)/記錄。列(column):被稱為字段。姓名字段、性別字段、年齡字段。了解一下:每一個(gè)字段都有:字段名、數(shù)據(jù)類型、約束等屬性。字段名可以理解,是一個(gè)普通的名字,見名知意就行。數(shù)據(jù)類型:字符串,數(shù)字,日期等,后期講。約束:約束也有很多,其中一個(gè)叫做唯一性約束,這種約束添加之后,該字段中的數(shù)據(jù)不能重復(fù)。9、關(guān)于SQL語(yǔ)句的分類?
SQL語(yǔ)句有很多,最好進(jìn)行分門別類,這樣更容易記憶。分為:DQL:數(shù)據(jù)查詢語(yǔ)言(凡是帶有select關(guān)鍵字的都是查詢語(yǔ)句)select...DML:數(shù)據(jù)操作語(yǔ)言(凡是對(duì)表當(dāng)中的數(shù)據(jù)進(jìn)行增刪改的都是DML)insert delete updateinsert 增delete 刪update 改這個(gè)主要是操作表中的數(shù)據(jù)data。DDL:數(shù)據(jù)定義語(yǔ)言凡是帶有create、drop、alter的都是DDL。DDL主要操作的是表的結(jié)構(gòu)。不是表中的數(shù)據(jù)。create:新建,等同于增drop:刪除alter:修改這個(gè)增刪改和DML不同,這個(gè)主要是對(duì)表結(jié)構(gòu)進(jìn)行操作。TCL:不是王牌電視。是事務(wù)控制語(yǔ)言包括:事務(wù)提交:commit;事務(wù)回滾:rollback;DCL:是數(shù)據(jù)控制語(yǔ)言。例如:授權(quán)grant、撤銷權(quán)限r(nóng)evoke....10、導(dǎo)入一下提前準(zhǔn)備好的數(shù)據(jù):
bjpowernode.sql 這個(gè)文件中是我提前為大家練習(xí)準(zhǔn)備的數(shù)據(jù)庫(kù)表。
怎么將sql文件中的數(shù)據(jù)導(dǎo)入呢?
mysql> source D:\course\03-MySQL\document\bjpowernode.sql
11、關(guān)于導(dǎo)入的這幾張表?
mysql> show tables;
±----------------------+
| Tables_in_bjpowernode |
±----------------------+
| dept |
| emp |
| salgrade |
±----------------------+
12、不看表中的數(shù)據(jù),只看表的結(jié)構(gòu),有一個(gè)命令:
desc 表名;
mysql> desc dept;
±-------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±-------±------------±-----±----±--------±------+
| DEPTNO | int(2) | NO | PRI | NULL | |部門編號(hào)
| DNAME | varchar(14) | YES | | NULL | |部門名字
| LOC | varchar(13) | YES | | NULL | |地理位置
±-------±------------±-----±----±--------±------+
mysql> desc emp;
±---------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±---------±------------±-----±----±--------±------+
| EMPNO | int(4) | NO | PRI | NULL | |員工編號(hào)
| ENAME | varchar(10) | YES | | NULL | |員工姓名
| JOB | varchar(9) | YES | | NULL | |工作崗位
| MGR | int(4) | YES | | NULL | |上級(jí)編號(hào)
| HIREDATE | date | YES | | NULL | |入職日期
| SAL | double(7,2) | YES | | NULL | |工資
| COMM | double(7,2) | YES | | NULL | |補(bǔ)助
| DEPTNO | int(2) | YES | | NULL | |部門編號(hào)
±---------±------------±-----±----±--------±------+
mysql> desc salgrade;
±------±--------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±--------±-----±----±--------±------+
| GRADE | int(11) | YES | | NULL | |工資等級(jí)
| LOSAL | int(11) | YES | | NULL | |最低工資
| HISAL | int(11) | YES | | NULL | |最高工資
±------±--------±-----±----±--------±------+
describe縮寫為:desc
mysql> describe dept;
±-------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±-------±------------±-----±----±--------±------+
| DEPTNO | int(2) | NO | PRI | NULL | |
| DNAME | varchar(14) | YES | | NULL | |
| LOC | varchar(13) | YES | | NULL | |
±-------±------------±-----±----±--------±------+
13、簡(jiǎn)單查詢
13.1、查詢一個(gè)字段?
select 字段名 from 表名;
其中要注意:
select和from都是關(guān)鍵字。
字段名和表名都是標(biāo)識(shí)符。
14、條件查詢
14.1、什么是條件查詢?
不是將表中所有數(shù)據(jù)都查出來(lái)。是查詢出來(lái)符合條件的。
語(yǔ)法格式:
select
字段1,字段2,字段3…
from
表名
where
條件;
14.2、都有哪些條件?
= 等于 查詢薪資等于800的員工姓名和編號(hào)?select empno,ename from emp where sal = 800; 查詢SMITH的編號(hào)和薪資?select empno,sal from emp where ename = 'SMITH'; //字符串使用單引號(hào)<>或!= 不等于 查詢薪資不等于800的員工姓名和編號(hào)?select empno,ename from emp where sal != 800;select empno,ename from emp where sal <> 800; // 小于號(hào)和大于號(hào)組成的不等號(hào)< 小于 查詢薪資小于2000的員工姓名和編號(hào)?mysql> select empno,ename,sal from emp where sal < 2000;+-------+--------+---------+| empno | ename | sal |+-------+--------+---------+| 7369 | SMITH | 800.00 || 7499 | ALLEN | 1600.00 || 7521 | WARD | 1250.00 || 7654 | MARTIN | 1250.00 || 7844 | TURNER | 1500.00 || 7876 | ADAMS | 1100.00 || 7900 | JAMES | 950.00 || 7934 | MILLER | 1300.00 |+-------+--------+---------+<= 小于等于 查詢薪資小于等于3000的員工姓名和編號(hào)?select empno,ename,sal from emp where sal <= 3000;> 大于 查詢薪資大于3000的員工姓名和編號(hào)?select empno,ename,sal from emp where sal > 3000;>= 大于等于 查詢薪資大于等于3000的員工姓名和編號(hào)?select empno,ename,sal from emp where sal >= 3000;between … and …. 兩個(gè)值之間, 等同于 >= and <= 查詢薪資在2450和3000之間的員工信息?包括2450和3000第一種方式:>= and <= (and是并且的意思。)select empno,ename,sal from emp where sal >= 2450 and sal <= 3000;+-------+-------+---------+| empno | ename | sal |+-------+-------+---------+| 7566 | JONES | 2975.00 || 7698 | BLAKE | 2850.00 || 7782 | CLARK | 2450.00 || 7788 | SCOTT | 3000.00 || 7902 | FORD | 3000.00 |+-------+-------+---------+第二種方式:between … and …select empno,ename,sal from emp where sal between 2450 and 3000;注意:使用between and的時(shí)候,必須遵循左小右大。between and是閉區(qū)間,包括兩端的值。is null 為 null(is not null 不為空) 查詢哪些員工的津貼/補(bǔ)助為null?mysql> select empno,ename,sal,comm from emp where comm = null;Empty set (0.00 sec)mysql> select empno,ename,sal,comm from emp where comm is null;+-------+--------+---------+------+| empno | ename | sal | comm |+-------+--------+---------+------+| 7369 | SMITH | 800.00 | NULL || 7566 | JONES | 2975.00 | NULL || 7698 | BLAKE | 2850.00 | NULL || 7782 | CLARK | 2450.00 | NULL || 7788 | SCOTT | 3000.00 | NULL || 7839 | KING | 5000.00 | NULL || 7876 | ADAMS | 1100.00 | NULL || 7900 | JAMES | 950.00 | NULL || 7902 | FORD | 3000.00 | NULL || 7934 | MILLER | 1300.00 | NULL |+-------+--------+---------+------+10 rows in set (0.00 sec)注意:在數(shù)據(jù)庫(kù)當(dāng)中null不能使用等號(hào)進(jìn)行衡量。需要使用is null因?yàn)閿?shù)據(jù)庫(kù)中的null代表什么也沒有,它不是一個(gè)值,所以不能使用等號(hào)衡量。查詢哪些員工的津貼/補(bǔ)助不為null?select empno,ename,sal,comm from emp where comm is not null;+-------+--------+---------+---------+| empno | ename | sal | comm |+-------+--------+---------+---------+| 7499 | ALLEN | 1600.00 | 300.00 || 7521 | WARD | 1250.00 | 500.00 || 7654 | MARTIN | 1250.00 | 1400.00 || 7844 | TURNER | 1500.00 | 0.00 |+-------+--------+---------+---------+and 并且 查詢工作崗位是MANAGER并且工資大于2500的員工信息?select empno,ename,job,sal from emp where job = 'MANAGER' and sal > 2500;+-------+-------+---------+---------+| empno | ename | job | sal |+-------+-------+---------+---------+| 7566 | JONES | MANAGER | 2975.00 || 7698 | BLAKE | MANAGER | 2850.00 |+-------+-------+---------+---------+or 或者 查詢工作崗位是MANAGER和SALESMAN的員工?select empno,ename,job from emp where job = 'MANAGER';select empno,ename,job from emp where job = 'SALESMAN';select empno,ename,jobfromempwhere job = 'MANAGER' or job = 'SALESMAN';+-------+--------+----------+| empno | ename | job |+-------+--------+----------+| 7499 | ALLEN | SALESMAN || 7521 | WARD | SALESMAN || 7566 | JONES | MANAGER || 7654 | MARTIN | SALESMAN || 7698 | BLAKE | MANAGER || 7782 | CLARK | MANAGER || 7844 | TURNER | SALESMAN |+-------+--------+----------+and和or同時(shí)出現(xiàn)的話,有優(yōu)先級(jí)問(wèn)題嗎? 查詢工資大于2500,并且部門編號(hào)為10或20部門的員工?select *fromempwheresal > 2500 and deptno = 10 or deptno = 20;分析以上語(yǔ)句的問(wèn)題?and優(yōu)先級(jí)比or高。以上語(yǔ)句會(huì)先執(zhí)行and,然后執(zhí)行or。以上這個(gè)語(yǔ)句表示什么含義?找出工資大于2500并且部門編號(hào)為10的員工,或者20部門所有員工找出來(lái)。select *fromempwheresal > 2500 and (deptno = 10 or deptno = 20);and和or同時(shí)出現(xiàn),and優(yōu)先級(jí)較高。如果想讓or先執(zhí)行,需要加“小括號(hào)”以后在開發(fā)中,如果不確定優(yōu)先級(jí),就加小括號(hào)就行了。in 包含,相當(dāng)于多個(gè) or (not in 不在這個(gè)范圍中)查詢工作崗位是MANAGER和SALESMAN的員工?select empno,ename,job from emp where job = 'MANAGER' or job = 'SALESMAN';select empno,ename,job from emp where job in('MANAGER', 'SALESMAN');+-------+--------+----------+| empno | ename | job |+-------+--------+----------+| 7499 | ALLEN | SALESMAN || 7521 | WARD | SALESMAN || 7566 | JONES | MANAGER || 7654 | MARTIN | SALESMAN || 7698 | BLAKE | MANAGER || 7782 | CLARK | MANAGER || 7844 | TURNER | SALESMAN |+-------+--------+----------+注意:in不是一個(gè)區(qū)間。in后面跟的是具體的值。查詢薪資是800和5000的員工信息?select ename,sal from emp where sal = 800 or sal = 5000;select ename,sal from emp where sal in(800, 5000); //這個(gè)不是表示800到5000都找出來(lái)。+-------+---------+| ename | sal |+-------+---------+| SMITH | 800.00 || KING | 5000.00 |+-------+---------+select ename,sal from emp where sal in(800, 5000, 3000);// not in 表示不在這幾個(gè)值當(dāng)中的數(shù)據(jù)。select ename,sal from emp where sal not in(800, 5000, 3000);+--------+---------+| ename | sal |+--------+---------+| ALLEN | 1600.00 || WARD | 1250.00 || JONES | 2975.00 || MARTIN | 1250.00 || BLAKE | 2850.00 || CLARK | 2450.00 || TURNER | 1500.00 || ADAMS | 1100.00 || JAMES | 950.00 || MILLER | 1300.00 |+--------+---------+not 可以取非,主要用在 is 或 in 中is nullis not nullinnot inlike 稱為模糊查詢,支持%或下劃線匹配%匹配任意多個(gè)字符下劃線:任意一個(gè)字符。(%是一個(gè)特殊的符號(hào),_ 也是一個(gè)特殊符號(hào))找出名字中含有O的?mysql> select ename from emp where ename like '%O%';+-------+| ename |+-------+| JONES || SCOTT || FORD |+-------+找出名字以T結(jié)尾的?select ename from emp where ename like '%T';找出名字以K開始的?select ename from emp where ename like 'K%';找出第二個(gè)字每是A的?select ename from emp where ename like '_A%';找出第三個(gè)字母是R的?select ename from emp where ename like '__R%';t_student學(xué)生表name字段----------------------zhangsanlisiwangwuzhaoliujack_son找出名字中有“_”的?select name from t_student where name like '%_%'; //這樣不行。mysql> select name from t_student where name like '%\_%'; // \轉(zhuǎn)義字符。+----------+| name |+----------+| jack_son |+----------+15、排序
15.1、查詢所有員工薪資,排序?
select
ename,sal
from
emp
order by
sal; // 默認(rèn)是升序!!!
15.2、怎么降序?
指定降序: select ename,sal fromemp order bysal desc;±-------±--------+
| ename | sal |
±-------±--------+
| KING | 5000.00 |
| SCOTT | 3000.00 |
| FORD | 3000.00 |
| JONES | 2975.00 |
| BLAKE | 2850.00 |
| CLARK | 2450.00 |
| ALLEN | 1600.00 |
| TURNER | 1500.00 |
| MILLER | 1300.00 |
| MARTIN | 1250.00 |
| WARD | 1250.00 |
| ADAMS | 1100.00 |
| JAMES | 950.00 |
| SMITH | 800.00 |
±-------±--------+
±-------±--------+
| ename | sal |
±-------±--------+
| SMITH | 800.00 |
| JAMES | 950.00 |
| ADAMS | 1100.00 |
| WARD | 1250.00 |
| MARTIN | 1250.00 |
| MILLER | 1300.00 |
| TURNER | 1500.00 |
| ALLEN | 1600.00 |
| CLARK | 2450.00 |
| BLAKE | 2850.00 |
| JONES | 2975.00 |
| FORD | 3000.00 |
| SCOTT | 3000.00 |
| KING | 5000.00 |
±-------±--------+
15.3、可以兩個(gè)字段排序嗎?或者說(shuō)按照多個(gè)字段排序?
查詢員工名字和薪資,要求按照薪資升序,如果薪資一樣的話,
再按照名字升序排列。
select
ename,sal
from
emp
order by
sal asc, ename asc; // sal在前,起主導(dǎo),只有sal相等的時(shí)候,才會(huì)考慮啟用ename排序。
15.4、了解:根據(jù)字段的位置也可以排序
select ename,sal from emp order by 2; // 2表示第二列。第二列是sal
按照查詢結(jié)果的第2列sal排序。
16、綜合一點(diǎn)的案例:
找出工資在1250到3000之間的員工信息,要求按照薪資降序排列。
select
ename,sal
from
emp
where
sal between 1250 and 3000
order by
sal desc;
±-------±--------+
| ename | sal |
±-------±--------+
| FORD | 3000.00 |
| SCOTT | 3000.00 |
| JONES | 2975.00 |
| BLAKE | 2850.00 |
| CLARK | 2450.00 |
| ALLEN | 1600.00 |
| TURNER | 1500.00 |
| MILLER | 1300.00 |
| MARTIN | 1250.00 |
| WARD | 1250.00 |
±-------±--------+
17、數(shù)據(jù)處理函數(shù)
17.1、數(shù)據(jù)處理函數(shù)又被稱為單行處理函數(shù)
單行處理函數(shù)的特點(diǎn):一個(gè)輸入對(duì)應(yīng)一個(gè)輸出。和單行處理函數(shù)相對(duì)的是:多行處理函數(shù)。(多行處理函數(shù)特點(diǎn):多個(gè)輸入,對(duì)應(yīng)1個(gè)輸出!)17.2、單行處理函數(shù)常見的有哪些?
lower 轉(zhuǎn)換小寫mysql> select lower(ename) as ename from emp;+--------+| ename |+--------+| smith || allen || ward || jones || martin || blake || clark || scott || king || turner || adams || james || ford || miller |+--------+14個(gè)輸入,最后還是14個(gè)輸出。這是單行處理函數(shù)的特點(diǎn)。upper 轉(zhuǎn)換大寫mysql> select * from t_student;+----------+| name |+----------+| zhangsan || lisi || wangwu || jack_son |+----------+mysql> select upper(name) as name from t_student;+----------+| name |+----------+| ZHANGSAN || LISI || WANGWU || JACK_SON |+----------+substr 取子串(substr( 被截取的字符串, 起始下標(biāo),截取的長(zhǎng)度))select substr(ename, 1, 1) as ename from emp;注意:起始下標(biāo)從1開始,沒有0.找出員工名字第一個(gè)字母是A的員工信息?第一種方式:模糊查詢select ename from emp where ename like 'A%';第二種方式:substr函數(shù)select ename from emp where substr(ename,1,1) = 'A';首字母大寫?select name from t_student;select upper(substr(name,1,1)) from t_student;select substr(name,2,length(name) - 1) from t_student;select concat(upper(substr(name,1,1)),substr(name,2,length(name) - 1)) as result from t_student;+----------+| result |+----------+| Zhangsan || Lisi || Wangwu || Jack_son |+----------+concat函數(shù)進(jìn)行字符串的拼接select concat(empno,ename) from emp;+---------------------+| concat(empno,ename) |+---------------------+| 7369SMITH || 7499ALLEN || 7521WARD || 7566JONES || 7654MARTIN || 7698BLAKE || 7782CLARK || 7788SCOTT || 7839KING || 7844TURNER || 7876ADAMS || 7900JAMES || 7902FORD || 7934MILLER |+---------------------+length 取長(zhǎng)度select length(ename) enamelength from emp;+-------------+| enamelength |+-------------+| 5 || 5 || 4 || 5 || 6 || 5 || 5 || 5 || 4 || 6 || 5 || 5 || 4 || 6 |+-------------+trim 去空格mysql> select * from emp where ename = ' KING';Empty set (0.00 sec)mysql> select * from emp where ename = trim(' KING');+-------+-------+-----------+------+------------+---------+------+--------+| EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO |+-------+-------+-----------+------+------------+---------+------+--------+| 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000.00 | NULL | 10 |+-------+-------+-----------+------+------------+---------+------+--------+str_to_date 將字符串轉(zhuǎn)換成日期 date_format 格式化日期 format 設(shè)置千分位case..when..then..when..then..else..end當(dāng)員工的工作崗位是MANAGER的時(shí)候,工資上調(diào)10%,當(dāng)工作崗位是SALESMAN的時(shí)候,工資上調(diào)50%,其它正常。(注意:不修改數(shù)據(jù)庫(kù),只是將查詢結(jié)果顯示為工資上調(diào))select ename,job, sal as oldsal,(case job when 'MANAGER' then sal*1.1 when 'SALESMAN' then sal*1.5 else sal end) as newsal from emp;+--------+-----------+---------+---------+| ename | job | oldsal | newsal |+--------+-----------+---------+---------+| SMITH | CLERK | 800.00 | 800.00 || ALLEN | SALESMAN | 1600.00 | 2400.00 || WARD | SALESMAN | 1250.00 | 1875.00 || JONES | MANAGER | 2975.00 | 3272.50 || MARTIN | SALESMAN | 1250.00 | 1875.00 || BLAKE | MANAGER | 2850.00 | 3135.00 || CLARK | MANAGER | 2450.00 | 2695.00 || SCOTT | ANALYST | 3000.00 | 3000.00 || KING | PRESIDENT | 5000.00 | 5000.00 || TURNER | SALESMAN | 1500.00 | 2250.00 || ADAMS | CLERK | 1100.00 | 1100.00 || JAMES | CLERK | 950.00 | 950.00 || FORD | ANALYST | 3000.00 | 3000.00 || MILLER | CLERK | 1300.00 | 1300.00 |+--------+-----------+---------+---------+round 四舍五入select 字段 from 表名;select ename from emp;select 'abc' from emp; // select后面直接跟“字面量/字面值”mysql> select 'abc' as bieming from emp;+---------+| bieming |+---------+| abc || abc || abc || abc || abc || abc || abc || abc || abc || abc || abc || abc || abc || abc |+---------+mysql> select abc from emp;ERROR 1054 (42S22): Unknown column 'abc' in 'field list'這樣肯定報(bào)錯(cuò),因?yàn)闀?huì)把a(bǔ)bc當(dāng)做一個(gè)字段的名字,去emp表中找abc字段去了。select 1000 as num from emp; // 1000 也是被當(dāng)做一個(gè)字面量/字面值。+------+| num |+------+| 1000 || 1000 || 1000 || 1000 || 1000 || 1000 || 1000 || 1000 || 1000 || 1000 || 1000 || 1000 || 1000 || 1000 |+------+結(jié)論:select后面可以跟某個(gè)表的字段名(可以等同看做變量名),也可以跟字面量/字面值(數(shù)據(jù))。select 21000 as num from dept;+-------+| num |+-------+| 21000 || 21000 || 21000 || 21000 |+-------+mysql> select round(1236.567, 0) as result from emp; //保留整數(shù)位。+--------+| result |+--------+| 1237 || 1237 || 1237 || 1237 || 1237 || 1237 || 1237 || 1237 || 1237 || 1237 || 1237 || 1237 || 1237 || 1237 |+--------+select round(1236.567, 1) as result from emp; //保留1個(gè)小數(shù)select round(1236.567, 2) as result from emp; //保留2個(gè)小數(shù)select round(1236.567, -1) as result from emp; // 保留到十位。+--------+| result |+--------+| 1240 || 1240 || 1240 || 1240 || 1240 || 1240 || 1240 || 1240 || 1240 || 1240 || 1240 || 1240 || 1240 || 1240 |+--------+select round(1236.567, -2) as result from emp;+--------+| result |+--------+| 1200 || 1200 || 1200 || 1200 || 1200 || 1200 || 1200 || 1200 || 1200 || 1200 || 1200 || 1200 || 1200 || 1200 |+--------+rand() 生成隨機(jī)數(shù)mysql> select round(rand()*100,0) from emp; // 100以內(nèi)的隨機(jī)數(shù)+---------------------+| round(rand()*100,0) |+---------------------+| 76 || 29 || 15 || 88 || 95 || 9 || 63 || 89 || 54 || 3 || 54 || 61 || 42 || 28 |+---------------------+ifnull 可以將 null 轉(zhuǎn)換成一個(gè)具體值ifnull是空處理函數(shù)。專門處理空的。在所有數(shù)據(jù)庫(kù)當(dāng)中,只要有NULL參與的數(shù)學(xué)運(yùn)算,最終結(jié)果就是NULL。mysql> select ename, sal + comm as salcomm from emp;+--------+---------+| ename | salcomm |+--------+---------+| SMITH | NULL || ALLEN | 1900.00 || WARD | 1750.00 || JONES | NULL || MARTIN | 2650.00 || BLAKE | NULL || CLARK | NULL || SCOTT | NULL || KING | NULL || TURNER | 1500.00 || ADAMS | NULL || JAMES | NULL || FORD | NULL || MILLER | NULL |+--------+---------+計(jì)算每個(gè)員工的年薪?年薪 = (月薪 + 月補(bǔ)助) * 12select ename, (sal + comm) * 12 as yearsal from emp;+--------+----------+| ename | yearsal |+--------+----------+| SMITH | NULL || ALLEN | 22800.00 || WARD | 21000.00 || JONES | NULL || MARTIN | 31800.00 || BLAKE | NULL || CLARK | NULL || SCOTT | NULL || KING | NULL || TURNER | 18000.00 || ADAMS | NULL || JAMES | NULL || FORD | NULL || MILLER | NULL |+--------+----------+注意:NULL只要參與運(yùn)算,最終結(jié)果一定是NULL。為了避免這個(gè)現(xiàn)象,需要使用ifnull函數(shù)。ifnull函數(shù)用法:ifnull(數(shù)據(jù), 被當(dāng)做哪個(gè)值)如果“數(shù)據(jù)”為NULL的時(shí)候,把這個(gè)數(shù)據(jù)結(jié)構(gòu)當(dāng)做哪個(gè)值。補(bǔ)助為NULL的時(shí)候,將補(bǔ)助當(dāng)做0select ename, (sal + ifnull(comm, 0)) * 12 as yearsal from emp;+--------+----------+| ename | yearsal |+--------+----------+| SMITH | 9600.00 || ALLEN | 22800.00 || WARD | 21000.00 || JONES | 35700.00 || MARTIN | 31800.00 || BLAKE | 34200.00 || CLARK | 29400.00 || SCOTT | 36000.00 || KING | 60000.00 || TURNER | 18000.00 || ADAMS | 13200.00 || JAMES | 11400.00 || FORD | 36000.00 || MILLER | 15600.00 |+--------+----------+18、分組函數(shù)(多行處理函數(shù))
多行處理函數(shù)的特點(diǎn):輸入多行,最終輸出一行。5個(gè):count 計(jì)數(shù)sum 求和avg 平均值max 最大值min 最小值注意:分組函數(shù)在使用的時(shí)候必須先進(jìn)行分組,然后才能用。如果你沒有對(duì)數(shù)據(jù)進(jìn)行分組,整張表默認(rèn)為一組。找出最高工資?mysql> select max(sal) from emp;+----------+| max(sal) |+----------+| 5000.00 |+----------+找出最低工資?mysql> select min(sal) from emp;+----------+| min(sal) |+----------+| 800.00 |+----------+計(jì)算工資和:mysql> select sum(sal) from emp;+----------+| sum(sal) |+----------+| 29025.00 |+----------+計(jì)算平均工資:mysql> select avg(sal) from emp;+-------------+| avg(sal) |+-------------+| 2073.214286 |+-------------+14個(gè)工資全部加起來(lái),然后除以14。計(jì)算員工數(shù)量?mysql> select count(ename) from emp;+--------------+| count(ename) |+--------------+| 14 |+--------------+分組函數(shù)在使用的時(shí)候需要注意哪些?第一點(diǎn):分組函數(shù)自動(dòng)忽略NULL,你不需要提前對(duì)NULL進(jìn)行處理。mysql> select sum(comm) from emp;+-----------+| sum(comm) |+-----------+| 2200.00 |+-----------+mysql> select count(comm) from emp;+-------------+| count(comm) |+-------------+| 4 |+-------------+mysql> select avg(comm) from emp;+------------+| avg(comm) |+------------+| 550.000000 |+------------+第二點(diǎn):分組函數(shù)中count(*)和count(具體字段)有什么區(qū)別?mysql> select count(*) from emp;+----------+| count(*) |+----------+| 14 |+----------+mysql> select count(comm) from emp;+-------------+| count(comm) |+-------------+| 4 |+-------------+count(具體字段):表示統(tǒng)計(jì)該字段下所有不為NULL的元素的總數(shù)。count(*):統(tǒng)計(jì)表當(dāng)中的總行數(shù)。(只要有一行數(shù)據(jù)count則++)因?yàn)槊恳恍杏涗洸豢赡芏紴镹ULL,一行數(shù)據(jù)中有一列不為NULL,則這行數(shù)據(jù)就是有效的。第三點(diǎn):分組函數(shù)不能夠直接使用在where子句中。找出比最低工資高的員工信息。select ename,sal from emp where sal > min(sal);表面上沒問(wèn)題,運(yùn)行一下?ERROR 1111 (HY000): Invalid use of group function?????????????????????????????????????????????????????????????????????說(shuō)完分組查詢(group by)之后就明白了了。第四點(diǎn):所有的分組函數(shù)可以組合起來(lái)一起用。select sum(sal),min(sal),max(sal),avg(sal),count(*) from emp;+----------+----------+----------+-------------+----------+| sum(sal) | min(sal) | max(sal) | avg(sal) | count(*) |+----------+----------+----------+-------------+----------+| 29025.00 | 800.00 | 5000.00 | 2073.214286 | 14 |+----------+----------+----------+-------------+----------+19、分組查詢(非常重要:五顆星*****)
19.1、什么是分組查詢?在實(shí)際的應(yīng)用中,可能有這樣的需求,需要先進(jìn)行分組,然后對(duì)每一組的數(shù)據(jù)進(jìn)行操作。這個(gè)時(shí)候我們需要使用分組查詢,怎么進(jìn)行分組查詢呢?select...from...group by...計(jì)算每個(gè)部門的工資和?計(jì)算每個(gè)工作崗位的平均薪資?找出每個(gè)工作崗位的最高薪資?....19.2、將之前的關(guān)鍵字全部組合在一起,來(lái)看一下他們的執(zhí)行順序?select...from...where...group by...order by...以上關(guān)鍵字的順序不能顛倒,需要記憶。執(zhí)行順序是什么?1. from2. where3. group by4. select5. order by為什么分組函數(shù)不能直接使用在where后面?select ename,sal from emp where sal > min(sal);//報(bào)錯(cuò)。因?yàn)榉纸M函數(shù)在使用的時(shí)候必須先分組之后才能使用。where執(zhí)行的時(shí)候,還沒有分組。所以where后面不能出現(xiàn)分組函數(shù)。select sum(sal) from emp; 這個(gè)沒有分組,為啥sum()函數(shù)可以用呢?因?yàn)閟elect在group by之后執(zhí)行。19.3、找出每個(gè)工作崗位的工資和?實(shí)現(xiàn)思路:按照工作崗位分組,然后對(duì)工資求和。select job,sum(sal)fromempgroup byjob;+-----------+----------+| job | sum(sal) |+-----------+----------+| ANALYST | 6000.00 || CLERK | 4150.00 || MANAGER | 8275.00 || PRESIDENT | 5000.00 || SALESMAN | 5600.00 |+-----------+----------+以上這個(gè)語(yǔ)句的執(zhí)行順序?先從emp表中查詢數(shù)據(jù)。根據(jù)job字段進(jìn)行分組。然后對(duì)每一組的數(shù)據(jù)進(jìn)行sum(sal)select ename,job,sum(sal) from emp group by job;+-------+-----------+----------+| ename | job | sum(sal) |+-------+-----------+----------+| SCOTT | ANALYST | 6000.00 || SMITH | CLERK | 4150.00 || JONES | MANAGER | 8275.00 || KING | PRESIDENT | 5000.00 || ALLEN | SALESMAN | 5600.00 |+-------+-----------+----------+以上語(yǔ)句在mysql中可以執(zhí)行,但是毫無(wú)意義。以上語(yǔ)句在oracle中執(zhí)行報(bào)錯(cuò)。oracle的語(yǔ)法比mysql的語(yǔ)法嚴(yán)格。(mysql的語(yǔ)法相對(duì)來(lái)說(shuō)松散一些!)重點(diǎn)結(jié)論:在一條select語(yǔ)句當(dāng)中,如果有g(shù)roup by語(yǔ)句的話,select后面只能跟:參加分組的字段,以及分組函數(shù)。其它的一律不能跟。19.4、找出每個(gè)部門的最高薪資實(shí)現(xiàn)思路是什么?按照部門編號(hào)分組,求每一組的最大值。select后面添加ename字段沒有意義,另外oracle會(huì)報(bào)錯(cuò)。mysql> select ename,deptno,max(sal) from emp group by deptno;+-------+--------+----------+| ename | deptno | max(sal) |+-------+--------+----------+| CLARK | 10 | 5000.00 || SMITH | 20 | 3000.00 || ALLEN | 30 | 2850.00 |+-------+--------+----------+mysql> select deptno,max(sal) from emp group by deptno;+--------+----------+| deptno | max(sal) |+--------+----------+| 10 | 5000.00 || 20 | 3000.00 || 30 | 2850.00 |+--------+----------+19.5、找出“每個(gè)部門,不同工作崗位”的最高薪資?+--------+-----------+---------+--------+| ename | job | sal | deptno |+--------+-----------+---------+--------+| MILLER | CLERK | 1300.00 | 10 || KING | PRESIDENT | 5000.00 | 10 || CLARK | MANAGER | 2450.00 | 10 || FORD | ANALYST | 3000.00 | 20 || ADAMS | CLERK | 1100.00 | 20 || SCOTT | ANALYST | 3000.00 | 20 || JONES | MANAGER | 2975.00 | 20 || SMITH | CLERK | 800.00 | 20 || BLAKE | MANAGER | 2850.00 | 30 || MARTIN | SALESMAN | 1250.00 | 30 || ALLEN | SALESMAN | 1600.00 | 30 || TURNER | SALESMAN | 1500.00 | 30 || WARD | SALESMAN | 1250.00 | 30 || JAMES | CLERK | 950.00 | 30 |+--------+-----------+---------+--------+技巧:兩個(gè)字段聯(lián)合成1個(gè)字段看。(兩個(gè)字段聯(lián)合分組)select deptno, job, max(sal)fromempgroup bydeptno, job;+--------+-----------+----------+| deptno | job | max(sal) |+--------+-----------+----------+| 10 | CLERK | 1300.00 || 10 | MANAGER | 2450.00 || 10 | PRESIDENT | 5000.00 || 20 | ANALYST | 3000.00 || 20 | CLERK | 1100.00 || 20 | MANAGER | 2975.00 || 30 | CLERK | 950.00 || 30 | MANAGER | 2850.00 || 30 | SALESMAN | 1600.00 |+--------+-----------+----------+19.6、使用having可以對(duì)分完組之后的數(shù)據(jù)進(jìn)一步過(guò)濾。 having不能單獨(dú)使用,having不能代替where,having必須 和group by聯(lián)合使用。找出每個(gè)部門最高薪資,要求顯示最高薪資大于3000的?第一步:找出每個(gè)部門最高薪資按照部門編號(hào)分組,求每一組最大值。select deptno,max(sal) from emp group by deptno;+--------+----------+| deptno | max(sal) |+--------+----------+| 10 | 5000.00 || 20 | 3000.00 || 30 | 2850.00 |+--------+----------+第二步:要求顯示最高薪資大于3000select deptno,max(sal) from emp group by deptnohavingmax(sal) > 3000;+--------+----------+| deptno | max(sal) |+--------+----------+| 10 | 5000.00 |+--------+----------+思考一個(gè)問(wèn)題:以上的sql語(yǔ)句執(zhí)行效率是不是低?比較低,實(shí)際上可以這樣考慮:先將大于3000的都找出來(lái),然后再分組。select deptno,max(sal)fromempwheresal > 3000group bydeptno;+--------+----------+| deptno | max(sal) |+--------+----------+| 10 | 5000.00 |+--------+----------+優(yōu)化策略:where和having,優(yōu)先選擇where,where實(shí)在完成不了了,再選擇having。19.7、where沒辦法的????找出每個(gè)部門平均薪資,要求顯示平均薪資高于2500的。第一步:找出每個(gè)部門平均薪資select deptno,avg(sal) from emp group by deptno;+--------+-------------+| deptno | avg(sal) |+--------+-------------+| 10 | 2916.666667 || 20 | 2175.000000 || 30 | 1566.666667 |+--------+-------------+第二步:要求顯示平均薪資高于2500的select deptno,avg(sal) from emp group by deptnohavingavg(sal) > 2500;+--------+-------------+| deptno | avg(sal) |+--------+-------------+| 10 | 2916.666667 |+--------+-------------+20、大總結(jié)(單表的查詢學(xué)完了)
select
…
from
…
where
…
group by
…
having
…
order by
…
Second day
mysql day02課堂筆記
1、把查詢結(jié)果去除重復(fù)記錄【distinct】
注意:原表數(shù)據(jù)不會(huì)被修改,只是查詢結(jié)果去重。
去重需要使用一個(gè)關(guān)鍵字:distinct
2、連接查詢
2.1、什么是連接查詢?
從一張表中單獨(dú)查詢,稱為單表查詢。
emp表和dept表聯(lián)合起來(lái)查詢數(shù)據(jù),從emp表中取員工名字,從dept表中取部門名字。
這種跨表查詢,多張表聯(lián)合起來(lái)查詢數(shù)據(jù),被稱為連接查詢。
2.2、連接查詢的分類?
根據(jù)語(yǔ)法的年代分類:SQL92:1992年的時(shí)候出現(xiàn)的語(yǔ)法SQL99:1999年的時(shí)候出現(xiàn)的語(yǔ)法我們這里重點(diǎn)學(xué)習(xí)SQL99.(這個(gè)過(guò)程中簡(jiǎn)單演示一個(gè)SQL92的例子)根據(jù)表連接的方式分類:內(nèi)連接:等值連接非等值連接自連接外連接:左外連接(左連接)右外連接(右連接)全連接(不講)2.3、當(dāng)兩張表進(jìn)行連接查詢時(shí),沒有任何條件的限制會(huì)發(fā)生什么現(xiàn)象?
案例:查詢每個(gè)員工所在部門名稱?mysql> select ename,deptno from emp;+--------+--------+| ename | deptno |+--------+--------+| SMITH | 20 || ALLEN | 30 || WARD | 30 || JONES | 20 || MARTIN | 30 || BLAKE | 30 || CLARK | 10 || SCOTT | 20 || KING | 10 || TURNER | 30 || ADAMS | 20 || JAMES | 30 || FORD | 20 || MILLER | 10 |+--------+--------+mysql> select * from dept;+--------+------------+----------+| DEPTNO | DNAME | LOC |+--------+------------+----------+| 10 | ACCOUNTING | NEW YORK || 20 | RESEARCH | DALLAS || 30 | SALES | CHICAGO || 40 | OPERATIONS | BOSTON |+--------+------------+----------+兩張表連接沒有任何條件限制:select ename,dname from emp, dept;+--------+------------+| ename | dname |+--------+------------+| SMITH | ACCOUNTING || SMITH | RESEARCH || SMITH | SALES || SMITH | OPERATIONS || ALLEN | ACCOUNTING || ALLEN | RESEARCH || ALLEN | SALES || ALLEN | OPERATIONS |...56 rows in set (0.00 sec)14 * 4 = 56當(dāng)兩張表進(jìn)行連接查詢,沒有任何條件限制的時(shí)候,最終查詢結(jié)果條數(shù),是兩張表?xiàng)l數(shù)的乘積,這種現(xiàn)象被稱為:笛卡爾積現(xiàn)象。(笛卡爾發(fā)現(xiàn)的,這是一個(gè)數(shù)學(xué)現(xiàn)象。)2.4、怎么避免笛卡爾積現(xiàn)象?
連接時(shí)加條件,滿足這個(gè)條件的記錄被篩選出來(lái)!
select
ename,dname
from
emp, dept
where
emp.deptno = dept.deptno;
2.5、內(nèi)連接之等值連接。
案例:查詢每個(gè)員工所在部門名稱,顯示員工名和部門名?
emp e和dept d表進(jìn)行連接。條件是:e.deptno = d.deptno
SQL92語(yǔ)法:
select
e.ename,d.dname
from
emp e, dept d
where
e.deptno = d.deptno;
SQL99語(yǔ)法:
select
e.ename,d.dname
from
emp e
join
dept d
on
e.deptno = d.deptno;
2.6、內(nèi)連接之非等值連接
案例:找出每個(gè)員工的薪資等級(jí),要求顯示員工名、薪資、薪資等級(jí)?
mysql> select * from emp; e
±------±-------±----------±-----±-----------±--------±--------±-------+
| EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO |
±------±-------±----------±-----±-----------±--------±--------±-------+
| 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800.00 | NULL | 20 |
| 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600.00 | 300.00 | 30 |
| 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250.00 | 500.00 | 30 |
| 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975.00 | NULL | 20 |
…
mysql> select * from salgrade; s
±------±------±------+
| GRADE | LOSAL | HISAL |
±------±------±------+
| 1 | 700 | 1200 |
| 2 | 1201 | 1400 |
| 3 | 1401 | 2000 |
| 4 | 2001 | 3000 |
| 5 | 3001 | 9999 |
±------±------±------+
select
e.ename, e.sal, s.grade
from
emp e
join
salgrade s
on
e.sal between s.losal and s.hisal; // 條件不是一個(gè)等量關(guān)系,稱為非等值連接。
select
e.ename, e.sal, s.grade
from
emp e
inner join
salgrade s
on
e.sal between s.losal and s.hisal;
±-------±--------±------+
| ename | sal | grade |
±-------±--------±------+
| SMITH | 800.00 | 1 |
| ALLEN | 1600.00 | 3 |
| WARD | 1250.00 | 2 |
| JONES | 2975.00 | 4 |
| MARTIN | 1250.00 | 2 |
| BLAKE | 2850.00 | 4 |
| CLARK | 2450.00 | 4 |
| SCOTT | 3000.00 | 4 |
| KING | 5000.00 | 5 |
| TURNER | 1500.00 | 3 |
| ADAMS | 1100.00 | 1 |
| JAMES | 950.00 | 1 |
| FORD | 3000.00 | 4 |
| MILLER | 1300.00 | 2 |
±-------±--------±------+
2.7、內(nèi)連接之自連接
案例:查詢員工的上級(jí)領(lǐng)導(dǎo),要求顯示員工名和對(duì)應(yīng)的領(lǐng)導(dǎo)名?
mysql> select empno,ename,mgr from emp;
±------±-------±-----+
| empno | ename | mgr |
±------±-------±-----+
| 7369 | SMITH | 7902 |
| 7499 | ALLEN | 7698 |
| 7521 | WARD | 7698 |
| 7566 | JONES | 7839 |
| 7654 | MARTIN | 7698 |
| 7698 | BLAKE | 7839 |
| 7782 | CLARK | 7839 |
| 7788 | SCOTT | 7566 |
| 7839 | KING | NULL |
| 7844 | TURNER | 7698 |
| 7876 | ADAMS | 7788 |
| 7900 | JAMES | 7698 |
| 7902 | FORD | 7566 |
| 7934 | MILLER | 7782 |
±------±-------±-----+
技巧:一張表看成兩張表。
emp a 員工表
±------±-------±-----+
| empno | ename | mgr |
±------±-------±-----+
| 7369 | SMITH | 7902 |
| 7499 | ALLEN | 7698 |
| 7521 | WARD | 7698 |
| 7566 | JONES | 7839 |
| 7654 | MARTIN | 7698 |
| 7698 | BLAKE | 7839 |
| 7782 | CLARK | 7839 |
| 7788 | SCOTT | 7566 |
| 7839 | KING | NULL |
| 7844 | TURNER | 7698 |
| 7876 | ADAMS | 7788 |
| 7900 | JAMES | 7698 |
| 7902 | FORD | 7566 |
| 7934 | MILLER | 7782 |
±------±-------±-----+
emp b 領(lǐng)導(dǎo)表
±------±-------±-----+
| empno | ename | mgr |
±------±-------±-----+
| 7369 | SMITH | 7902 |
| 7499 | ALLEN | 7698 |
| 7521 | WARD | 7698 |
| 7566 | JONES | 7839 |
| 7654 | MARTIN | 7698 |
| 7698 | BLAKE | 7839 |
| 7782 | CLARK | 7839 |
| 7788 | SCOTT | 7566 |
| 7839 | KING | NULL |
| 7844 | TURNER | 7698 |
| 7876 | ADAMS | 7788 |
| 7900 | JAMES | 7698 |
| 7902 | FORD | 7566 |
| 7934 | MILLER | 7782 |
±------±-------±-----+
select
a.ename as ‘員工名’, b.ename as ‘領(lǐng)導(dǎo)名’
from
emp a
join
emp b
on
a.mgr = b.empno; //員工的領(lǐng)導(dǎo)編號(hào) = 領(lǐng)導(dǎo)的員工編號(hào)
±-------±-------+
| 員工名 | 領(lǐng)導(dǎo)名|
±-------±-------+
| SMITH | FORD |
| ALLEN | BLAKE |
| WARD | BLAKE |
| JONES | KING |
| MARTIN | BLAKE |
| BLAKE | KING |
| CLARK | KING |
| SCOTT | JONES |
| TURNER | BLAKE |
| ADAMS | SCOTT |
| JAMES | BLAKE |
| FORD | JONES |
| MILLER | CLARK |
±-------±-------+
13條記錄,沒有KING。《內(nèi)連接》
以上就是內(nèi)連接中的:自連接,技巧:一張表看做兩張表。
2.8、外連接
mysql> select * from emp; e
±------±-------±----------±-----±-----------±--------±--------±-------+
| EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO |
±------±-------±----------±-----±-----------±--------±--------±-------+
| 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800.00 | NULL | 20 |
| 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600.00 | 300.00 | 30 |
| 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250.00 | 500.00 | 30 |
| 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975.00 | NULL | 20 |
| 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250.00 | 1400.00 | 30 |
| 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850.00 | NULL | 30 |
| 7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450.00 | NULL | 10 |
| 7788 | SCOTT | ANALYST | 7566 | 1987-04-19 | 3000.00 | NULL | 20 |
| 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000.00 | NULL | 10 |
| 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500.00 | 0.00 | 30 |
| 7876 | ADAMS | CLERK | 7788 | 1987-05-23 | 1100.00 | NULL | 20 |
| 7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950.00 | NULL | 30 |
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000.00 | NULL | 20 |
| 7934 | MILLER | CLERK | 7782 | 1982-01-23 | 1300.00 | NULL | 10 |
±------±-------±----------±-----±-----------±--------±--------±-------+
mysql> select * from dept; d
±-------±-----------±---------+
| DEPTNO | DNAME | LOC |
±-------±-----------±---------+
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
±-------±-----------±---------+
內(nèi)連接:(A和B連接,AB兩張表沒有主次關(guān)系。平等的。)
select
e.ename,d.dname
from
emp e
join
dept d
on
e.deptno = d.deptno; //內(nèi)連接的特點(diǎn):完成能夠匹配上這個(gè)條件的數(shù)據(jù)查詢出來(lái)。
±-------±-----------+
| ename | dname |
±-------±-----------+
| CLARK | ACCOUNTING |
| KING | ACCOUNTING |
| MILLER | ACCOUNTING |
| SMITH | RESEARCH |
| JONES | RESEARCH |
| SCOTT | RESEARCH |
| ADAMS | RESEARCH |
| FORD | RESEARCH |
| ALLEN | SALES |
| WARD | SALES |
| MARTIN | SALES |
| BLAKE | SALES |
| TURNER | SALES |
| JAMES | SALES |
±-------±-----------+
外連接(右外連接):
select
e.ename,d.dname
from
emp e
right join
dept d
on
e.deptno = d.deptno;
// outer是可以省略的,帶著可讀性強(qiáng)。
select
e.ename,d.dname
from
emp e
right outer join
dept d
on
e.deptno = d.deptno;
right代表什么:表示將join關(guān)鍵字右邊的這張表看成主表,主要是為了將
這張表的數(shù)據(jù)全部查詢出來(lái),捎帶著關(guān)聯(lián)查詢左邊的表。
在外連接當(dāng)中,兩張表連接,產(chǎn)生了主次關(guān)系。
外連接(左外連接):
select
e.ename,d.dname
from
dept d
left join
emp e
on
e.deptno = d.deptno;
// outer是可以省略的,帶著可讀性強(qiáng)。
select
e.ename,d.dname
from
dept d
left outer join
emp e
on
e.deptno = d.deptno;
帶有right的是右外連接,又叫做右連接。
帶有l(wèi)eft的是左外連接,又叫做左連接。
任何一個(gè)右連接都有左連接的寫法。
任何一個(gè)左連接都有右連接的寫法。
±-------±-----------+
| ename | dname |
±-------±-----------+
| CLARK | ACCOUNTING |
| KING | ACCOUNTING |
| MILLER | ACCOUNTING |
| SMITH | RESEARCH |
| JONES | RESEARCH |
| SCOTT | RESEARCH |
| ADAMS | RESEARCH |
| FORD | RESEARCH |
| ALLEN | SALES |
| WARD | SALES |
| MARTIN | SALES |
| BLAKE | SALES |
| TURNER | SALES |
| JAMES | SALES |
| NULL | OPERATIONS |
±-------±-----------+
思考:外連接的查詢結(jié)果條數(shù)一定是 >= 內(nèi)連接的查詢結(jié)果條數(shù)?
正確。
案例:查詢每個(gè)員工的上級(jí)領(lǐng)導(dǎo),要求顯示所有員工的名字和領(lǐng)導(dǎo)名?
select
a.ename as ‘員工名’, b.ename as ‘領(lǐng)導(dǎo)名’
from
emp a
left join
emp b
on
a.mgr = b.empno;
2.9、三張表,四張表怎么連接?
語(yǔ)法:
select
…
from
a
join
b
on
a和b的連接條件
join
c
on
a和c的連接條件
right join
d
on
a和d的連接條件
3、子查詢?
3.1、什么是子查詢?
select語(yǔ)句中嵌套select語(yǔ)句,被嵌套的select語(yǔ)句稱為子查詢。
3.2、子查詢都可以出現(xiàn)在哪里呢?
select
…(select).
from
…(select).
where
…(select).
3.3、where子句中的子查詢
案例:找出比最低工資高的員工姓名和工資?select ename,salfromemp wheresal > min(sal);ERROR 1111 (HY000): Invalid use of group functionwhere子句中不能直接使用分組函數(shù)。實(shí)現(xiàn)思路:第一步:查詢最低工資是多少select min(sal) from emp;+----------+| min(sal) |+----------+| 800.00 |+----------+第二步:找出>800的select ename,sal from emp where sal > 800;第三步:合并select ename,sal from emp where sal > (select min(sal) from emp);+--------+---------+| ename | sal |+--------+---------+| ALLEN | 1600.00 || WARD | 1250.00 || JONES | 2975.00 || MARTIN | 1250.00 || BLAKE | 2850.00 || CLARK | 2450.00 || SCOTT | 3000.00 || KING | 5000.00 || TURNER | 1500.00 || ADAMS | 1100.00 || JAMES | 950.00 || FORD | 3000.00 || MILLER | 1300.00 |+--------+---------+3.4、from子句中的子查詢
注意:from后面的子查詢,可以將子查詢的查詢結(jié)果當(dāng)做一張臨時(shí)表。(技巧)
3.5、select后面出現(xiàn)的子查詢(這個(gè)內(nèi)容不需要掌握,了解即可!!!)
案例:找出每個(gè)員工的部門名稱,要求顯示員工名,部門名?
select
e.ename,e.deptno,(select d.dname from dept d where e.deptno = d.deptno) as dname
from
emp e;
4、union合并查詢結(jié)果集
案例:查詢工作崗位是MANAGER和SALESMAN的員工?
select ename,job from emp where job = ‘MANAGER’ or job = ‘SALESMAN’;
select ename,job from emp where job in(‘MANAGER’,‘SALESMAN’);
±-------±---------+
| ename | job |
±-------±---------+
| ALLEN | SALESMAN |
| WARD | SALESMAN |
| JONES | MANAGER |
| MARTIN | SALESMAN |
| BLAKE | MANAGER |
| CLARK | MANAGER |
| TURNER | SALESMAN |
±-------±---------+
union在使用的時(shí)候有注意事項(xiàng)嗎?
//錯(cuò)誤的:union在進(jìn)行結(jié)果集合并的時(shí)候,要求兩個(gè)結(jié)果集的列數(shù)相同。 select ename,job from emp where job = 'MANAGER' union select ename from emp where job = 'SALESMAN';// MYSQL可以,oracle語(yǔ)法嚴(yán)格 ,不可以,報(bào)錯(cuò)。要求:結(jié)果集合并時(shí)列和列的數(shù)據(jù)類型也要一致。 select ename,job from emp where job = 'MANAGER' union select ename,sal from emp where job = 'SALESMAN'; +--------+---------+ | ename | job | +--------+---------+ | JONES | MANAGER | | BLAKE | MANAGER | | CLARK | MANAGER | | ALLEN | 1600 | | WARD | 1250 | | MARTIN | 1250 | | TURNER | 1500 | +--------+---------+5、limit(非常重要)
5.1、limit作用:將查詢結(jié)果集的一部分取出來(lái)。通常使用在分頁(yè)查詢當(dāng)中。
百度默認(rèn):一頁(yè)顯示10條記錄。
分頁(yè)的作用是為了提高用戶的體驗(yàn),因?yàn)橐淮稳慷疾槌鰜?lái),用戶體驗(yàn)差。
可以一頁(yè)一頁(yè)翻頁(yè)看。
5.2、limit怎么用呢?
完整用法:limit startIndex, lengthstartIndex是起始下標(biāo),length是長(zhǎng)度。起始下標(biāo)從0開始。缺省用法:limit 5; 這是取前5.按照薪資降序,取出排名在前5名的員工? select ename,sal fromemp order by sal desc limit 5; //取前5select ename,sal fromemp order by sal desc limit 0,5;+-------+---------+ | ename | sal | +-------+---------+ | KING | 5000.00 | | SCOTT | 3000.00 | | FORD | 3000.00 | | JONES | 2975.00 | | BLAKE | 2850.00 | +-------+---------+5.3、注意:mysql當(dāng)中l(wèi)imit在order by之后執(zhí)行!!!!!!
5.4、取出工資排名在[3-5]名的員工?
select
ename,sal
from
emp
order by
sal desc
limit
2, 3;
5.5、取出工資排名在[5-9]名的員工?
select
ename,sal
from
emp
order by
sal desc
limit
4, 5;
5.6、分頁(yè)
每頁(yè)顯示3條記錄
第1頁(yè):limit 0,3 [0 1 2]
第2頁(yè):limit 3,3 [3 4 5]
第3頁(yè):limit 6,3 [6 7 8]
第4頁(yè):limit 9,3 [9 10 11]
每頁(yè)顯示pageSize條記錄
第pageNo頁(yè):limit (pageNo - 1) * pageSize , pageSize
記公式:
limit (pageNo-1)*pageSize , pageSize
6、關(guān)于DQL語(yǔ)句的大總結(jié):
select
…
from
…
where
…
group by
…
having
…
order by
…
limit
…
7、表的創(chuàng)建(建表)
7.1、建表的語(yǔ)法格式:(建表屬于DDL語(yǔ)句,DDL包括:create drop alter)
create table 表名(字段名1 數(shù)據(jù)類型, 字段名2 數(shù)據(jù)類型, 字段名3 數(shù)據(jù)類型);create table 表名(字段名1 數(shù)據(jù)類型, 字段名2 數(shù)據(jù)類型, 字段名3 數(shù)據(jù)類型 );表名:建議以t_ 或者 tbl_開始,可讀性強(qiáng)。見名知意。 字段名:見名知意。 表名和字段名都屬于標(biāo)識(shí)符。7.2、關(guān)于mysql中的數(shù)據(jù)類型?
很多數(shù)據(jù)類型,我們只需要掌握一些常見的數(shù)據(jù)類型即可。varchar(最長(zhǎng)255)可變長(zhǎng)度的字符串比較智能,節(jié)省空間。會(huì)根據(jù)實(shí)際的數(shù)據(jù)長(zhǎng)度動(dòng)態(tài)分配空間。優(yōu)點(diǎn):節(jié)省空間缺點(diǎn):需要?jiǎng)討B(tài)分配空間,速度慢。char(最長(zhǎng)255)定長(zhǎng)字符串不管實(shí)際的數(shù)據(jù)長(zhǎng)度是多少。分配固定長(zhǎng)度的空間去存儲(chǔ)數(shù)據(jù)。使用不恰當(dāng)?shù)臅r(shí)候,可能會(huì)導(dǎo)致空間的浪費(fèi)。優(yōu)點(diǎn):不需要?jiǎng)討B(tài)分配空間,速度快。缺點(diǎn):使用不當(dāng)可能會(huì)導(dǎo)致空間的浪費(fèi)。varchar和char我們應(yīng)該怎么選擇?性別字段你選什么?因?yàn)樾詣e是固定長(zhǎng)度的字符串,所以選擇char。姓名字段你選什么?每一個(gè)人的名字長(zhǎng)度不同,所以選擇varchar。int(最長(zhǎng)11)數(shù)字中的整數(shù)型。等同于java的int。bigint數(shù)字中的長(zhǎng)整型。等同于java中的long。float 單精度浮點(diǎn)型數(shù)據(jù)double雙精度浮點(diǎn)型數(shù)據(jù)date短日期類型datetime長(zhǎng)日期類型clob字符大對(duì)象最多可以存儲(chǔ)4G的字符串。比如:存儲(chǔ)一篇文章,存儲(chǔ)一個(gè)說(shuō)明。超過(guò)255個(gè)字符的都要采用CLOB字符大對(duì)象來(lái)存儲(chǔ)。Character Large OBject:CLOBblob二進(jìn)制大對(duì)象Binary Large OBject專門用來(lái)存儲(chǔ)圖片、聲音、視頻等流媒體數(shù)據(jù)。往BLOB類型的字段上插入數(shù)據(jù)的時(shí)候,例如插入一個(gè)圖片、視頻等,你需要使用IO流才行。t_movie 電影表(專門存儲(chǔ)電影信息的)編號(hào) 名字 故事情節(jié) 上映日期 時(shí)長(zhǎng) 海報(bào) 類型 no(bigint) name(varchar) history(clob) playtime(date) time(double) image(blob) type(char) ------------------------------------------------------------------------------------------------------------------ 10000 哪吒 ........... 2019-10-11 2.5 .... '1' 10001 林正英之娘娘 ........... 2019-11-11 1.5 .... '2' ....7.3、創(chuàng)建一個(gè)學(xué)生表?
學(xué)號(hào)、姓名、年齡、性別、郵箱地址
create table t_student(
no int,
name varchar(32),
sex char(1),
age int(3),
email varchar(255)
);
7.4、插入數(shù)據(jù)insert (DML)
語(yǔ)法格式:insert into 表名(字段名1,字段名2,字段名3...) values(值1,值2,值3);注意:字段名和值要一一對(duì)應(yīng)。什么是一一對(duì)應(yīng)?數(shù)量要對(duì)應(yīng)。數(shù)據(jù)類型要對(duì)應(yīng)。insert into t_student(no,name,sex,age,email) values(1,'zhangsan','m',20,'zhangsan@123.com'); insert into t_student(email,name,sex,age,no) values('lisi@123.com','lisi','f',20,2);insert into t_student(no) values(3);+------+----------+------+------+------------------+ | no | name | sex | age | email | +------+----------+------+------+------------------+ | 1 | zhangsan | m | 20 | zhangsan@123.com | | 2 | lisi | f | 20 | lisi@123.com | | 3 | NULL | NULL | NULL | NULL | +------+----------+------+------+------------------+ insert into t_student(name) values('wangwu'); +------+----------+------+------+------------------+ | no | name | sex | age | email | +------+----------+------+------+------------------+ | 1 | zhangsan | m | 20 | zhangsan@123.com | | 2 | lisi | f | 20 | lisi@123.com | | 3 | NULL | NULL | NULL | NULL | | NULL | wangwu | NULL | NULL | NULL | +------+----------+------+------+------------------+ 注意:insert語(yǔ)句但凡是執(zhí)行成功了,那么必然會(huì)多一條記錄。 沒有給其它字段指定值的話,默認(rèn)值是NULL。drop table if exists t_student; create table t_student(no int,name varchar(32),sex char(1) default 'm',age int(3),email varchar(255) );+-------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+-------+ | no | int(11) | YES | | NULL | | | name | varchar(32) | YES | | NULL | | | sex | char(1) | YES | | m | | | age | int(3) | YES | | NULL | | | email | varchar(255) | YES | | NULL | | +-------+--------------+------+-----+---------+-------+ insert into t_student(no) values(1); mysql> select * from t_student; +------+------+------+------+-------+ | no | name | sex | age | email | +------+------+------+------+-------+ | 1 | NULL | m | NULL | NULL | +------+------+------+------+-------+insert語(yǔ)句中的“字段名”可以省略嗎?可以insert into t_student values(2); //錯(cuò)誤的// 注意:前面的字段名省略的話,等于都寫上了!所以值也要都寫上!insert into t_student values(2, 'lisi', 'f', 20, 'lisi@123.com');+------+------+------+------+--------------+| no | name | sex | age | email |+------+------+------+------+--------------+| 1 | NULL | m | NULL | NULL || 2 | lisi | f | 20 | lisi@123.com |+------+------+------+------+--------------+7.5、insert插入日期
數(shù)字格式化:formatselect ename,sal from emp;+--------+---------+| ename | sal |+--------+---------+| SMITH | 800.00 || ALLEN | 1600.00 || WARD | 1250.00 || JONES | 2975.00 || MARTIN | 1250.00 || BLAKE | 2850.00 || CLARK | 2450.00 || SCOTT | 3000.00 || KING | 5000.00 || TURNER | 1500.00 || ADAMS | 1100.00 || JAMES | 950.00 || FORD | 3000.00 || MILLER | 1300.00 |+--------+---------+格式化數(shù)字:format(數(shù)字, '格式')select ename,format(sal, '$999,999') as sal from emp;+--------+-------+| ename | sal |+--------+-------+| SMITH | 800 || ALLEN | 1,600 || WARD | 1,250 || JONES | 2,975 || MARTIN | 1,250 || BLAKE | 2,850 || CLARK | 2,450 || SCOTT | 3,000 || KING | 5,000 || TURNER | 1,500 || ADAMS | 1,100 || JAMES | 950 || FORD | 3,000 || MILLER | 1,300 |+--------+-------+str_to_date:將字符串varchar類型轉(zhuǎn)換成date類型 date_format:將date類型轉(zhuǎn)換成具有一定格式的varchar字符串類型。drop table if exists t_user; create table t_user(id int,name varchar(32),birth date // 生日也可以使用date日期類型 );create table t_user(id int,name varchar(32),birth char(10) // 生日可以使用字符串,沒問(wèn)題。 );生日:1990-10-11 (10個(gè)字符)注意:數(shù)據(jù)庫(kù)中的有一條命名規(guī)范:所有的標(biāo)識(shí)符都是全部小寫,單詞和單詞之間使用下劃線進(jìn)行銜接。mysql> desc t_user; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(32) | YES | | NULL | | | birth | date | YES | | NULL | | +-------+-------------+------+-----+---------+-------+插入數(shù)據(jù)?insert into t_user(id,name,birth) values(1, 'zhangsan', '01-10-1990'); // 1990年10月1日出問(wèn)題了:原因是類型不匹配。數(shù)據(jù)庫(kù)birth是date類型,這里給了一個(gè)字符串varchar。怎么辦?可以使用str_to_date函數(shù)進(jìn)行類型轉(zhuǎn)換。str_to_date函數(shù)可以將字符串轉(zhuǎn)換成日期類型date?語(yǔ)法格式:str_to_date('字符串日期', '日期格式')mysql的日期格式:%Y 年%m 月%d 日%h 時(shí)%i 分%s 秒insert into t_user(id,name,birth) values(1, 'zhangsan', str_to_date('01-10-1990','%d-%m-%Y'));str_to_date函數(shù)可以把字符串varchar轉(zhuǎn)換成日期date類型數(shù)據(jù),通常使用在插入insert方面,因?yàn)椴迦氲臅r(shí)候需要一個(gè)日期類型的數(shù)據(jù),需要通過(guò)該函數(shù)將字符串轉(zhuǎn)換成date。好消息?如果你提供的日期字符串是這個(gè)格式,str_to_date函數(shù)就不需要了!!!%Y-%m-%dinsert into t_user(id,name,birth) values(2, 'lisi', '1990-10-01');查詢的時(shí)候可以以某個(gè)特定的日期格式展示嗎?date_format這個(gè)函數(shù)可以將日期類型轉(zhuǎn)換成特定格式的字符串。select id,name,date_format(birth, '%m/%d/%Y') as birth from t_user;+------+----------+------------+| id | name | birth |+------+----------+------------+| 1 | zhangsan | 10/01/1990 || 2 | lisi | 10/01/1990 |+------+----------+------------+date_format函數(shù)怎么用?date_format(日期類型數(shù)據(jù), '日期格式')這個(gè)函數(shù)通常使用在查詢?nèi)掌诜矫妗TO(shè)置展示的日期格式。mysql> select id,name,birth from t_user;+------+----------+------------+| id | name | birth |+------+----------+------------+| 1 | zhangsan | 1990-10-01 || 2 | lisi | 1990-10-01 |+------+----------+------------+以上的SQL語(yǔ)句實(shí)際上是進(jìn)行了默認(rèn)的日期格式化,自動(dòng)將數(shù)據(jù)庫(kù)中的date類型轉(zhuǎn)換成varchar類型。并且采用的格式是mysql默認(rèn)的日期格式:'%Y-%m-%d'select id,name,date_format(birth,'%Y/%m/%d') as birth from t_user;java中的日期格式?yyyy-MM-dd HH:mm:ss SSS7.6、date和datetime兩個(gè)類型的區(qū)別?
date是短日期:只包括年月日信息。
datetime是長(zhǎng)日期:包括年月日時(shí)分秒信息。
7.7、修改update(DML)
語(yǔ)法格式:
update 表名 set 字段名1=值1,字段名2=值2,字段名3=值3… where 條件;
7.8、刪除數(shù)據(jù) delete (DML)
語(yǔ)法格式?
delete from 表名 where 條件;
mysql day03課堂筆記
1、查詢每一個(gè)員工的所在部門名稱?要求顯示員工名和部門名。
mysql> select * from emp;
±------±-------±----------±-----±-----------±--------±--------±-------+
| EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO |
±------±-------±----------±-----±-----------±--------±--------±-------+
| 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800.00 | NULL | 20 |
| 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600.00 | 300.00 | 30 |
| 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250.00 | 500.00 | 30 |
| 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975.00 | NULL | 20 |
| 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250.00 | 1400.00 | 30 |
| 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850.00 | NULL | 30 |
| 7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450.00 | NULL | 10 |
| 7788 | SCOTT | ANALYST | 7566 | 1987-04-19 | 3000.00 | NULL | 20 |
| 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000.00 | NULL | 10 |
| 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500.00 | 0.00 | 30 |
| 7876 | ADAMS | CLERK | 7788 | 1987-05-23 | 1100.00 | NULL | 20 |
| 7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950.00 | NULL | 30 |
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000.00 | NULL | 20 |
| 7934 | MILLER | CLERK | 7782 | 1982-01-23 | 1300.00 | NULL | 10 |
±------±-------±----------±-----±-----------±--------±--------±-------+
mysql> select * from dept;
±-------±-----------±---------+
| DEPTNO | DNAME | LOC |
±-------±-----------±---------+
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
±-------±-----------±---------+
從emp表中取ename,從dept表中取dname,沒有條件限制最終查詢結(jié)果是?
ENAME DNAME
SMITH ACCOUNTING 無(wú)效記錄
SMITH RESEARCH 有效記錄
SMITH SALES 無(wú)效記錄
SMITH OPERATIONS 無(wú)效記錄
ALLEN ACCOUNTING
ALLEN RESEARCH
ALLEN SALES
ALLEN OPERATIONS
…
56條記錄。
加個(gè)條件是為了達(dá)到4選1,也是為了數(shù)據(jù)的有效性。
select e.ename,d.dname fromemp e joindept d one.deptno = d.deptno;加條件只是為了避免笛卡爾積現(xiàn)象,只是為了查詢出有效的組合記錄。 匹配的次數(shù)一次都沒有少,還是56次。2、insert語(yǔ)句可以一次插入多條記錄嗎?【掌握】
可以的!
mysql> desc t_user;
±------------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------------±------------±-----±----±--------±------+
| id | int(11) | YES | | NULL | |
| name | varchar(32) | YES | | NULL | |
| birth | date | YES | | NULL | |
| create_time | datetime | YES | | NULL | |
±------------±------------±-----±----±--------±------+
3、快速創(chuàng)建表?【了解內(nèi)容】
mysql> create table emp2 as select * from emp;原理:將一個(gè)查詢結(jié)果當(dāng)做一張表新建!!!!!這個(gè)可以完成表的快速?gòu)?fù)制!!!!表創(chuàng)建出來(lái),同時(shí)表中的數(shù)據(jù)也存在了!!!create table mytable as select empno,ename from emp where job = 'MANAGER';4、將查詢結(jié)果插入到一張表當(dāng)中?insert相關(guān)的!!!【了解內(nèi)容】
create table dept_bak as select * from dept;
mysql> select * from dept_bak;
±-------±-----------±---------+
| DEPTNO | DNAME | LOC |
±-------±-----------±---------+
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
±-------±-----------±---------+
5、快速刪除表中的數(shù)據(jù)?【truncate比較重要,必須掌握】
//刪除dept_bak表中的數(shù)據(jù) delete from dept_bak; //這種刪除數(shù)據(jù)的方式比較慢。mysql> select * from dept_bak; Empty set (0.00 sec)delete語(yǔ)句刪除數(shù)據(jù)的原理?(delete屬于DML語(yǔ)句!!!)表中的數(shù)據(jù)被刪除了,但是這個(gè)數(shù)據(jù)在硬盤上的真實(shí)存儲(chǔ)空間不會(huì)被釋放!!!這種刪除缺點(diǎn)是:刪除效率比較低。這種刪除優(yōu)點(diǎn)是:支持回滾,后悔了可以再恢復(fù)數(shù)據(jù)!!!truncate語(yǔ)句刪除數(shù)據(jù)的原理?這種刪除效率比較高,表被一次截?cái)?#xff0c;物理刪除。這種刪除缺點(diǎn):不支持回滾。這種刪除優(yōu)點(diǎn):快速。用法:truncate table dept_bak; (這種操作屬于DDL操作。)大表非常大,上億條記錄????刪除的時(shí)候,使用delete,也許需要執(zhí)行1個(gè)小時(shí)才能刪除完!效率較低。可以選擇使用truncate刪除表中的數(shù)據(jù)。只需要不到1秒鐘的時(shí)間就刪除結(jié)束。效率較高。但是使用truncate之前,必須仔細(xì)詢問(wèn)客戶是否真的要?jiǎng)h除,并警告刪除之后不可恢復(fù)!truncate是刪除表中的數(shù)據(jù),表還在!刪除表操作?drop table 表名; // 這不是刪除表中的數(shù)據(jù),這是把表刪除。6、對(duì)表結(jié)構(gòu)的增刪改?
什么是對(duì)表結(jié)構(gòu)的修改?添加一個(gè)字段,刪除一個(gè)字段,修改一個(gè)字段!!!對(duì)表結(jié)構(gòu)的修改需要使用:alter 屬于DDL語(yǔ)句DDL包括:create drop alter第一:在實(shí)際的開發(fā)中,需求一旦確定之后,表一旦設(shè)計(jì)好之后,很少的 進(jìn)行表結(jié)構(gòu)的修改。因?yàn)殚_發(fā)進(jìn)行中的時(shí)候,修改表結(jié)構(gòu),成本比較高。 修改表的結(jié)構(gòu),對(duì)應(yīng)的java代碼就需要進(jìn)行大量的修改。成本是比較高的。 這個(gè)責(zé)任應(yīng)該由設(shè)計(jì)人員來(lái)承擔(dān)!第二:由于修改表結(jié)構(gòu)的操作很少,所以我們不需要掌握,如果有一天 真的要修改表結(jié)構(gòu),你可以使用工具!!!!修改表結(jié)構(gòu)的操作是不需要寫到j(luò)ava程序中的。實(shí)際上也不是java程序員的范疇。7、約束(非常重要,五顆星*****)
7.1、什么是約束?
約束對(duì)應(yīng)的英語(yǔ)單詞:constraint
在創(chuàng)建表的時(shí)候,我們可以給表中的字段加上一些約束,來(lái)保證這個(gè)表中數(shù)據(jù)的
完整性、有效性!!!
7.2、約束包括哪些?
非空約束:not null
唯一性約束: unique
主鍵約束: primary key (簡(jiǎn)稱PK)
外鍵約束:foreign key(簡(jiǎn)稱FK)
檢查約束:check(mysql不支持,oracle支持)
7.3、非空約束:not null
非空約束not null約束的字段不能為NULL。 drop table if exists t_vip; create table t_vip(id int,name varchar(255) not null // not null只有列級(jí)約束,沒有表級(jí)約束! ); insert into t_vip(id,name) values(1,'zhangsan'); insert into t_vip(id,name) values(2,'lisi');insert into t_vip(id) values(3); ERROR 1364 (HY000): Field 'name' doesn't have a default value小插曲:xxxx.sql這種文件被稱為sql腳本文件。sql腳本文件中編寫了大量的sql語(yǔ)句。我們執(zhí)行sql腳本文件的時(shí)候,該文件中所有的sql語(yǔ)句會(huì)全部執(zhí)行!批量的執(zhí)行SQL語(yǔ)句,可以使用sql腳本文件。在mysql當(dāng)中怎么執(zhí)行sql腳本呢?mysql> source D:\course\03-MySQL\document\vip.sql你在實(shí)際的工作中,第一天到了公司,項(xiàng)目經(jīng)理會(huì)給你一個(gè)xxx.sql文件,你執(zhí)行這個(gè)腳本文件,你電腦上的數(shù)據(jù)庫(kù)數(shù)據(jù)就有了!7.4、唯一性約束: unique
唯一性約束unique約束的字段不能重復(fù),但是可以為NULL。 drop table if exists t_vip; create table t_vip(id int,name varchar(255) unique,email varchar(255) ); insert into t_vip(id,name,email) values(1,'zhangsan','zhangsan@123.com'); insert into t_vip(id,name,email) values(2,'lisi','lisi@123.com'); insert into t_vip(id,name,email) values(3,'wangwu','wangwu@123.com'); select * from t_vip;insert into t_vip(id,name,email) values(4,'wangwu','wangwu@sina.com'); ERROR 1062 (23000): Duplicate entry 'wangwu' for key 'name'insert into t_vip(id) values(4); insert into t_vip(id) values(5); +------+----------+------------------+ | id | name | email | +------+----------+------------------+ | 1 | zhangsan | zhangsan@123.com | | 2 | lisi | lisi@123.com | | 3 | wangwu | wangwu@123.com | | 4 | NULL | NULL | | 5 | NULL | NULL | +------+----------+------------------+ name字段雖然被unique約束了,但是可以為NULL。新需求:name和email兩個(gè)字段聯(lián)合起來(lái)具有唯一性!!!!drop table if exists t_vip;create table t_vip(id int,name varchar(255) unique, // 約束直接添加到列后面的,叫做列級(jí)約束。email varchar(255) unique);這張表這樣創(chuàng)建是不符合我以上“新需求”的。這樣創(chuàng)建表示:name具有唯一性,email具有唯一性。各自唯一。以下這樣的數(shù)據(jù)是符合我“新需求”的。但如果采用以上方式創(chuàng)建表的話,肯定創(chuàng)建失敗,因?yàn)?#39;zhangsan'和'zhangsan'重復(fù)了。insert into t_vip(id,name,email) values(1,'zhangsan','zhangsan@123.com');insert into t_vip(id,name,email) values(2,'zhangsan','zhangsan@sina.com');怎么創(chuàng)建這樣的表,才能符合新需求呢?drop table if exists t_vip;create table t_vip(id int,name varchar(255),email varchar(255),unique(name,email) // 約束沒有添加在列的后面,這種約束被稱為表級(jí)約束。);insert into t_vip(id,name,email) values(1,'zhangsan','zhangsan@123.com');insert into t_vip(id,name,email) values(2,'zhangsan','zhangsan@sina.com');select * from t_vip;name和email兩個(gè)字段聯(lián)合起來(lái)唯一!!!insert into t_vip(id,name,email) values(3,'zhangsan','zhangsan@sina.com');ERROR 1062 (23000): Duplicate entry 'zhangsan-zhangsan@sina.com' for key 'name'什么時(shí)候使用表級(jí)約束呢?需要給多個(gè)字段聯(lián)合起來(lái)添加某一個(gè)約束的時(shí)候,需要使用表級(jí)約束。unique 和not null可以聯(lián)合嗎?drop table if exists t_vip;create table t_vip(id int,name varchar(255) not null unique);mysql> desc t_vip;+-------+--------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------+--------------+------+-----+---------+-------+| id | int(11) | YES | | NULL | || name | varchar(255) | NO | PRI | NULL | |+-------+--------------+------+-----+---------+-------+在mysql當(dāng)中,如果一個(gè)字段同時(shí)被not null和unique約束的話,該字段自動(dòng)變成主鍵字段。(注意:oracle中不一樣!)insert into t_vip(id,name) values(1,'zhangsan');insert into t_vip(id,name) values(2,'zhangsan'); //錯(cuò)誤了:name不能重復(fù)insert into t_vip(id) values(2); //錯(cuò)誤了:name不能為NULL。7.5、主鍵約束(primary key,簡(jiǎn)稱PK)非常重要五顆星*****
主鍵約束的相關(guān)術(shù)語(yǔ)?主鍵約束:就是一種約束。主鍵字段:該字段上添加了主鍵約束,這樣的字段叫做:主鍵字段主鍵值:主鍵字段中的每一個(gè)值都叫做:主鍵值。什么是主鍵?有啥用?主鍵值是每一行記錄的唯一標(biāo)識(shí)。主鍵值是每一行記錄的身份證號(hào)!!!記住:任何一張表都應(yīng)該有主鍵,沒有主鍵,表無(wú)效!!主鍵的特征:not null + unique(主鍵值不能是NULL,同時(shí)也不能重復(fù)!)怎么給一張表添加主鍵約束呢?drop table if exists t_vip;// 1個(gè)字段做主鍵,叫做:單一主鍵create table t_vip(id int primary key, //列級(jí)約束name varchar(255));insert into t_vip(id,name) values(1,'zhangsan');insert into t_vip(id,name) values(2,'lisi');//錯(cuò)誤:不能重復(fù)insert into t_vip(id,name) values(2,'wangwu');ERROR 1062 (23000): Duplicate entry '2' for key 'PRIMARY'//錯(cuò)誤:不能為NULLinsert into t_vip(name) values('zhaoliu');ERROR 1364 (HY000): Field 'id' doesn't have a default value可以這樣添加主鍵嗎,使用表級(jí)約束?drop table if exists t_vip;create table t_vip(id int,name varchar(255),primary key(id) // 表級(jí)約束);insert into t_vip(id,name) values(1,'zhangsan');//錯(cuò)誤insert into t_vip(id,name) values(1,'lisi');ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'表級(jí)約束主要是給多個(gè)字段聯(lián)合起來(lái)添加約束?drop table if exists t_vip;// id和name聯(lián)合起來(lái)做主鍵:復(fù)合主鍵!!!!create table t_vip(id int,name varchar(255),email varchar(255),primary key(id,name));insert into t_vip(id,name,email) values(1,'zhangsan','zhangsan@123.com');insert into t_vip(id,name,email) values(1,'lisi','lisi@123.com');//錯(cuò)誤:不能重復(fù)insert into t_vip(id,name,email) values(1,'lisi','lisi@123.com');ERROR 1062 (23000): Duplicate entry '1-lisi' for key 'PRIMARY'在實(shí)際開發(fā)中不建議使用:復(fù)合主鍵。建議使用單一主鍵!因?yàn)橹麈I值存在的意義就是這行記錄的身份證號(hào),只要意義達(dá)到即可,單一主鍵可以做到。復(fù)合主鍵比較復(fù)雜,不建議使用!!!一個(gè)表中主鍵約束能加兩個(gè)嗎?drop table if exists t_vip;create table t_vip(id int primary key,name varchar(255) primary key);ERROR 1068 (42000): Multiple primary key defined結(jié)論:一張表,主鍵約束只能添加1個(gè)。(主鍵只能有1個(gè)。)主鍵值建議使用:intbigintchar等類型。不建議使用:varchar來(lái)做主鍵。主鍵值一般都是數(shù)字,一般都是定長(zhǎng)的!主鍵除了:單一主鍵和復(fù)合主鍵之外,還可以這樣進(jìn)行分類?自然主鍵:主鍵值是一個(gè)自然數(shù),和業(yè)務(wù)沒關(guān)系。業(yè)務(wù)主鍵:主鍵值和業(yè)務(wù)緊密關(guān)聯(lián),例如拿銀行卡賬號(hào)做主鍵值。這就是業(yè)務(wù)主鍵!在實(shí)際開發(fā)中使用業(yè)務(wù)主鍵多,還是使用自然主鍵多一些?自然主鍵使用比較多,因?yàn)橹麈I只要做到不重復(fù)就行,不需要有意義。業(yè)務(wù)主鍵不好,因?yàn)橹麈I一旦和業(yè)務(wù)掛鉤,那么當(dāng)業(yè)務(wù)發(fā)生變動(dòng)的時(shí)候,可能會(huì)影響到主鍵值,所以業(yè)務(wù)主鍵不建議使用。盡量使用自然主鍵。在mysql當(dāng)中,有一種機(jī)制,可以幫助我們自動(dòng)維護(hù)一個(gè)主鍵值?drop table if exists t_vip;create table t_vip(id int primary key auto_increment, //auto_increment表示自增,從1開始,以1遞增!name varchar(255));insert into t_vip(name) values('zhangsan');insert into t_vip(name) values('zhangsan');insert into t_vip(name) values('zhangsan');insert into t_vip(name) values('zhangsan');insert into t_vip(name) values('zhangsan');insert into t_vip(name) values('zhangsan');insert into t_vip(name) values('zhangsan');insert into t_vip(name) values('zhangsan');select * from t_vip;+----+----------+| id | name |+----+----------+| 1 | zhangsan || 2 | zhangsan || 3 | zhangsan || 4 | zhangsan || 5 | zhangsan || 6 | zhangsan || 7 | zhangsan || 8 | zhangsan |+----+----------+7.6、外鍵約束(foreign key,簡(jiǎn)稱FK)非常重要五顆星*****
外鍵約束涉及到的相關(guān)術(shù)語(yǔ):外鍵約束:一種約束(foreign key)外鍵字段:該字段上添加了外鍵約束外鍵值:外鍵字段當(dāng)中的每一個(gè)值。業(yè)務(wù)背景:請(qǐng)?jiān)O(shè)計(jì)數(shù)據(jù)庫(kù)表,來(lái)描述“班級(jí)和學(xué)生”的信息?第一種方案:班級(jí)和學(xué)生存儲(chǔ)在一張表中???t_studentno(pk) name classno classname----------------------------------------------------------------------------------1 jack 100 北京市大興區(qū)亦莊鎮(zhèn)第二中學(xué)高三1班2 lucy 100 北京市大興區(qū)亦莊鎮(zhèn)第二中學(xué)高三1班3 lilei 100 北京市大興區(qū)亦莊鎮(zhèn)第二中學(xué)高三1班4 hanmeimei 100 北京市大興區(qū)亦莊鎮(zhèn)第二中學(xué)高三1班5 zhangsan 101 北京市大興區(qū)亦莊鎮(zhèn)第二中學(xué)高三2班6 lisi 101 北京市大興區(qū)亦莊鎮(zhèn)第二中學(xué)高三2班7 wangwu 101 北京市大興區(qū)亦莊鎮(zhèn)第二中學(xué)高三2班8 zhaoliu 101 北京市大興區(qū)亦莊鎮(zhèn)第二中學(xué)高三2班分析以上方案的缺點(diǎn):數(shù)據(jù)冗余,空間浪費(fèi)!!!!這個(gè)設(shè)計(jì)是比較失敗的!第二種方案:班級(jí)一張表、學(xué)生一張表??t_class 班級(jí)表classno(pk) classname------------------------------------------------------100 北京市大興區(qū)亦莊鎮(zhèn)第二中學(xué)高三1班101 北京市大興區(qū)亦莊鎮(zhèn)第二中學(xué)高三1班t_student 學(xué)生表no(pk) name cno(FK引用t_class這張表的classno)----------------------------------------------------------------1 jack 1002 lucy 1003 lilei 1004 hanmeimei 1005 zhangsan 1016 lisi 1017 wangwu 1018 zhaoliu 101當(dāng)cno字段沒有任何約束的時(shí)候,可能會(huì)導(dǎo)致數(shù)據(jù)無(wú)效。可能出現(xiàn)一個(gè)102,但是102班級(jí)不存在。所以為了保證cno字段中的值都是100和101,需要給cno字段添加外鍵約束。那么:cno字段就是外鍵字段。cno字段中的每一個(gè)值都是外鍵值。注意:t_class是父表t_student是子表刪除表的順序?先刪子,再刪父。創(chuàng)建表的順序?先創(chuàng)建父,再創(chuàng)建子。刪除數(shù)據(jù)的順序?先刪子,再刪父。插入數(shù)據(jù)的順序?先插入父,再插入子。思考:子表中的外鍵引用的父表中的某個(gè)字段,被引用的這個(gè)字段必須是主鍵嗎?不一定是主鍵,但至少具有unique約束。測(cè)試:外鍵可以為NULL嗎?外鍵值可以為NULL。8、存儲(chǔ)引擎(了解內(nèi)容)
8.1、什么是存儲(chǔ)引擎,有什么用呢?
存儲(chǔ)引擎是MySQL中特有的一個(gè)術(shù)語(yǔ),其它數(shù)據(jù)庫(kù)中沒有。(Oracle中有,但是不叫這個(gè)名字)
存儲(chǔ)引擎這個(gè)名字高端大氣上檔次。
實(shí)際上存儲(chǔ)引擎是一個(gè)表存儲(chǔ)/組織數(shù)據(jù)的方式。
不同的存儲(chǔ)引擎,表存儲(chǔ)數(shù)據(jù)的方式不同。
8.2、怎么給表添加/指定“存儲(chǔ)引擎”呢?
show create table t_student;
8.3、怎么查看mysql支持哪些存儲(chǔ)引擎呢?
mysql> select version();
±----------+
| version() |
±----------+
| 5.5.36 |
±----------+
命令: show engines \G
*************************** 1. row ***************************
Engine: FEDERATED
Support: NO
Comment: Federated MySQL storage engine
Transactions: NULL
XA: NULL
Savepoints: NULL
*************************** 2. row ***************************
Engine: MRG_MYISAM
Support: YES
Comment: Collection of identical MyISAM tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 3. row ***************************
Engine: MyISAM
Support: YES
Comment: MyISAM storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 4. row ***************************
Engine: BLACKHOLE
Support: YES
Comment: /dev/null storage engine (anything you write to it disappears
Transactions: NO
XA: NO
Savepoints: NO
*************************** 5. row ***************************
Engine: CSV
Support: YES
Comment: CSV storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 6. row ***************************
Engine: MEMORY
Support: YES
Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 7. row ***************************
Engine: ARCHIVE
Support: YES
Comment: Archive storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 8. row ***************************
Engine: InnoDB
Support: DEFAULT
Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
XA: YES
Savepoints: YES
*************************** 9. row ***************************
Engine: PERFORMANCE_SCHEMA
Support: YES
Comment: Performance Schema
Transactions: NO
XA: NO
Savepoints: NO
mysql支持九大存儲(chǔ)引擎,當(dāng)前5.5.36支持8個(gè)。版本不同支持情況不同。
8.4、關(guān)于mysql常用的存儲(chǔ)引擎介紹一下
MyISAM存儲(chǔ)引擎?
它管理的表具有以下特征:
使用三個(gè)文件表示每個(gè)表:
格式文件 — 存儲(chǔ)表結(jié)構(gòu)的定義(mytable.frm)
數(shù)據(jù)文件 — 存儲(chǔ)表行的內(nèi)容(mytable.MYD)
索引文件 — 存儲(chǔ)表上索引(mytable.MYI):索引是一本書的目錄,縮小掃描范圍,提高查詢效率的一種機(jī)制。
可被轉(zhuǎn)換為壓縮、只讀表來(lái)節(jié)省空間
InnoDB存儲(chǔ)引擎?
這是mysql默認(rèn)的存儲(chǔ)引擎,同時(shí)也是一個(gè)重量級(jí)的存儲(chǔ)引擎。
InnoDB支持事務(wù),支持?jǐn)?shù)據(jù)庫(kù)崩潰后自動(dòng)恢復(fù)機(jī)制。
InnoDB存儲(chǔ)引擎最主要的特點(diǎn)是:非常安全。
MEMORY存儲(chǔ)引擎?
使用 MEMORY 存儲(chǔ)引擎的表,其數(shù)據(jù)存儲(chǔ)在內(nèi)存中,且行的長(zhǎng)度固定,
這兩個(gè)特點(diǎn)使得 MEMORY 存儲(chǔ)引擎非常快。
9、事務(wù)(重點(diǎn):五顆星*****,必須理解,必須掌握)
9.1、什么是事務(wù)?
一個(gè)事務(wù)其實(shí)就是一個(gè)完整的業(yè)務(wù)邏輯。 是一個(gè)最小的工作單元。不可再分。什么是一個(gè)完整的業(yè)務(wù)邏輯?假設(shè)轉(zhuǎn)賬,從A賬戶向B賬戶中轉(zhuǎn)賬10000.將A賬戶的錢減去10000(update語(yǔ)句)將B賬戶的錢加上10000(update語(yǔ)句)這就是一個(gè)完整的業(yè)務(wù)邏輯。以上的操作是一個(gè)最小的工作單元,要么同時(shí)成功,要么同時(shí)失敗,不可再分。這兩個(gè)update語(yǔ)句要求必須同時(shí)成功或者同時(shí)失敗,這樣才能保證錢是正確的。9.2、只有DML語(yǔ)句才會(huì)有事務(wù)這一說(shuō),其它語(yǔ)句和事務(wù)無(wú)關(guān)!!!
insert
delete
update
只有以上的三個(gè)語(yǔ)句和事務(wù)有關(guān)系,其它都沒有關(guān)系。
9.3、假設(shè)所有的業(yè)務(wù),只要一條DML語(yǔ)句就能完成,還有必要存在事務(wù)機(jī)制嗎?
正是因?yàn)樽瞿臣碌臅r(shí)候,需要多條DML語(yǔ)句共同聯(lián)合起來(lái)才能完成,
所以需要事務(wù)的存在。如果任何一件復(fù)雜的事兒都能一條DML語(yǔ)句搞定,
那么事務(wù)則沒有存在的價(jià)值了。
9.4、事務(wù)是怎么做到多條DML語(yǔ)句同時(shí)成功和同時(shí)失敗的呢?
InnoDB存儲(chǔ)引擎:提供一組用來(lái)記錄事務(wù)性活動(dòng)的日志文件事務(wù)開啟了: insert insert insert delete update update update 事務(wù)結(jié)束了!在事務(wù)的執(zhí)行過(guò)程中,每一條DML的操作都會(huì)記錄到“事務(wù)性活動(dòng)的日志文件”中。 在事務(wù)的執(zhí)行過(guò)程中,我們可以提交事務(wù),也可以回滾事務(wù)。提交事務(wù)?清空事務(wù)性活動(dòng)的日志文件,將數(shù)據(jù)全部徹底持久化到數(shù)據(jù)庫(kù)表中。提交事務(wù)標(biāo)志著,事務(wù)的結(jié)束。并且是一種全部成功的結(jié)束。回滾事務(wù)?將之前所有的DML操作全部撤銷,并且清空事務(wù)性活動(dòng)的日志文件回滾事務(wù)標(biāo)志著,事務(wù)的結(jié)束。并且是一種全部失敗的結(jié)束。9.5、怎么提交事務(wù),怎么回滾事務(wù)?
提交事務(wù):commit; 語(yǔ)句
回滾事務(wù):rollback; 語(yǔ)句(回滾永遠(yuǎn)都是只能回滾到上一次的提交點(diǎn)!)
9.6、事務(wù)包括4個(gè)特性?
A:原子性說(shuō)明事務(wù)是最小的工作單元。不可再分。C:一致性所有事務(wù)要求,在同一個(gè)事務(wù)當(dāng)中,所有操作必須同時(shí)成功,或者同時(shí)失敗,以保證數(shù)據(jù)的一致性。I:隔離性A事務(wù)和B事務(wù)之間具有一定的隔離。教室A和教室B之間有一道墻,這道墻就是隔離性。A事務(wù)在操作一張表的時(shí)候,另一個(gè)事務(wù)B也操作這張表會(huì)那樣???D:持久性事務(wù)最終結(jié)束的一個(gè)保障。事務(wù)提交,就相當(dāng)于將沒有保存到硬盤上的數(shù)據(jù)保存到硬盤上!9.7、重點(diǎn)研究一下事務(wù)的隔離性!!!
A教室和B教室中間有一道墻,這道墻可以很厚,也可以很薄。這就是事務(wù)的隔離級(jí)別。 這道墻越厚,表示隔離級(jí)別就越高。事務(wù)和事務(wù)之間的隔離級(jí)別有哪些呢?4個(gè)級(jí)別讀未提交:read uncommitted(最低的隔離級(jí)別)《沒有提交就讀到了》什么是讀未提交?事務(wù)A可以讀取到事務(wù)B未提交的數(shù)據(jù)。這種隔離級(jí)別存在的問(wèn)題就是:臟讀現(xiàn)象!(Dirty Read)我們稱讀到了臟數(shù)據(jù)。這種隔離級(jí)別一般都是理論上的,大多數(shù)的數(shù)據(jù)庫(kù)隔離級(jí)別都是二檔起步!讀已提交:read committed《提交之后才能讀到》什么是讀已提交?事務(wù)A只能讀取到事務(wù)B提交之后的數(shù)據(jù)。這種隔離級(jí)別解決了什么問(wèn)題?解決了臟讀的現(xiàn)象。這種隔離級(jí)別存在什么問(wèn)題?不可重復(fù)讀取數(shù)據(jù)。什么是不可重復(fù)讀取數(shù)據(jù)呢?在事務(wù)開啟之后,第一次讀到的數(shù)據(jù)是3條,當(dāng)前事務(wù)還沒有結(jié)束,可能第二次再讀取的時(shí)候,讀到的數(shù)據(jù)是4條,3不等于4稱為不可重復(fù)讀取。這種隔離級(jí)別是比較真實(shí)的數(shù)據(jù),每一次讀到的數(shù)據(jù)是絕對(duì)的真實(shí)。oracle數(shù)據(jù)庫(kù)默認(rèn)的隔離級(jí)別是:read committed可重復(fù)讀:repeatable read《提交之后也讀不到,永遠(yuǎn)讀取的都是剛開啟事務(wù)時(shí)的數(shù)據(jù)》什么是可重復(fù)讀取?事務(wù)A開啟之后,不管是多久,每一次在事務(wù)A中讀取到的數(shù)據(jù)都是一致的。即使事務(wù)B將數(shù)據(jù)已經(jīng)修改,并且提交了,事務(wù)A讀取到的數(shù)據(jù)還是沒有發(fā)生改變,這就是可重復(fù)讀。可重復(fù)讀解決了什么問(wèn)題?解決了不可重復(fù)讀取數(shù)據(jù)。可重復(fù)讀存在的問(wèn)題是什么?可以會(huì)出現(xiàn)幻影讀。每一次讀取到的數(shù)據(jù)都是幻象。不夠真實(shí)!早晨9點(diǎn)開始開啟了事務(wù),只要事務(wù)不結(jié)束,到晚上9點(diǎn),讀到的數(shù)據(jù)還是那樣!讀到的是假象。不夠絕對(duì)的真實(shí)。mysql中默認(rèn)的事務(wù)隔離級(jí)別就是這個(gè)!!!!!!!!!!!序列化/串行化:serializable(最高的隔離級(jí)別)這是最高隔離級(jí)別,效率最低。解決了所有的問(wèn)題。這種隔離級(jí)別表示事務(wù)排隊(duì),不能并發(fā)!synchronized,線程同步(事務(wù)同步)每一次讀取到的數(shù)據(jù)都是最真實(shí)的,并且效率是最低的。9.8、驗(yàn)證各種隔離級(jí)別
查看隔離級(jí)別:SELECT @@tx_isolation
±----------------+
| @@tx_isolation |
±----------------+
| REPEATABLE-READ |
±----------------+
mysql默認(rèn)的隔離級(jí)別
被測(cè)試的表t_user
驗(yàn)證:read uncommited
mysql> set global transaction isolation level read uncommitted;
事務(wù)A 事務(wù)B
use bjpowernode;
use bjpowernode;
start transaction;
select * from t_user;
start transaction;
insert into t_user values(‘zhangsan’);
select * from t_user;
驗(yàn)證:read commited
mysql> set global transaction isolation level read committed;
事務(wù)A 事務(wù)B
use bjpowernode;
use bjpowernode;
start transaction;
start transaction;
select * from t_user;
insert into t_user values(‘zhangsan’);
select * from t_user;
commit;
select * from t_user;
驗(yàn)證:repeatable read
mysql> set global transaction isolation level repeatable read;
事務(wù)A 事務(wù)B
use bjpowernode;
use bjpowernode;
start transaction;
start transaction;
select * from t_user;
insert into t_user values(‘lisi’);
insert into t_user values(‘wangwu’);
commit;
select * from t_user;
驗(yàn)證:serializable
mysql> set global transaction isolation level serializable;
事務(wù)A 事務(wù)B
use bjpowernode;
use bjpowernode;
start transaction;
start transaction;
select * from t_user;
insert into t_user values(‘a(chǎn)bc’);
select * from t_user;
mysql day04課堂筆記
1、索引(index)
1.1、什么是索引?
索引是在數(shù)據(jù)庫(kù)表的字段上添加的,是為了提高查詢效率存在的一種機(jī)制。
一張表的一個(gè)字段可以添加一個(gè)索引,當(dāng)然,多個(gè)字段聯(lián)合起來(lái)也可以添加索引。
索引相當(dāng)于一本書的目錄,是為了縮小掃描范圍而存在的一種機(jī)制。
1.2、索引的實(shí)現(xiàn)原理?
假設(shè)有一張用戶表:t_userid(PK) name 每一行記錄在硬盤上都有物理存儲(chǔ)編號(hào) ---------------------------------------------------------------------------------- 100 zhangsan 0x1111 120 lisi 0x2222 99 wangwu 0x8888 88 zhaoliu 0x9999 101 jack 0x6666 55 lucy 0x5555 130 tom 0x7777提醒1:在任何數(shù)據(jù)庫(kù)當(dāng)中主鍵上都會(huì)自動(dòng)添加索引對(duì)象,id字段上自動(dòng)有索引, 因?yàn)閕d是PK。另外在mysql當(dāng)中,一個(gè)字段上如果有unique約束的話,也會(huì)自動(dòng) 創(chuàng)建索引對(duì)象。提醒2:在任何數(shù)據(jù)庫(kù)當(dāng)中,任何一張表的任何一條記錄在硬盤存儲(chǔ)上都有 一個(gè)硬盤的物理存儲(chǔ)編號(hào)。提醒3:在mysql當(dāng)中,索引是一個(gè)單獨(dú)的對(duì)象,不同的存儲(chǔ)引擎以不同的形式 存在,在MyISAM存儲(chǔ)引擎中,索引存儲(chǔ)在一個(gè).MYI文件中。在InnoDB存儲(chǔ)引擎中 索引存儲(chǔ)在一個(gè)邏輯名稱叫做tablespace的當(dāng)中。在MEMORY存儲(chǔ)引擎當(dāng)中索引 被存儲(chǔ)在內(nèi)存當(dāng)中。不管索引存儲(chǔ)在哪里,索引在mysql當(dāng)中都是一個(gè)樹的形式 存在。(自平衡二叉樹:B-Tree)1.3、在mysql當(dāng)中,主鍵上,以及unique字段上都會(huì)自動(dòng)添加索引的!!!!
什么條件下,我們會(huì)考慮給字段添加索引呢?
條件1:數(shù)據(jù)量龐大(到底有多么龐大算龐大,這個(gè)需要測(cè)試,因?yàn)槊恳粋€(gè)硬件環(huán)境不同)
條件2:該字段經(jīng)常出現(xiàn)在where的后面,以條件的形式存在,也就是說(shuō)這個(gè)字段總是被掃描。
條件3:該字段很少的DML(insert delete update)操作。(因?yàn)镈ML之后,索引需要重新排序。)
1.4、索引怎么創(chuàng)建?怎么刪除?語(yǔ)法是什么?
創(chuàng)建索引:mysql> create index emp_ename_index on emp(ename);給emp表的ename字段添加索引,起名:emp_ename_index刪除索引:mysql> drop index emp_ename_index on emp;將emp表上的emp_ename_index索引對(duì)象刪除。1.5、在mysql當(dāng)中,怎么查看一個(gè)SQL語(yǔ)句是否使用了索引進(jìn)行檢索?
mysql> explain select * from emp where ename = 'KING'; +----+-------------+-------+------+---------------+------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+------+---------+------+------+-------------+ | 1 | SIMPLE | emp | ALL | NULL | NULL | NULL | NULL | 14 | Using where | +----+-------------+-------+------+---------------+------+---------+------+------+-------------+ 掃描14條記錄:說(shuō)明沒有使用索引。type=ALLmysql> create index emp_ename_index on emp(ename);mysql> explain select * from emp where ename = 'KING'; +----+-------------+-------+------+-----------------+-----------------+---------+-------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+-----------------+-----------------+---------+-------+------+-------------+ | 1 | SIMPLE | emp | ref | emp_ename_index | emp_ename_index | 33 | const | 1 | Using where | +----+-------------+-------+------+-----------------+-----------------+---------+-------+------+-------------+1.6、索引有失效的時(shí)候,什么時(shí)候索引失效呢?
失效的第1種情況:select * from emp where ename like '%T';ename上即使添加了索引,也不會(huì)走索引,為什么?原因是因?yàn)槟:ヅ洚?dāng)中以“%”開頭了!盡量避免模糊查詢的時(shí)候以“%”開始。這是一種優(yōu)化的手段/策略。mysql> explain select * from emp where ename like '%T';+----+-------------+-------+------+---------------+------+---------+------+------+-------------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |+----+-------------+-------+------+---------------+------+---------+------+------+-------------+| 1 | SIMPLE | emp | ALL | NULL | NULL | NULL | NULL | 14 | Using where |+----+-------------+-------+------+---------------+------+---------+------+------+-------------+失效的第2種情況:使用or的時(shí)候會(huì)失效,如果使用or那么要求or兩邊的條件字段都要有索引,才會(huì)走索引,如果其中一邊有一個(gè)字段沒有索引,那么另一個(gè)字段上的索引也會(huì)實(shí)現(xiàn)。所以這就是為什么不建議使用or的原因。mysql> explain select * from emp where ename = 'KING' or job = 'MANAGER';+----+-------------+-------+------+-----------------+------+---------+------+------+-------------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |+----+-------------+-------+------+-----------------+------+---------+------+------+-------------+| 1 | SIMPLE | emp | ALL | emp_ename_index | NULL | NULL | NULL | 14 | Using where |+----+-------------+-------+------+-----------------+------+---------+------+------+-------------+失效的第3種情況:使用復(fù)合索引的時(shí)候,沒有使用左側(cè)的列查找,索引失效什么是復(fù)合索引?兩個(gè)字段,或者更多的字段聯(lián)合起來(lái)添加一個(gè)索引,叫做復(fù)合索引。create index emp_job_sal_index on emp(job,sal);mysql> explain select * from emp where job = 'MANAGER';+----+-------------+-------+------+-------------------+-------------------+---------+-------+------+-------------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |+----+-------------+-------+------+-------------------+-------------------+---------+-------+------+-------------+| 1 | SIMPLE | emp | ref | emp_job_sal_index | emp_job_sal_index | 30 | const | 3 | Using where |+----+-------------+-------+------+-------------------+-------------------+---------+-------+------+-------------+mysql> explain select * from emp where sal = 800;+----+-------------+-------+------+---------------+------+---------+------+------+-------------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |+----+-------------+-------+------+---------------+------+---------+------+------+-------------+| 1 | SIMPLE | emp | ALL | NULL | NULL | NULL | NULL | 14 | Using where |+----+-------------+-------+------+---------------+------+---------+------+------+-------------+失效的第4種情況:在where當(dāng)中索引列參加了運(yùn)算,索引失效。mysql> create index emp_sal_index on emp(sal);explain select * from emp where sal = 800;+----+-------------+-------+------+---------------+---------------+---------+-------+------+-------------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |+----+-------------+-------+------+---------------+---------------+---------+-------+------+-------------+| 1 | SIMPLE | emp | ref | emp_sal_index | emp_sal_index | 9 | const | 1 | Using where |+----+-------------+-------+------+---------------+---------------+---------+-------+------+-------------+mysql> explain select * from emp where sal+1 = 800;+----+-------------+-------+------+---------------+------+---------+------+------+-------------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |+----+-------------+-------+------+---------------+------+---------+------+------+-------------+| 1 | SIMPLE | emp | ALL | NULL | NULL | NULL | NULL | 14 | Using where |+----+-------------+-------+------+---------------+------+---------+------+------+-------------+失效的第5種情況:在where當(dāng)中索引列使用了函數(shù)explain select * from emp where lower(ename) = 'smith';+----+-------------+-------+------+---------------+------+---------+------+------+-------------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |+----+-------------+-------+------+---------------+------+---------+------+------+-------------+| 1 | SIMPLE | emp | ALL | NULL | NULL | NULL | NULL | 14 | Using where |+----+-------------+-------+------+---------------+------+---------+------+------+-------------+失效的第6... 失效的第7...1.7、索引是各種數(shù)據(jù)庫(kù)進(jìn)行優(yōu)化的重要手段。優(yōu)化的時(shí)候優(yōu)先考慮的因素就是索引。
索引在數(shù)據(jù)庫(kù)當(dāng)中分了很多類?
單一索引:一個(gè)字段上添加索引。
復(fù)合索引:兩個(gè)字段或者更多的字段上添加索引。
2、視圖(view)
2.1、什么是視圖?
view:站在不同的角度去看待同一份數(shù)據(jù)。
2.2、怎么創(chuàng)建視圖對(duì)象?怎么刪除視圖對(duì)象?
表復(fù)制: mysql> create table dept2 as select * from dept;dept2表中的數(shù)據(jù): mysql> select * from dept2; +--------+------------+----------+ | DEPTNO | DNAME | LOC | +--------+------------+----------+ | 10 | ACCOUNTING | NEW YORK | | 20 | RESEARCH | DALLAS | | 30 | SALES | CHICAGO | | 40 | OPERATIONS | BOSTON | +--------+------------+----------+創(chuàng)建視圖對(duì)象:create view dept2_view as select * from dept2;刪除視圖對(duì)象:drop view dept2_view;注意:只有DQL語(yǔ)句才能以view的形式創(chuàng)建。create view view_name as 這里的語(yǔ)句必須是DQL語(yǔ)句;2.3、用視圖做什么?
我們可以面向視圖對(duì)象進(jìn)行增刪改查,對(duì)視圖對(duì)象的增刪改查,會(huì)導(dǎo)致 原表被操作!(視圖的特點(diǎn):通過(guò)對(duì)視圖的操作,會(huì)影響到原表數(shù)據(jù)。)//面向視圖查詢 select * from dept2_view; // 面向視圖插入 insert into dept2_view(deptno,dname,loc) values(60,'SALES', 'BEIJING');// 查詢?cè)頂?shù)據(jù) mysql> select * from dept2; +--------+------------+----------+ | DEPTNO | DNAME | LOC | +--------+------------+----------+ | 10 | ACCOUNTING | NEW YORK | | 20 | RESEARCH | DALLAS | | 30 | SALES | CHICAGO | | 40 | OPERATIONS | BOSTON | | 60 | SALES | BEIJING | +--------+------------+----------+// 面向視圖刪除 mysql> delete from dept2_view;// 查詢?cè)頂?shù)據(jù) mysql> select * from dept2; Empty set (0.00 sec)// 創(chuàng)建視圖對(duì)象 create view emp_dept_view asselect e.ename,e.sal,d.dnamefromemp ejoindept done.deptno = d.deptno;// 查詢視圖對(duì)象 mysql> select * from emp_dept_view; +--------+---------+------------+ | ename | sal | dname | +--------+---------+------------+ | CLARK | 2450.00 | ACCOUNTING | | KING | 5000.00 | ACCOUNTING | | MILLER | 1300.00 | ACCOUNTING | | SMITH | 800.00 | RESEARCH | | JONES | 2975.00 | RESEARCH | | SCOTT | 3000.00 | RESEARCH | | ADAMS | 1100.00 | RESEARCH | | FORD | 3000.00 | RESEARCH | | ALLEN | 1600.00 | SALES | | WARD | 1250.00 | SALES | | MARTIN | 1250.00 | SALES | | BLAKE | 2850.00 | SALES | | TURNER | 1500.00 | SALES | | JAMES | 950.00 | SALES | +--------+---------+------------+// 面向視圖更新 update emp_dept_view set sal = 1000 where dname = 'ACCOUNTING';// 原表數(shù)據(jù)被更新 mysql> select * from emp; +-------+--------+-----------+------+------------+---------+---------+--------+ | EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO | +-------+--------+-----------+------+------------+---------+---------+--------+ | 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800.00 | NULL | 20 | | 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600.00 | 300.00 | 30 | | 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250.00 | 500.00 | 30 | | 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975.00 | NULL | 20 | | 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250.00 | 1400.00 | 30 | | 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850.00 | NULL | 30 | | 7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 1000.00 | NULL | 10 | | 7788 | SCOTT | ANALYST | 7566 | 1987-04-19 | 3000.00 | NULL | 20 | | 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 1000.00 | NULL | 10 | | 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500.00 | 0.00 | 30 | | 7876 | ADAMS | CLERK | 7788 | 1987-05-23 | 1100.00 | NULL | 20 | | 7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950.00 | NULL | 30 | | 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000.00 | NULL | 20 | | 7934 | MILLER | CLERK | 7782 | 1982-01-23 | 1000.00 | NULL | 10 | +-------+--------+-----------+------+------------+---------+---------+--------+2.4、視圖對(duì)象在實(shí)際開發(fā)中到底有什么用?《方便,簡(jiǎn)化開發(fā),利于維護(hù)》
create view emp_dept_viewasselect e.ename,e.sal,d.dnamefromemp ejoindept done.deptno = d.deptno;假設(shè)有一條非常復(fù)雜的SQL語(yǔ)句,而這條SQL語(yǔ)句需要在不同的位置上反復(fù)使用。每一次使用這個(gè)sql語(yǔ)句的時(shí)候都需要重新編寫,很長(zhǎng),很麻煩,怎么辦?可以把這條復(fù)雜的SQL語(yǔ)句以視圖對(duì)象的形式新建。在需要編寫這條SQL語(yǔ)句的位置直接使用視圖對(duì)象,可以大大簡(jiǎn)化開發(fā)。并且利于后期的維護(hù),因?yàn)樾薷牡臅r(shí)候也只需要修改一個(gè)位置就行,只需要修改視圖對(duì)象所映射的SQL語(yǔ)句。我們以后面向視圖開發(fā)的時(shí)候,使用視圖的時(shí)候可以像使用table一樣。可以對(duì)視圖進(jìn)行增刪改查等操作。視圖不是在內(nèi)存當(dāng)中,視圖對(duì)象也是存儲(chǔ)在硬盤上的,不會(huì)消失。再提醒一下:視圖對(duì)應(yīng)的語(yǔ)句只能是DQL語(yǔ)句。但是視圖對(duì)象創(chuàng)建完成之后,可以對(duì)視圖進(jìn)行增刪改查等操作。小插曲:增刪改查,又叫做:CRUD。CRUD是在公司中程序員之間溝通的術(shù)語(yǔ)。一般我們很少說(shuō)增刪改查。一般都說(shuō)CRUD。C:Create(增)R:Retrive(查:檢索)U:Update(改)D:Delete(刪)3、DBA常用命令?
重點(diǎn)掌握:數(shù)據(jù)的導(dǎo)入和導(dǎo)出(數(shù)據(jù)的備份)其它命令了解一下即可。(這個(gè)培訓(xùn)日志文檔留著,以后忘了,可以打開文檔復(fù)制粘貼。)數(shù)據(jù)導(dǎo)出?注意:在windows的dos命令窗口中:mysqldump bjpowernode>D:\bjpowernode.sql -uroot -p123456可以導(dǎo)出指定的表嗎?mysqldump bjpowernode emp>D:\bjpowernode.sql -uroot -p123456數(shù)據(jù)導(dǎo)入?注意:需要先登錄到mysql數(shù)據(jù)庫(kù)服務(wù)器上。然后創(chuàng)建數(shù)據(jù)庫(kù):create database bjpowernode;使用數(shù)據(jù)庫(kù):use bjpowernode然后初始化數(shù)據(jù)庫(kù):source D:\bjpowernode.sql4、數(shù)據(jù)庫(kù)設(shè)計(jì)三范式
4.1、什么是數(shù)據(jù)庫(kù)設(shè)計(jì)范式?
數(shù)據(jù)庫(kù)表的設(shè)計(jì)依據(jù)。教你怎么進(jìn)行數(shù)據(jù)庫(kù)表的設(shè)計(jì)。
4.2、數(shù)據(jù)庫(kù)設(shè)計(jì)范式共有?
3個(gè)。
第一范式:要求任何一張表必須有主鍵,每一個(gè)字段原子性不可再分。
4.3、第一范式
最核心,最重要的范式,所有表的設(shè)計(jì)都需要滿足。
必須有主鍵,并且每一個(gè)字段都是原子性不可再分。
4.4、第二范式:
建立在第一范式的基礎(chǔ)之上,
要求所有非主鍵字段必須完全依賴主鍵,不要產(chǎn)生部分依賴。
4.5、第三范式
第三范式建立在第二范式的基礎(chǔ)之上
要求所有非主鍵字典必須直接依賴主鍵,不要產(chǎn)生傳遞依賴。
4.6、總結(jié)表的設(shè)計(jì)?
一對(duì)多:一對(duì)多,兩張表,多的表加外鍵!!!!!!!!!!!!多對(duì)多:多對(duì)多,三張表,關(guān)系表兩個(gè)外鍵!!!!!!!!!!!!!!!一對(duì)一:一對(duì)一放到一張表中不就行了嗎?為啥還要拆分表?在實(shí)際的開發(fā)中,可能存在一張表字段太多,太龐大。這個(gè)時(shí)候要拆分表。一對(duì)一怎么設(shè)計(jì)?沒有拆分表之前:一張表t_userid login_name login_pwd real_name email address........---------------------------------------------------------------------------1 zhangsan 123 張三 zhangsan@xxx2 lisi 123 李四 lisi@xxx...這種龐大的表建議拆分為兩張:t_login 登錄信息表id(pk) login_name login_pwd ---------------------------------1 zhangsan 123 2 lisi 123 t_user 用戶詳細(xì)信息表id(pk) real_name email address........ login_id(fk+unique)-----------------------------------------------------------------------------------------100 張三 zhangsan@xxx 1200 李四 lisi@xxx 2口訣:一對(duì)一,外鍵唯一!!!!!!!!!!4.7、囑咐一句話:
數(shù)據(jù)庫(kù)設(shè)計(jì)三范式是理論上的。實(shí)踐和理論有的時(shí)候有偏差。最終的目的都是為了滿足客戶的需求,有的時(shí)候會(huì)拿冗余換執(zhí)行速度。因?yàn)樵趕ql當(dāng)中,表和表之間連接次數(shù)越多,效率越低。(笛卡爾積)有的時(shí)候可能會(huì)存在冗余,但是為了減少表的連接次數(shù),這樣做也是合理的, 并且對(duì)于開發(fā)人員來(lái)說(shuō),sql語(yǔ)句的編寫難度也會(huì)降低。面試的時(shí)候把這句話說(shuō)上:他就不會(huì)認(rèn)為你是初級(jí)程序員了!總結(jié)
以上是生活随笔為你收集整理的MySQL数据库学习教程,从0到入门的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 游戏鼠标 测试软件,测试键盘鼠标辐射的专
- 下一篇: miniblink API文档