日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql详细学习教程(二)

發(fā)布時間:2023/12/31 数据库 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql详细学习教程(二) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

  • 把查詢結(jié)果去除重復(fù)記錄【distinct】
  • 連接查詢
    • 什么是連接查詢
    • 連接查詢的分類
    • 當(dāng)兩張表進行連接查詢時,沒有任何條件的限制會發(fā)生什么現(xiàn)象?
    • 怎么避免笛卡爾積現(xiàn)象
    • 內(nèi)連接之等值連接
    • 內(nèi)連接之非等值連接
    • 內(nèi)連接之自連接
    • 外連接
    • 三張表,四張表怎么連接
  • 子查詢
    • 什么是子查詢
    • 子查詢都可以出現(xiàn)在哪里呢
    • where子句中的子查詢
    • from子句中的子查詢
    • select后面出現(xiàn)的子查詢(這個內(nèi)容不需要掌握,了解即可!!!)
  • union合并查詢結(jié)果集
  • limit(非常重要)
    • limit作用:將查詢結(jié)果集的一部分取出來。通常使用在分頁查詢當(dāng)中
    • limit怎么用呢
    • 注意:mysql當(dāng)中l(wèi)imit在order by之后執(zhí)行!!!!!!
    • 取出工資排名在[3-5]名的員工?
    • 取出工資排名在[5-9]名的員工
    • 分頁
  • 關(guān)于DQL語句的大總結(jié)
  • 表的創(chuàng)建 (建表)
    • 建表的語法格式:(建表屬于DDL語句,DDL包括:create drop alter)
    • 關(guān)于mysql中的數(shù)據(jù)類型
    • 創(chuàng)建一個學(xué)生表
    • 插入數(shù)據(jù)insert (DML)
    • insert插入日期
    • date和datetime兩個類型的區(qū)別
    • 修改update(DML)
    • 刪除數(shù)據(jù) delete (DML)

把查詢結(jié)果去除重復(fù)記錄【distinct】

注意:原表數(shù)據(jù)不會被修改,只是查詢結(jié)果去重。
去重需要使用一個關(guān)鍵字:distinct

mysql> select distinct job from emp; +-----------+ | job | +-----------+ | CLERK | | SALESMAN | | MANAGER | | ANALYST | | PRESIDENT | +-----------+

// 這樣編寫是錯誤的,語法錯誤。
// distinct只能出現(xiàn)在所有字段的最前方。
mysql> select ename,distinct job from emp;

// distinct出現(xiàn)在job,deptno兩個字段之前,表示兩個字段聯(lián)合起來去重。

mysql> select distinct job,deptno from emp; +-----------+--------+ | job | deptno | +-----------+--------+ | CLERK | 20 | | SALESMAN | 30 | | MANAGER | 20 | | MANAGER | 30 | | MANAGER | 10 | | ANALYST | 20 | | PRESIDENT | 10 | | CLERK | 30 | | CLERK | 10 | +-----------+--------+

統(tǒng)計一下工作崗位的數(shù)量?

select count(distinct job) from emp;+---------------------+| count(distinct job) |+---------------------+| 5 |+---------------------+

連接查詢

什么是連接查詢

從一張表中單獨查詢,稱為單表查詢。
emp表和dept表聯(lián)合起來查詢數(shù)據(jù),從emp表中取員工名字,從dept表中取部門名字。
這種跨表查詢,多張表聯(lián)合起來查詢數(shù)據(jù),被稱為連接查詢。

連接查詢的分類

根據(jù)語法的年代分類:
SQL92:1992年的時候出現(xiàn)的語法
SQL99:1999年的時候出現(xiàn)的語法
我們這里重點學(xué)習(xí)SQL99.(這個過程中簡單演示一個SQL92的例子)

根據(jù)表連接的方式分類:
內(nèi)連接:
等值連接
非等值連接
自連接

外連接:
左外連接(左連接)
右外連接(右連接)

全連接(不講)

當(dāng)兩張表進行連接查詢時,沒有任何條件的限制會發(fā)生什么現(xiàn)象?

案例:查詢每個員工所在部門名稱?

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)兩張表進行連接查詢,沒有任何條件限制的時候,最終查詢結(jié)果條數(shù),是兩張表條數(shù)的乘積,這種現(xiàn)象被稱為:笛卡爾積現(xiàn)象。(笛卡爾發(fā)現(xiàn)的,這是一個數(shù)學(xué)現(xiàn)象。)

