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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL数据库:SQL语句

發布時間:2025/4/16 数据库 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL数据库:SQL语句 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

MySql數據庫系列閱讀

  • MySQL數據庫
  • MySQL數據庫:SQL語句
  • MySQL數據庫:完整性約束
  • MySQL數據庫備份與還原
  • MySQL數據庫:編碼
  • 1. SQL概述

    1.1 什么是SQL

    SQL(Structured Query Language)是“結構化查詢語言”,它是對關系型數據庫的操作語言。它可以應用到所有關系型數據庫中,例如:MySQL、Oracle、SQL Server等。SQ標準(ANSI/ISO)有:

    • SQL-92:1992年發布的SQL語言標準
    • SQL:1999:1999年發布的SQL語言標簽
    • SQL:2003:2003年發布的SQL語言標簽

    這些標準就與JDK的版本一樣,在新的版本中總要有一些語法的變化。不同時期的數據庫對不同標準做了實現。

    雖然SQL可以用在所有關系型數據庫中,但很多數據庫還都有標準之后的一些語法,我們可以稱之為“方言”。例如MySQL中的LIMIT語句就是MySQL獨有的方言,其它數據庫都不支持!當然,Oracle或SQL Server都有自己的方言。

    SQL的作用:客戶端使用SQL來操作服務器

    1.2 語法要求

    SQL標準(例如SQL99,即1999年制定的標準):由國際標準化組織(ISO)制定的,對DBMS的統一操作方式(例如相同的語句可以操作:mysql、oracle等)。

    SQL方言:某種DBMS不只會支持SQL標準,而且還會有一些自己獨有的語法,這就稱之為方言!例如limit語句只在MySQL中可以使用

    SQL語法

    • SQL語句可以單行或多行書寫,以分號結尾
    • 可以用空格和縮進來來增強語句的可讀性
    • 關鍵字不區別大小寫,建議使用大寫

    2. 分類

    • DDL(Data Definition Language):數據定義語言,用來定義數據庫對象:庫、表、列等
    • DML(Data Manipulation Language):數據操作語言,用來定義數據庫記錄(數據)
    • DCL(Data Control Language):數據控制語言,用來定義訪問權限和安全級別
    • DQL(Data Query Language):數據查詢語言,用來查詢記錄(數據)

    3. DDL:數據定義語言

    3.1 基本操作

    • 查看所有數據庫名稱:SHOW DATABASES; 
    • 切換數據庫:USE mydb1,切換到mydb1數據庫;

    3.2 操作數據庫

    • 創建數據庫:CREATE DATABASE [IF NOT EXISTS] mydb1;

    例如:CREATE DATABASE mydb1,創建一個名為mydb1的數據庫。如果這個數據已經存在,那么會報錯。例如CREATE DATABASE IF NOT EXISTS mydb1,在名為mydb1的數據庫不存在時創建該庫,這樣可以避免報錯

    • 刪除數據庫:DROP DATABASE [IF EXISTS] mydb1;

    例如:DROP DATABASE mydb1,刪除名為mydb1的數據庫。如果這個數據庫不存在,那么會報錯。DROP DATABASE IF EXISTS mydb1,就算mydb1不存在,也不會的報錯

    • 修改數據庫編碼:ALTER DATABASE mydb1 CHARACTER SET utf8;

    修改數據庫mydb1的編碼為utf8。注意,在MySQL中所有的UTF-8編碼都不能使用中間的“-”,即UTF-8要書寫為UTF8

    3.3 數據類型

    MySQL與Java一樣,也有數據類型。MySQL中數據類型主要應用在列上。常用類型如下:

    類型說明
    int整型
    double浮點型,例如double(5,2)表示最多5位,其中必須有2位小數,即最大值為999.99
    decimal浮點型,在表單錢方面使用該類型,因為不會出現精度缺失問題
    char固定長度字符串類型
    varchar可變長度字符串類型
    text字符串類型
    blob字節類型
    date日期類型,格式為:yyyy-MM-dd
    time時間類型,格式為:hh:mm:ss
    timestamp時間戳類型

    3.4 操作表

    創建表:

    CREATE TABLE 表名(列名 列類型,列名 列類型,...... );

    例如:

    CREATE TABLE stu(sid CHAR(6),sname VARCHAR(20),age INT,gender VARCHAR(10) );

    再例如:

    CREATE TABLE emp(eid CHAR(6),ename VARCHAR(50),age INT,gender VARCHAR(6),birthday DATE,hiredate DATE,salary DECIMAL(7,2),resume VARCHAR(1000) ); SHOW TABLES; /*查看當前數據庫中所有表名稱*/SHOW CREATE TABLE emp;/*查看emp表的創建語句*/DESC emp; /*查看emp表結構*/DROP TABLE emp; /*刪除emp表*/

    修改表:add,modify,change,drop

    /*修改之添加列:給stu表添加classname列*/ ALTER TABLE stu ADD (classname varchar(100));/*修改之修改列類型:修改stu表的gender列類型為CHAR(2)*/ ALTER TABLE stu MODIFY gender CHAR(2);/*修改之修改列名:修改stu表的gender列名為sex*/ ALTER TABLE stu change gender sex CHAR(2);/*修改之刪除列:刪除stu表的classname列*/ ALTER TABLE stu DROP classname;/*修改之修改表名稱:修改stu表名稱為student*/ ALTER TABLE stu RENAME TO student;

    4. DML:數據操作語言

    4.1 插入數據

    語法:INSERT INTO 表名(列名1,列名2, …) VALUES(值1, 值2)

    INSERT INTO stu(sid, sname,age,gender) VALUES('s_1001', 'zhangSan', 23, 'male'); INSERT INTO stu(sid, sname) VALUES('s_1001', 'zhangSan');

    因為沒有插入age和gender列的數據,所以該條記錄的age和gender值上為NULL

    語法:INSERT INTO 表名 VALUES(值1,值2,…)

    因為沒有指定要插入的列,表示按創建表時列的順序插入所有列的值:

    INSERT INTO stu VALUES('s_1002', 'liSi', 32, 'female');

    注意:所有字符串數據必須使用單引用!

    4.2 修改數據

    語法:UPDATE 表名 SET 列名1=值1, … 列名n=值n [WHERE 條件]

    UPDATE stu SET sname=’zhangSanSan’, age=’32’, gender=’female’ WHERE sid=’s_1001’; UPDATE stu SET sname=’liSi’, age=’20WHERE age>50 AND gender=’male’; UPDATE stu SET sname=’wangWu’, age=’30WHERE age>60 OR gender=’female’; UPDATE stu SET gender=’female’ WHERE gender IS NULL UPDATE stu SET age=age+1 WHERE sname=’zhaoLiu’;

    4.3 刪除數據

    語法:DELETE FROM 表名 [WHERE 條件]

    DELETE FROM stu WHERE sid=’s_1001’003B DELETE FROM stu WHERE sname=’chenQi’ OR age > 30; DELETE FROM stu;

    語法:TRUNCATE TABLE 表名

    TRUNCATE TABLE stu;

    雖然TRUNCATE和DELETE都可以刪除表的所有記錄,但有原理不同。DELETE的效率沒有TRUNCATE高!

    TRUNCATE其實屬性DDL語句,因為它是先DROP TABLE,再CREATE TABLE。而且TRUNCATE刪除的記錄是無法回滾的,但DELETE刪除的記錄是可以回滾的(回滾是事務的知識!)。

    5. DCL:數據控制語言

    5.1 創建用戶

    語法:CREATE USER 用戶名@地址 IDENTIFIED BY ‘密碼’;

    CREATE USER user1@localhost IDENTIFIED BY123’;CREATE USER user2@’%’ IDENTIFIED BY123’;

    5.2 給用戶授權

    語法:GRANT 權限1, … , 權限n ON 數據庫.* TO 用戶名

    GRANT CREATE,ALTER,DROP,INSERT,UPDATE,DELETE,SELECT ON mydb1.* TO user1@localhost; GRANT ALL ON mydb1.* TO user2@localhost;

    5.3 撤銷授權

    語法:REVOKE權限1, … , 權限n ON 數據庫.* FORM 用戶名

    REVOKE CREATE,ALTER,DROP ON mydb1.* FROM user1@localhost;

    5.4 查看用戶權限

    語法:SHOW GRANTS FOR 用戶名

    SHOW GRANTS FOR user1@localhost;

    5.5 刪除用戶

    語法:DROP USER 用戶名

    DROP USER user1@localhost;

    5.6 修改用戶密碼

    語法:

    USE mysql; UPDATE USER SET PASSWORD=PASSWORD(‘密碼’) WHERE User=’用戶名’ and Host=’IP’; FLUSH PRIVILEGES; UPDATE USER SET PASSWORD=PASSWORD('1234') WHERE User='user2' and Host=’localhost’; FLUSH PRIVILEGES;

    6. 數據查詢語法(DQL)

    DQL就是數據查詢語言,數據庫執行DQL語句不會對數據進行改變,而是讓數據庫發送結果集給客戶端。語法:

    SELECT selection_list /*要查詢的列名稱*/ FROM table_list /*要查詢的表名稱*/ WHERE condition /*行條件*/ GROUP BY grouping_columns /*對結果分組*/ HAVING condition /*分組后的行條件*/ ORDER BY sorting_columns /*對結果分組*/ LIMIT offset_start, row_count; /*結果限定*/

    創建學生表:stu

    字段名稱字段類型說明
    sidchar(6)學生學號
    snamevarchar(50)學生姓名
    ageint學生年齡
    gendervarchar(50)學生性別
    CREATE TABLE stu (sid CHAR(6),sname VARCHAR(50),age INT,gender VARCHAR(50) );INSERT INTO stu VALUES('S_1001', 'liuYi', 35, 'male'); INSERT INTO stu VALUES('S_1002', 'chenEr', 15, 'female'); INSERT INTO stu VALUES('S_1003', 'zhangSan', 95, 'male'); INSERT INTO stu VALUES('S_1004', 'liSi', 65, 'female'); INSERT INTO stu VALUES('S_1005', 'wangWu', 55, 'male'); INSERT INTO stu VALUES('S_1006', 'zhaoLiu', 75, 'female'); INSERT INTO stu VALUES('S_1007', 'sunQi', 25, 'male'); INSERT INTO stu VALUES('S_1008', 'zhouBa', 45, 'female'); INSERT INTO stu VALUES('S_1009', 'wuJiu', 85, 'male'); INSERT INTO stu VALUES('S_1010', 'zhengShi', 5, 'female'); INSERT INTO stu VALUES('S_1011', 'xxx', NULL, NULL);

    雇員表:emp

    字段名稱字段類型說明
    empnoint員工編號
    enamevarchar(50)員工姓
    jobvarchar(50)員工工
    mgrint領導編號
    hiredatedate入職日
    saldecimal(7,2)月薪
    commdecimal(7,2)獎金
    deptnoint部分編號
    CREATE TABLE emp(empno INT,ename VARCHAR(50),job VARCHAR(50),mgr INT,hiredate DATE,sal DECIMAL(7,2),comm decimal(7,2),deptno INT ) ;INSERT INTO emp values(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20); INSERT INTO emp values(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30); INSERT INTO emp values(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30); INSERT INTO emp values(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20); INSERT INTO emp values(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30); INSERT INTO emp values(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30); INSERT INTO emp values(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10); INSERT INTO emp values(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20); INSERT INTO emp values(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10); INSERT INTO emp values(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30); INSERT INTO emp values(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20); INSERT INTO emp values(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30); INSERT INTO emp values(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20); INSERT INTO emp values(7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);

    部門表:dept

    字段名稱字段類型說明
    deptnoint部分編碼
    dnamevarchar(50)部分名稱
    locvarchar(50)部分所在地點
    CREATE TABLE dept(deptno INT,dname varchar(14),loc varchar(13) );INSERT INTO dept values(10, 'ACCOUNTING', 'NEW YORK'); INSERT INTO dept values(20, 'RESEARCH', 'DALLAS'); INSERT INTO dept values(30, 'SALES', 'CHICAGO'); INSERT INTO dept values(40, 'OPERATIONS', 'BOSTON');

    6.1 基礎查詢

    6.1.1 查詢所有列

    SELECT * FROM stu;

    6.1.2 查詢指定列

    SELECT sid, sname, age FROM stu;

    6.2 條件查詢

    6.2.1 條件查詢介紹

    條件查詢就是在查詢時給出WHERE子句,在WHERE子句中可以使用如下運算符及關鍵字:

    • =、!=、<>、<、<=、>、>=
    • BETWEEN…AND
    • IN(set)
    • IS NULL
    • AND
    • OR
    • NOT

    6.2.2 查詢性別為女,并且年齡50的記錄

    SELECT * FROM stu WHERE gender='female' AND ge<50;

    6.2.3 查詢學號為S_1001,或者姓名為liSi的記錄

    SELECT * FROM stu WHERE sid ='S_1001' OR sname='liSi';

    6.2.4 查詢學號為S_1001,S_1002,S_1003的記錄

    SELECT * FROM stu WHERE sid IN ('S_1001','S_1002','S_1003');

    6.2.5 查詢學號不是S_1001,S_1002,S_1003的記錄

    SELECT * FROM tab_student WHERE s_number NOT IN ('S_1001','S_1002','S_1003');

    6.2.6 查詢年齡為null的記錄

    SELECT * FROM stu WHERE age IS NULL;

    6.2.7 查詢年齡在20到40之間的學生記錄

    SELECT * FROM stu WHERE age>=20 AND age<=40;

    或者

    SELECT * FROM stu WHERE age BETWEEN 20 AND 40;

    6.2.8 查詢性別非男的學生記錄

    SELECT * FROM stu WHERE gender!='male';

    或者

    SELECT * FROM stu WHERE gender<>'male';

    或者

    SELECT * FROM stu WHERE NOT gender='male';

    6.2.9 查詢姓名不為null的學生記錄

    SELECT * FROM stu WHERE NOT sname IS NULL;

    或者

    SELECT * FROM stu WHERE sname IS NOT NULL;

    6.3模糊查詢

    當想查詢姓名中包含a字母的學生時就需要使用模糊查詢了。模糊查詢需要使用關鍵字LIKE

    6.3.1 查詢姓名由5個字母構成的學生記錄

    SELECT * FROM stu WHERE sname LIKE '_____';

    模糊查詢必須使用LIKE關鍵字。其中 “_”匹配任意一個字母,5個“_”表示5個任意字母。

    6.3.2 查詢姓名由5個字母構成,并且第5個字母為“i”的學生記錄

    SELECT * FROM stu WHERE sname LIKE '____i';

    6.3.3 查詢姓名以“z”開頭的學生記錄

    SELECT * FROM stu WHERE sname LIKE 'z%';

    其中“%”匹配0~n個任何字母。

    6.3.4 查詢姓名中第2個字母為“i”的學生記錄

    SELECT * FROM stu WHERE sname LIKE '_i%';

    6.3.5 查詢姓名中包含“a”字母的學生記錄

    SELECT * FROM stu WHERE sname LIKE '%a%';

    6.4 字段控制查詢

    6.4.1 去除重復記錄

    去除重復記錄(兩行或兩行以上記錄中系列的上的數據都相同),例如emp表中sal字段就存在相同的記錄。當只查詢emp表的sal字段時,那么會出現重復記錄,那么想去除重復記錄,需要使用DISTINCT:

    SELECT DISTINCT sal FROM emp;

    6.4.2 查看雇員的月薪與傭金之和

    因為sal和comm兩列的類型都是數值類型,所以可以做加運算。如果sal或comm中有一個字段不是數值類型,那么會出錯。

    SELECT *,sal+comm FROM emp;

    comm列有很多記錄的值為NULL,因為任何東西與NULL相加結果還是NULL,所以結算結果可能會出現NULL。下面使用了把NULL轉換成數值0的函數IFNULL:

    SELECT *,sal+IFNULL(comm,0) FROM emp;

    6.4.3 給列名添加別名

    在上面查詢中出現列名為sal+IFNULL(comm,0),這很不美觀,現在我們給這一列給出一個別名,為total:

    SELECT *, sal+IFNULL(comm,0) AS total FROM emp;

    給列起別名時,是可以省略AS關鍵字的:

    SELECT *,sal+IFNULL(comm,0) total FROM emp;

    6.5 排序

    6.5.1 查詢所有學生記錄,按年齡升序排序

    SELECT * FROM stu ORDER BY sage ASC;

    或者

    SELECT * FROM stu ORDER BY sage;

    6.5.2 查詢所有學生記錄,按年齡降序排序

    SELECT * FROM stu ORDER BY age DESC;

    6.5.3 查詢所有雇員,按月薪降序排序,如果月薪相同時,按編號升序排序

    SELECT * FROM emp ORDER BY sal DESC,empno ASC;

    7. 聚合函數

    聚合函數是用來做縱向運算的函數:

    聚合函數功能描述
    COUNT()統計指定列不為NULL的記錄行數
    MAX()計算指定列的最大值,如果指定列是字符串類型,那么使用字符串排序運算
    MIN()計算指定列的最小值,如果指定列是字符串類型,那么使用字符串排序運算
    SUM()計算指定列的數值和,如果指定列類型不是數值類型,那么計算結果為0
    AVG()計算指定列的平均值,如果指定列類型不是數值類型,那么計算結果為0

    7.1 COUNT

    當需要縱向統計時可以使用COUNT()。

    查詢emp表中記錄數:

    SELECT COUNT(*) AS cnt FROM emp;

    查詢emp表中有傭金的人數:

    SELECT COUNT(comm) cnt FROM emp;

    注意,因為count()函數中給出的是comm列,那么只統計comm列非NULL的行數。

    查詢emp表中月薪大于2500的人數:

    SELECT COUNT(*) FROM emp WHERE sal > 2500;

    統計月薪與傭金之和大于2500元的人數:

    SELECT COUNT(*) AS cnt FROM emp WHERE sal+IFNULL(comm,0) > 2500;

    查詢有傭金的人數,以及有領導的人數:

    SELECT COUNT(comm), COUNT(mgr) FROM emp;

    7.2 SUM和AVG

    當需要縱向求和時使用sum()函數。

    查詢所有雇員月薪和:

    SELECT SUM(sal) FROM emp;

    查詢所有雇員月薪和,以及所有雇員傭金和:

    SELECT SUM(sal), SUM(comm) FROM emp;

    查詢所有雇員月薪+傭金和:

    SELECT SUM(sal+IFNULL(comm,0)) FROM emp;

    統計所有員工平均工資:

    SELECT SUM(sal), COUNT(sal) FROM emp;

    或者

    SELECT AVG(sal) FROM emp;

    7.3 MAX和MIN

    查詢最高工資和最低工資:

    SELECT MAX(sal), MIN(sal) FROM emp;

    8. 分組查詢

    當需要分組查詢時需要使用GROUP BY子句,例如查詢每個部門的工資和,這說明要使用部分來分組。

    8.1 分組查詢

    查詢每個部門的部門編號和每個部門的工資和:

    SELECT deptno, SUM(sal) FROM emp GROUP BY deptno;

    查詢每個部門的部門編號以及每個部門的人數:

    SELECT deptno,COUNT(*) FROM emp GROUP BY deptno;

    查詢每個部門的部門編號以及每個部門工資大于1500的人數:

    SELECT deptno,COUNT(*) FROM emp WHERE sal>1500 GROUP BY deptno;

    8.2 HAVING子句

    查詢工資總和大于9000的部門編號以及工資和:

    SELECT deptno, SUM(sal) FROM emp GROUP BY deptno HAVING SUM(sal) > 9000;

    注意,WHERE是對分組前記錄的條件,如果某行記錄沒有滿足WHERE子句的條件,那么這行記錄不會參加分組;而HAVING是對分組后數據的約束。

    9. LIMIT

    LIMIT用來限定查詢結果的起始行,以及總行數。

    9.1 查詢5行記錄,起始行從0開始

    SELECT * FROM emp LIMIT 0, 5;

    注意,起始行從0開始,即第一行開始!

    9.2 查詢10行記錄,起始行從3開始

    SELECT * FROM emp LIMIT 3, 10;

    9.3 分頁查詢

    如果一頁記錄為10條,希望查看第3頁記錄應該怎么查呢?

    • 第一頁記錄起始行為0,一共查詢10行;
    • 第二頁記錄起始行為10,一共查詢10行;
    • 第三頁記錄起始行為20,一共查詢10行;

    10. 多表查詢

    多表查詢有如下幾種:

    • 合并結果集;
    • 連接查詢
    • 內連接,或等值連接:獲取兩個表中字段匹配關系的記錄
    • 外連接
      • 左外連接:獲取左表所有記錄,即使右表沒有對應匹配的記錄
      • 右外連接:用于獲取右表所有記錄,即使左表沒有對應匹配的記錄
      • 全外連接(MySQL不支持):只要某一個表存在匹配,就返回行
    • 自然連接
    • 子查詢

    10.1 合并結果集

    作用:合并結果集就是把兩個select語句的查詢結果合并到一起!
    要求:被合并的兩個結果:列數、列類型必須相同

    合并結果集有兩種方式:

    • UNION:去除重復記錄,例如:SELECT * FROM t1 UNION SELECT * FROM t2;
    • UNION ALL:不去除重復記錄,例如:SELECT * FROM t1 UNION ALL SELECT * FROM t2。

    10.2 連接查詢

    連接查詢就是求出多個表的乘積,例如t1連接t2,那么查詢出的結果就是t1*t2。

    連接查詢會產生笛卡爾積,假設集合A={a,b},集合B={0,1,2},則兩個集合的笛卡爾積為{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}。可以擴展到多個集合的情況。

    那么多表查詢產生這樣的結果并不是我們想要的,那么怎么去除重復的,不想要的記錄呢,當然是通過條件過濾。通常要查詢的多個表之間都存在關聯關系,那么就通過關聯關系去除笛卡爾積。

    你能想像到emp和dept表連接查詢的結果么?emp一共14行記錄,dept表一共4行記錄,那么連接后查詢出的結果是56行記錄。

    也就你只是想在查詢emp表的同時,把每個員工的所在部門信息顯示出來,那么就需要使用主外鍵來去除無用信息了。

    使用主外鍵關系做為條件來去除無用信息

    SELECT * FROM emp,dept WHERE emp.deptno=dept.deptno;

    上面查詢結果會把兩張表的所有列都查詢出來,也許你不需要那么多列,這時就可以指定要查詢的列了。

    SELECT emp.ename,emp.sal,emp.comm,dept.dname FROM emp,dept WHERE emp.deptno=dept.deptno;

    還可以為表指定別名,然后在引用列時使用別名即可。

    SELECT e.ename,e.sal,e.comm,d.dname FROM emp AS e,dept AS d WHERE e.deptno=d.deptno;

    10.2.1 內連接

    上面的連接語句就是內連接,但它不是SQL標準中的查詢方式,可以理解為方言!SQL標準的內連接為:

    SELECT * FROM emp e INNER JOIN dept d ON e.deptno=d.deptno;

    內連接的特點:查詢結果必須滿足條件。例如我們向emp表中插入一條記錄:

    其中deptno為50,而在dept表中只有10、20、30、40部門,那么上面的查詢結果中就不會出現“張三”這條記錄,因為它不能滿足e.deptno=d.deptno這個條件。

    10.2.2 外連接(左連接、右連接)

    外連接的特點:查詢出的結果存在不滿足條件的可能。
    左連接:讀取左邊數據表的全部數據,即便右邊表無對應數據

    SELECT * FROM emp e LEFT OUTER JOIN dept d ON e.deptno=d.deptno;

    左連接是先查詢出左表(即以左表為主),然后查詢右表,右表中滿足條件的顯示出來,不滿足條件的顯示NULL。

    這么說你可能不太明白,我們還是用上面的例子來說明。其中emp表中“張三”這條記錄中,部門編號為50,而dept表中不存在部門編號為50的記錄,所以“張三”這條記錄,不能滿足e.deptno=d.deptno這條件。但在左連接中,因為emp表是左表,所以左表中的記錄都會查詢出來,即“張三”這條記錄也會查出,但相應的右表部分顯示NULL。

    10.2.3 右連接

    右連接就是先把右表中所有記錄都查詢出來,然后左表滿足條件的顯示,不滿足顯示NULL。例如在dept表中的40部門并不存在員工,但在右連接中,如果dept表為右表,那么還是會查出40部門,但相應的員工信息為NULL。

    SELECT * FROM emp e RIGHT OUTER JOIN dept d ON e.deptno=d.deptno;

    連接查詢心得:

    連接不限與兩張表,連接查詢也可以是三張、四張,甚至N張表的連接查詢。通常連接查詢不可能需要整個笛卡爾積,而只是需要其中一部分,那么這時就需要使用條件來去除不需要的記錄。這個條件大多數情況下都是使用主外鍵關系去除。

    兩張表的連接查詢一定有一個主外鍵關系,三張表的連接查詢就一定有兩個主外鍵關系,所以在大家不是很熟悉連接查詢時,首先要學會去除無用笛卡爾積,那么就是用主外鍵關系作為條件來處理。如果兩張表的查詢,那么至少有一個主外鍵條件,三張表連接至少有兩個主外鍵條件。

    讀取右邊數據表的全部數據,即便左邊邊表無對應數據

    10.3 全外連接

    全外連接(MySQL不支持):只要某一個表存在匹配,就返回行;可以使用UNION來完成全鏈接

    10.4 自然連接

    大家也都知道,連接查詢會產生無用笛卡爾積,我們通常使用主外鍵關系等式來去除它。而自然連接無需你去給出主外鍵等式,它會自動找到這一等式:

    兩張連接的表中名稱和類型完全一致的列作為條件,例如emp和dept表都存在deptno列,并且類型一致,所以會被自然連接找到!

    當然自然連接還有其他的查找條件的方式,但其他方式都可能存在問題!

    SELECT * FROM emp NATURAL JOIN dept; SELECT * FROM emp NATURAL LEFT JOIN dept; SELECT * FROM emp NATURAL RIGHT JOIN dept;

    10.5 子查詢

    子查詢就是嵌套查詢,即SELECT中包含SELECT,如果一條語句中存在兩個,或兩個以上SELECT,那么就是子查詢語句了。

    • 子查詢出現的位置:
      • where后,作為條件的一部分;
    • from后,作為被查詢的一條表;
    • 當子查詢出現在where后作為條件時,還可以使用如下關鍵字:
      • any
    • all
    • 子查詢結果集的形式:
    • 單行單列(用于條件)
    • 單行多列(用于條件)
    • 多行單列(用于條件)
    • 多行多列(用于表)

    10.5.1 工資高于甘寧的員工。

    分析:
    查詢條件:工資>甘寧工資,其中甘寧工資需要一條子查詢。

    第一步:查詢甘寧的工資

    SELECT sal FROM emp WHERE ename='甘寧'

    第二步:查詢高于甘寧工資的員工

    SELECT * FROM emp WHERE sal > (${第一步})

    結果:

    SELECT * FROM emp WHERE sal > (SELECT sal FROM emp WHERE ename='甘寧')

    子查詢作為條件
    子查詢形式為單行單列

    10.5.2 工資高于30部門所有人的員工信息

    分析:
    查詢條件:工資高于30部門所有人工資,其中30部門所有人工資是子查詢。高于所有需要使用all關鍵字。

    第一步:查詢30部門所有人工資

    SELECT sal FROM emp WHERE deptno=30;

    第二步:查詢高于30部門所有人工資的員工信息

    SELECT * FROM emp WHERE sal > ALL (${第一步})

    結果:

    SELECT * FROM emp WHERE sal > ALL (SELECT sal FROM emp WHERE deptno=30)
    • 子查詢作為條件
    • 子查詢形式為多行單列(當子查詢結果集形式為多行單列時可以使用ALL或ANY關鍵字)

    10.5.3 查詢工作和工資與殷天正完全相同的員工信息

    分析:
    查詢條件:工作和工資與殷天正完全相同,這是子查詢

    第一步:查詢出殷天正的工作和工資

    SELECT job,sal FROM emp WHERE ename='殷天正'

    第二步:查詢出與殷天正工作和工資相同的人

    SELECT * FROM emp WHERE (job,sal) IN (${第一步})

    結果:

    SELECT * FROM emp WHERE (job,sal) IN (SELECT job,sal FROM emp WHERE ename='殷天正')
    • 子查詢作為條件
    • 子查詢形式為單行多列

    10.5.4 查詢員工編號為1006的員工名稱、員工工資、部門名稱、部門地址

    分析:
    查詢列:員工名稱、員工工資、部門名稱、部門地址
    查詢表:emp和dept,分析得出,不需要外連接(外連接的特性:某一行(或某些行)記錄上會出現一半有值,一半為NULL值)
    條件:員工編號為1006

    第一步:去除多表,只查一張表,這里去除部門表,只查員工表

    SELECT ename, sal FROM emp e WHERE empno=1006

    第二步:讓第一步與dept做內連接查詢,添加主外鍵條件去除無用笛卡爾積

    SELECT e.ename, e.sal, d.dname, d.loc FROM emp e, dept d WHERE e.deptno=d.deptno AND empno=1006

    第二步中的dept表表示所有行所有列的一張完整的表,這里可以把dept替換成所有行,但只有dname和loc列的表,這需要子查詢。

    第三步:查詢dept表中dname和loc兩列,因為deptno會被作為條件,用來去除無用笛卡爾積,所以需要查詢它。

    SELECT dname,loc,deptno FROM dept;

    第四步:替換第二步中的dept

    SELECT e.ename, e.sal, d.dname, d.loc FROM emp e, (SELECT dname,loc,deptno FROM dept) d WHERE e.deptno=d.deptno AND e.empno=1006
    • 子查詢作為表
    • 子查詢形式為多行多列

    11. MySQL 索引

    MySQL索引的建立對于MySQL的高效運行是很重要的,索引可以大大提高MySQL的檢索速度。

    索引分單列索引和組合索引。單列索引,即一個索引只包含單個列,一個表可以有多個單列索引,但這不是組合索引。組合索引,即一個索包含多個列。

    創建索引時,你需要確保該索引是應用在 SQL 查詢語句的條件(一般作為 WHERE 子句的條件)。

    實際上,索引也是一張表,該表保存了主鍵與索引字段,并指向實體表的記錄。

    上面都在說使用索引的好處,但過多的使用索引將會造成濫用。因此索引也會有它的缺點:雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對表進行INSERT、UPDATE和DELETE。因為更新表時,MySQL不僅要保存數據,還要保存一下索引文件。

    建立索引會占用磁盤空間的索引文件。

    11.1 普通索引

    CREATE INDEX indexName ON mytable(username(length)); //創建索引 ALTER mytable ADD INDEX [indexName] ON (username(length)) ;//修改表結構 DROP INDEX [indexName] ON mytable; //刪除索引

    11.2 唯一索引

    CREATE UNIQUE INDEX indexName ON mytable(username(length)) ;//創建索引 ALTER mytable ADD UNIQUE [indexName] ON (username(length)) ;修改表結構

    11.3 使用ALTER 命令添加和刪除索引

    //該語句添加一個主鍵,這意味著索引值必須是唯一的,且不能為NULL ALTER TABLE tbl_name ADD PRIMARY KEY (column_list);//這條語句創建索引的值必須是唯一的(除了NULL外,NULL可能會出現多次) ALTER TABLE tbl_name ADD UNIQUE index_name (column_list);// 添加普通索引,索引值可出現多次 ALTER TABLE tbl_name ADD INDEX index_name (column_list);//該語句指定了索引為 FULLTEXT ,用于全文索引 ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list);

    總結

    以上是生活随笔為你收集整理的MySQL数据库:SQL语句的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 最新中文字幕在线观看视频 | 精品免费囯产一区二区三区 | 欧美成人做爰大片免费看黄石 | 午夜写真片福利电影网 | 豆花在线观看 | 欧美日韩黄色一级片 | 欧美成人一区二区三区四区 | 麻豆一区二区在线 | 成人尤物 | 麻豆乱码国产一区二区三区 | 好色综合 | 狠狠综合 | 丰满少妇在线观看网站 | 精品少妇久久久 | 欧美黑人疯狂性受xxxxx喷水 | 免费se99se| 国产午夜精品理论片 | 日韩亚洲视频在线观看 | 探花精品 | 亚洲性生活视频 | 中文字幕乱码人妻二区三区 | 日韩三级黄 | 视频在线观看 | 免费在线观看av片 | 国产精品视频久久久 | 激情91 | 欧美色图综合网 | 超碰最新上传 | 日韩视频在线观看免费视频 | 成年人在线视频免费观看 | 以女性视角写的高h爽文 | 日剧再来一次第十集 | 久久久久久久一区 | 日本精品久久久 | 黄色香港三级三级三级 | 日韩精品一卡二卡 | 狠狠干狠狠插 | 波多野结衣一二三四区 | 国产福利一区二区视频 | 女的高潮流时喷水图片大全 | 国产成人无码精品久久二区三 | 国产精品后入内射日本在线观看 | 欧美激情视频一区 | 久久免费看少妇高潮 | www欧美精品 | 毛片大全免费看 | 亚洲国产精品视频一区 | 久操网在线 | 色欲欲www成人网站 老色鬼av | 超碰人人人人人 | 黑人巨大精品欧美黑白配亚洲 | 香港黄色网| 欧美亚洲精品天堂 | 日本精品一区在线 | 无码国产精品一区二区色情男同 | 中国videosex高潮hd | 久草www | 欧美老熟妇乱大交xxxxx | 亚洲熟女乱综合一区二区三区 | 999视频在线观看 | 一区久久久 | 蜜桃91丨九色丨蝌蚪91桃色 | 天天射寡妇射 | 武林美妇肉伦娇喘呻吟 | 99久久精品免费看国产免费软件 | 高清视频在线免费观看 | 亚洲丝袜中文字幕 | 国产乱强伦一区二区三区 | 黄色免费在线网站 | 一区二区三区视频免费视 | www.精品 | 中文字幕18页| 片黄在线观看 | 看全色黄大色黄大片大学生 | 色噜噜日韩精品欧美一区二区 | 99精品国产成人一区二区 | 婷婷伊人五月 | 成人免费视频国产免费 | 久久久精品人妻av一区二区三区 | 成人av电影在线观看 | 91精品国产91久久久久久吃药 | 天天天操操操 | 正在播放木下凛凛88av | 青草视频在线观看免费 | 免费视频黄色 | 欧美亚洲一二三区 | 夜色成人网 | 操碰在线视频 | av成人在线播放 | 精品一区二区三区免费视频 | 国产三区在线成人av | 国产日产精品一区二区三区四区 | 91无打码| 在线观看视频一区 | www.自拍偷拍 | 午夜做爰xxxⅹ性高湖视频美国 | 日本三级一区二区三区 | 国产精品91久久久 | 无人在线观看高清视频 |