怎么避免笛卡爾積現(xiàn)象

連接時加條件,滿足這個條件的記錄被篩選出來!
select
ename,dname
from
emp, dept
where
emp.deptno = dept.deptno;

select emp.ename,dept.dname from emp, dept whereemp.deptno = dept.deptno;// 表起別名。很重要。效率問題。 select e.ename,d.dname from emp e, dept d wheree.deptno = d.deptno; //SQL92語法。+--------+------------+ | 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 | +--------+------------+

思考:最終查詢的結(jié)果條數(shù)是14條,但是匹配的過程中,匹配的次數(shù)減少了嗎?
還是56次,只不過進行了四選一。次數(shù)沒有減少。

注意:通過笛卡爾積現(xiàn)象得出,表的連接次數(shù)越多效率越低,盡量避免表的
連接次數(shù)。

內(nèi)連接之等值連接

案例:查詢每個員工所在部門名稱,顯示員工名和部門名?
emp e和dept d表進行連接。條件是:e.deptno = d.deptno

SQL92語法:

select e.ename,d.dname fromemp e, dept d wheree.deptno = d.deptno;

sql92的缺點:結(jié)構(gòu)不清晰,表的連接條件,和后期進一步篩選的條件,都放到了where后面。

SQL99語法:

select e.ename,d.dname fromemp e joindept d one.deptno = d.deptno;

//inner可以省略(帶著inner可讀性更好!!!一眼就能看出來是內(nèi)連接)

select e.ename,d.dname fromemp e inner joindept d one.deptno = d.deptno; // 條件是等量關(guān)系,所以被稱為等值連接。

sql99優(yōu)點:表連接的條件是獨立的,連接之后,如果還需要進一步篩選,再往后繼續(xù)添加where

SQL99語法:

select ...fromajoinbona和b的連接條件where篩選條件

內(nèi)連接之非等值連接

案例:找出每個員工的薪資等級,要求顯示員工名、薪資、薪資等級?

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 fromemp e joinsalgrade s one.sal between s.losal and s.hisal; // 條件不是一個等量關(guān)系,稱為非等值連接。select e.ename, e.sal, s.grade fromemp e inner joinsalgrade s one.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 | +--------+---------+-------+

內(nèi)連接之自連接

案例:查詢員工的上級領(lǐng)導(dǎo),要求顯示員工名和對應(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)名' fromemp a joinemp b ona.mgr = b.empno; //員工的領(lǐng)導(dǎo)編號 = 領(lǐng)導(dǎ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)連接中的:自連接,技巧:一張表看做兩張表。

外連接

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 fromemp e joindept d one.deptno = d.deptno; //內(nèi)連接的特點:完成能夠匹配上這個條件的數(shù)據(jù)查詢出來。+--------+------------+ | 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 fromemp e right join dept d one.deptno = d.deptno;// outer是可以省略的,帶著可讀性強。 select e.ename,d.dname fromemp e right outer join dept d one.deptno = d.deptno;

right代表什么:表示將join關(guān)鍵字右邊的這張表看成主表,主要是為了將
這張表的數(shù)據(jù)全部查詢出來,捎帶著關(guān)聯(lián)查詢左邊的表。
在外連接當(dāng)中,兩張表連接,產(chǎn)生了主次關(guān)系。

外連接(左外連接): select e.ename,d.dname fromdept d left join emp e one.deptno = d.deptno;// outer是可以省略的,帶著可讀性強。 select e.ename,d.dname fromdept d left outer join emp e one.deptno = d.deptno;

帶有right的是右外連接,又叫做右連接。
帶有l(wèi)eft的是左外連接,又叫做左連接。
任何一個右連接都有左連接的寫法。
任何一個左連接都有右連接的寫法。

+--------+------------+ | 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ù)?
正確。

案例:查詢每個員工的上級領(lǐng)導(dǎo),要求顯示所有員工的名字和領(lǐng)導(dǎo)名?

select a.ename as '員工名', b.ename as '領(lǐng)導(dǎo)名' fromemp a left joinemp b ona.mgr = b.empno; +--------+--------+ | 員工名 | 領(lǐng)導(dǎo)名 | +--------+--------+ | SMITH | FORD | | ALLEN | BLAKE | | WARD | BLAKE | | JONES | KING | | MARTIN | BLAKE | | BLAKE | KING | | CLARK | KING | | SCOTT | JONES | | KING | NULL | | TURNER | BLAKE | | ADAMS | SCOTT | | JAMES | BLAKE | | FORD | JONES | | MILLER | CLARK | +--------+--------+

三張表,四張表怎么連接

語法:
select

from
a
join
b
on
a和b的連接條件
join
c
on
a和c的連接條件
right join
d
on
a和d的連接條件

一條SQL中內(nèi)連接和外連接可以混合。都可以出現(xiàn)!

案例:找出每個員工的部門名稱以及工資等級,
要求顯示員工名、部門名、薪資、薪資等級?

select e.ename,e.sal,d.dname,s.grade fromemp e joindept d on e.deptno = d.deptno joinsalgrade s one.sal between s.losal and s.hisal;+--------+---------+------------+-------+ | ename | sal | dname | grade | +--------+---------+------------+-------+ | SMITH | 800.00 | RESEARCH | 1 | | ALLEN | 1600.00 | SALES | 3 | | WARD | 1250.00 | SALES | 2 | | JONES | 2975.00 | RESEARCH | 4 | | MARTIN | 1250.00 | SALES | 2 | | BLAKE | 2850.00 | SALES | 4 | | CLARK | 2450.00 | ACCOUNTING | 4 | | SCOTT | 3000.00 | RESEARCH | 4 | | KING | 5000.00 | ACCOUNTING | 5 | | TURNER | 1500.00 | SALES | 3 | | ADAMS | 1100.00 | RESEARCH | 1 | | JAMES | 950.00 | SALES | 1 | | FORD | 3000.00 | RESEARCH | 4 | | MILLER | 1300.00 | ACCOUNTING | 2 | +--------+---------+------------+-------+

案例:找出每個員工的部門名稱以及工資等級,還有上級領(lǐng)導(dǎo),
要求顯示員工名、領(lǐng)導(dǎo)名、部門名、薪資、薪資等級?

select e.ename,e.sal,d.dname,s.grade,l.ename fromemp e joindept d on e.deptno = d.deptno joinsalgrade s one.sal between s.losal and s.hisal left joinemp l one.mgr = l.empno;+--------+---------+------------+-------+-------+ | ename | sal | dname | grade | ename | +--------+---------+------------+-------+-------+ | SMITH | 800.00 | RESEARCH | 1 | FORD | | ALLEN | 1600.00 | SALES | 3 | BLAKE | | WARD | 1250.00 | SALES | 2 | BLAKE | | JONES | 2975.00 | RESEARCH | 4 | KING | | MARTIN | 1250.00 | SALES | 2 | BLAKE | | BLAKE | 2850.00 | SALES | 4 | KING | | CLARK | 2450.00 | ACCOUNTING | 4 | KING | | SCOTT | 3000.00 | RESEARCH | 4 | JONES | | KING | 5000.00 | ACCOUNTING | 5 | NULL | | TURNER | 1500.00 | SALES | 3 | BLAKE | | ADAMS | 1100.00 | RESEARCH | 1 | SCOTT | | JAMES | 950.00 | SALES | 1 | BLAKE | | FORD | 3000.00 | RESEARCH | 4 | JONES | | MILLER | 1300.00 | ACCOUNTING | 2 | CLARK | +--------+---------+------------+-------+-------+

子查詢

什么是子查詢

select語句中嵌套select語句,被嵌套的select語句稱為子查詢。

子查詢都可以出現(xiàn)在哪里呢

select
…(select).
from
…(select).
where
…(select).

where子句中的子查詢

案例:找出比最低工資高的員工姓名和工資?

select ename,salfromemp wheresal > min(sal);ERROR 1111 (HY000): Invalid use of group functionwhere子句中不能直接使用分組函數(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 |+--------+---------+

from子句中的子查詢

注意:from后面的子查詢,可以將子查詢的查詢結(jié)果當(dāng)做一張臨時表。(技巧)

案例:找出每個崗位的平均工資的薪資等級。

第一步:找出每個崗位的平均工資(按照崗位分組求平均值)

select job,avg(sal) from emp group by job;+-----------+-------------+| job | avgsal |+-----------+-------------+| ANALYST | 3000.000000 || CLERK | 1037.500000 || MANAGER | 2758.333333 || PRESIDENT | 5000.000000 || SALESMAN | 1400.000000 |+-----------+-------------+t表

第二步:克服心理障礙,把以上的查詢結(jié)果就當(dāng)做一張真實存在的表t。

mysql> select * from salgrade; s表 +-------+-------+-------+ | GRADE | LOSAL | HISAL | +-------+-------+-------+ | 1 | 700 | 1200 | | 2 | 1201 | 1400 | | 3 | 1401 | 2000 | | 4 | 2001 | 3000 | | 5 | 3001 | 9999 | +-------+-------+-------+

t表和s表進行表連接,條件:t表avg(sal) between s.losal and s.hisal;

select t.*, s.gradefrom(select job,avg(sal) as avgsal from emp group by job) tjoinsalgrade sont.avgsal between s.losal and s.hisal;+-----------+-------------+-------+| job | avgsal | grade |+-----------+-------------+-------+| CLERK | 1037.500000 | 1 || SALESMAN | 1400.000000 | 2 || ANALYST | 3000.000000 | 4 || MANAGER | 2758.333333 | 4 || PRESIDENT | 5000.000000 | 5 |+-----------+-------------+-------+

select后面出現(xiàn)的子查詢(這個內(nèi)容不需要掌握,了解即可!!!)

案例:找出每個員工的部門名稱,要求顯示員工名,部門名?

select e.ename,e.deptno,(select d.dname from dept d where e.deptno = d.deptno) as dname from emp e;+--------+--------+------------+ | ename | deptno | dname | +--------+--------+------------+ | SMITH | 20 | RESEARCH | | ALLEN | 30 | SALES | | WARD | 30 | SALES | | JONES | 20 | RESEARCH | | MARTIN | 30 | SALES | | BLAKE | 30 | SALES | | CLARK | 10 | ACCOUNTING | | SCOTT | 20 | RESEARCH | | KING | 10 | ACCOUNTING | | TURNER | 30 | SALES | | ADAMS | 20 | RESEARCH | | JAMES | 30 | SALES | | FORD | 20 | RESEARCH | | MILLER | 10 | ACCOUNTING | +--------+--------+------------+

//錯誤:ERROR 1242 (21000): Subquery returns more than 1 row
select e.ename,e.deptno,(select dname from dept) as dname
from
emp e;

注意:對于select后面的子查詢來說,這個子查詢只能一次返回1條結(jié)果, 多于1條,就報錯了。!

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 | +--------+----------+select ename,job from emp where job = 'MANAGER' union select ename,job from emp where job = 'SALESMAN';+--------+----------+ | ename | job | +--------+----------+ | JONES | MANAGER | | BLAKE | MANAGER | | CLARK | MANAGER | | ALLEN | SALESMAN | | WARD | SALESMAN | | MARTIN | SALESMAN | | TURNER | SALESMAN | +--------+----------+

union的效率要高一些。對于表連接來說,每連接一次新表,
則匹配的次數(shù)滿足笛卡爾積,成倍的翻。。。
但是union可以減少匹配的次數(shù)。在減少匹配次數(shù)的情況下,
還可以完成兩個結(jié)果集的拼接。

a 連接 b 連接 c
a 10條記錄
b 10條記錄
c 10條記錄
匹配次數(shù)是:1000

a 連接 b一個結(jié)果:10 * 10 --> 100次
a 連接 c一個結(jié)果:10 * 10 --> 100次
使用union的話是:100次 + 100次 = 200次。(union把乘法變成了加法運算)

union在使用的時候有注意事項嗎?

//錯誤的:union在進行結(jié)果集合并的時候,要求兩個結(jié)果集的列數(shù)相同。 select ename,job from emp where job = 'MANAGER' union select ename from emp where job = 'SALESMAN';// MYSQL可以,oracle語法嚴(yán)格 ,不可以,報錯。要求:結(jié)果集合并時列和列的數(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 | +--------+---------+

limit(非常重要)

limit作用:將查詢結(jié)果集的一部分取出來。通常使用在分頁查詢當(dāng)中

百度默認:一頁顯示10條記錄。
分頁的作用是為了提高用戶的體驗,因為一次全部都查出來,用戶體驗差??梢砸豁撘豁摲摽?。

limit怎么用呢

完整用法:limit startIndex, length
startIndex是起始下標(biāo),length是長度。
起始下標(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 | +-------+---------+

注意:mysql當(dāng)中l(wèi)imit在order by之后執(zhí)行!!!!!!

取出工資排名在[3-5]名的員工?

select ename,sal fromemp order bysal desc limit2, 3;2表示起始位置從下標(biāo)2開始,就是第三條記錄。 3表示長度。+-------+---------+ | ename | sal | +-------+---------+ | FORD | 3000.00 | | JONES | 2975.00 | | BLAKE | 2850.00 | +-------+---------+

取出工資排名在[5-9]名的員工

select ename,sal fromemp order by sal desc limit4, 5;+--------+---------+ | ename | sal | +--------+---------+ | BLAKE | 2850.00 | | CLARK | 2450.00 | | ALLEN | 1600.00 | | TURNER | 1500.00 | | MILLER | 1300.00 | +--------+---------+

分頁

每頁顯示3條記錄
第1頁:limit 0,3 [0 1 2]
第2頁:limit 3,3 [3 4 5]
第3頁:limit 6,3 [6 7 8]
第4頁:limit 9,3 [9 10 11]

每頁顯示pageSize條記錄
第pageNo頁:limit (pageNo - 1) * pageSize , pageSize

public static void main(String[] args){// 用戶提交過來一個頁碼,以及每頁顯示的記錄條數(shù)int pageNo = 5; //第5頁int pageSize = 10; //每頁顯示10條int startIndex = (pageNo - 1) * pageSize;String sql = "select ...limit " + startIndex + ", " + pageSize; }

記公式:
limit (pageNo-1)*pageSize , pageSize

關(guān)于DQL語句的大總結(jié)

select ... from... where... group by... having... order by... limit...執(zhí)行順序?1.from2.where3.group by4.having5.select6.order by7.limit..

表的創(chuàng)建 (建表)

建表的語法格式:(建表屬于DDL語句,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_開始,可讀性強。見名知意。 字段名:見名知意。 表名和字段名都屬于標(biāo)識符。

關(guān)于mysql中的數(shù)據(jù)類型

很多數(shù)據(jù)類型,我們只需要掌握一些常見的數(shù)據(jù)類型即可。

varchar(最長255)可變長度的字符串比較智能,節(jié)省空間。會根據(jù)實際的數(shù)據(jù)長度動態(tài)分配空間。優(yōu)點:節(jié)省空間缺點:需要動態(tài)分配空間,速度慢。char(最長255)定長字符串不管實際的數(shù)據(jù)長度是多少。分配固定長度的空間去存儲數(shù)據(jù)。使用不恰當(dāng)?shù)臅r候,可能會導(dǎo)致空間的浪費。優(yōu)點:不需要動態(tài)分配空間,速度快。缺點:使用不當(dāng)可能會導(dǎo)致空間的浪費。varchar和char我們應(yīng)該怎么選擇?性別字段你選什么?因為性別是固定長度的字符串,所以選擇char。姓名字段你選什么?每一個人的名字長度不同,所以選擇varchar。int(最長11)數(shù)字中的整數(shù)型。等同于java的int。bigint數(shù)字中的長整型。等同于java中的long。float 單精度浮點型數(shù)據(jù)double雙精度浮點型數(shù)據(jù)date短日期類型datetime長日期類型clob字符大對象最多可以存儲4G的字符串。比如:存儲一篇文章,存儲一個說明。超過255個字符的都要采用CLOB字符大對象來存儲。Character Large OBject:CLOBblob二進制大對象Binary Large OBject專門用來存儲圖片、聲音、視頻等流媒體數(shù)據(jù)。往BLOB類型的字段上插入數(shù)據(jù)的時候,例如插入一個圖片、視頻等,你需要使用IO流才行。t_movie 電影表(專門存儲電影信息的)編號 名字 故事情節(jié) 上映日期 時長 海報 類型 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' ....

創(chuàng)建一個學(xué)生表

學(xué)號、姓名、年齡、性別、郵箱地址

create table t_student(no int,name varchar(32),sex char(1),age int(3),email varchar(255) );刪除表:drop table t_student; // 當(dāng)這張表不存在的時候會報錯!// 如果這張表存在的話,刪除drop table if exists t_student;

插入數(shù)據(jù)insert (DML)

語法格式:
insert into 表名(字段名1,字段名2,字段名3…) values(值1,值2,值3);

注意:字段名和值要一一對應(yīng)。什么是一一對應(yīng)?數(shù)量要對應(yīng)。數(shù)據(jù)類型要對應(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語句但凡是執(zhí)行成功了,那么必然會多一條記錄。 沒有給其它字段指定值的話,默認值是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語句中的“字段名”可以省略嗎?可以insert into t_student values(2); //錯誤的// 注意:前面的字段名省略的話,等于都寫上了!所以值也要都寫上!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 |+------+------+------+------+--------------+

insert插入日期

數(shù)字格式化:format

select 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) // 生日可以使用字符串,沒問題。 );生日:1990-10-11 (10個字符)

注意:數(shù)據(jù)庫中的有一條命名規(guī)范:
所有的標(biāo)識符都是全部小寫,單詞和單詞之間使用下劃線進行銜接。

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日
出問題了:原因是類型不匹配。數(shù)據(jù)庫birth是date類型,這里給了一個字符串varchar。

怎么辦?可以使用str_to_date函數(shù)進行類型轉(zhuǎn)換。
str_to_date函數(shù)可以將字符串轉(zhuǎn)換成日期類型date?
語法格式:
str_to_date(‘字符串日期’, ‘日期格式’)

mysql的日期格式:%Y 年%m 月%d 日%h 時%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方面,因為插入的時候需要一個日期類型的數(shù)據(jù),
需要通過該函數(shù)將字符串轉(zhuǎn)換成date。

好消息?
如果你提供的日期字符串是這個格式,str_to_date函數(shù)就不需要了!!!
%Y-%m-%d
insert into t_user(id,name,birth) values(2, ‘lisi’, ‘1990-10-01’);

查詢的時候可以以某個特定的日期格式展示嗎?
date_format
這個函數(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ù), ‘日期格式’)
這個函數(shù)通常使用在查詢?nèi)掌诜矫?。設(shè)置展示的日期格式。

mysql> select id,name,birth from t_user;+------+----------+------------+| id | name | birth |+------+----------+------------+| 1 | zhangsan | 1990-10-01 || 2 | lisi | 1990-10-01 |+------+----------+------------+

以上的SQL語句實際上是進行了默認的日期格式化,
自動將數(shù)據(jù)庫中的date類型轉(zhuǎn)換成varchar類型。
并且采用的格式是mysql默認的日期格式:‘%Y-%m-%d’

select id,name,date_format(birth,'%Y/%m/%d') as birth from t_user;

java中的日期格式?

yyyy-MM-dd HH:mm:ss SSS

date和datetime兩個類型的區(qū)別

date是短日期:只包括年月日信息。
datetime是長日期:包括年月日時分秒信息。

drop table if exists t_user; create table t_user(id int,name varchar(32),birth date,create_time datetime );

id是整數(shù)
name是字符串
birth是短日期
create_time是這條記錄的創(chuàng)建時間:長日期類型

mysql短日期默認格式:%Y-%m-%d
mysql長日期默認格式:%Y-%m-%d %h:%i:%s

insert into t_user(id,name,birth,create_time) values(1,'zhangsan','1990-10-01','2020-03-18 15:49:50');

在mysql當(dāng)中怎么獲取系統(tǒng)當(dāng)前時間?
now() 函數(shù),并且獲取的時間帶有:時分秒信息!!!!是datetime類型的。

insert into t_user(id,name,birth,create_time) values(2,'lisi','1991-10-01',now());

修改update(DML)

語法格式:
update 表名 set 字段名1=值1,字段名2=值2,字段名3=值3… where 條件;

注意:沒有條件限制會導(dǎo)致所有數(shù)據(jù)全部更新。

update t_user set name = 'jack', birth = '2000-10-11' where id = 2; +------+----------+------------+---------------------+ | id | name | birth | create_time | +------+----------+------------+---------------------+ | 1 | zhangsan | 1990-10-01 | 2020-03-18 15:49:50 | | 2 | jack | 2000-10-11 | 2020-03-18 15:51:23 | +------+----------+------------+---------------------+update t_user set name = 'jack', birth = '2000-10-11', create_time = now() where id = 2;

更新所有?

update t_user set name = 'abc';

刪除數(shù)據(jù) delete (DML)

語法格式?
delete from 表名 where 條件;

注意:沒有條件,整張表的數(shù)據(jù)會全部刪除!

delete from t_user where id = 2;insert into t_user(id) values(2);delete from t_user; // 刪除所有!

總結(jié)

以上是生活随笔為你收集整理的mysql详细学习教程(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。