mysql学习笔记(基本就书上的内容,只是自己做个笔记)

本文全面介绍了MySQL的基本操作,包括语句规范、服务管理、用户管理、数据库及表的创建与维护等核心内容,并深入探讨了索引、视图、触发器等高级特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


MySql学习笔记

这是之前的一篇学习笔记。虽然选择的是原创,但是大部分内容都是书上的。。。

mysql语句规范

  • 关键字与函数名称全部大写
  • 数据库名称,表名称,字段名称小写
  • SQL语句必须以分号结尾

启动停止服务

windows 启动mysql服务

net start mysql

windows 停止mysql服务

net stop mysql   

mysql 登录

参数说明

-D, –database=name 打开指定数据库
–delimiter = name 指定分隔符
-h, –host=name 服务器名称
-p, –password[=name] 密码
-P, –port=# 端口号
–prompt=name 设置提示符
-u, –user=name 用户名
-v, –version 输出版本信息并退出

登录命令

本地mysql 登录 如果端口没修改 那就不需要-P 连接远程 使用 -h

mysql -uroot -p -P3306

创建用户

···sql
create user ‘username’@’%’ identified by ‘password’;


创建的用户还没有任何权限 % 代表可以远程访问 ,可以指定localhost 只运行本地访问,或者直接指定ip,只运行指定的ip访问    
授权:    

```sql
grant all privileges on *.* to username@'%' identified by 'password'




<div class="se-preview-section-delimiter"></div>

授权所有用户的所有表

修改密码,mysql5.7 user表没有password字段 使用如下语句修改密码:

update mysql.user set authentication_string=password('newpassword') where user='username';




<div class="se-preview-section-delimiter"></div>

修改提示符

进入mysql 命令模式 修改提示符 prompt localhost> 可以修改左边的提示符

– prompt 提示符
\D 完整日期
\d 当前数据库
\h 服务器名称
\u 当前用户
例如 : prompt \d@\u> 如果在本机root用户 则提示符为localhost@root>


mysql 常用命令

SELECT VERSION(); –显示当前mysql服务器版本
SELECT NOW(); – 显示当前日期
SELECT USER(); –显示当前用户


数据库相关

创建数据库

CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [DEFAULT] CHARACTER SET [=] charset_name
{} 必填 []选填
IF NOT EXISTS 数据库不存在则建库,否则就啥事没有(其实有警告信息,但是没返回给客户端)
DEFAULT CHARACTER SET 指定数据库字符集 如果不指定 则 使用数据库服务器的默认字符集

来个简单的创建语句

CREATE DATABASE t1;




<div class="se-preview-section-delimiter"></div>

怎么知道创建成功了呢?查看当前服务器下数据库列表

SHOW DATABASES;




<div class="se-preview-section-delimiter"></div>

当建库的指定的数据库名称已经存在,则会报错,添加 IF NOT EXISTS 语句,将不会报错,会有警告

 CREATE DATABASE  IF NOT EXISTS t1;




<div class="se-preview-section-delimiter"></div>

查询警告信息使用语句

SHOW WARNINGS;




<div class="se-preview-section-delimiter"></div>

字符集默认使用数据库服务器的,通过语句

SHOW CREATE DATABASE t1;




<div class="se-preview-section-delimiter"></div>

查看建库的时候的语句以及字符集,建库的时候也可以自己指定字符集

CREATE DATABASE IF NOT EXISTS t2 CHARACTER SET gbk;




<div class="se-preview-section-delimiter"></div>

上面的语句指定GBK字符集,可以通过show create database t2 查看确认


修改数据库

ALTER {DATABASE | SCHEMA} [db_name] [DEFAULT] CHARACTER SET [=] charset_name
修改数据库的字符集
例如:

alter database t2 character set = utf8;




<div class="se-preview-section-delimiter"></div>

删除数据库

DROP {DATABASE | SCHEMA} [IF EXISTS] db_name
删除数据库 当删除不存在的数据库会报错

简单删除:

drop database t1;




<div class="se-preview-section-delimiter"></div>

使用IF EXISTS

drop database if exists t1;




<div class="se-preview-section-delimiter"></div>

存储引擎

存储引擎指定了表的类型,即如何存储和索引数据,是否支持事务等,同时存储引擎也决定了表在计算机中的存储方式。
通过语句

SHOW ENGINES;

来查看当前MySQL数据库支持的存储引擎
或者使用下面的语句也可以查看支持的存储引擎

SHOW VARIABLES LIKE ‘have%’;

默认的存储引擎

  • 查询默认存储引擎

    SHOW VARIABLES LIKE ‘storage_engine%’;

  • 修改默认存储引擎
    修改配置文件(不同版本的mysql可能配置名不同),必须重启后生效

    default-storage-engine=INNODB

  • 选择存储引擎

特性MyISAMInnoDBMEMORY
存储限制64TB
事务安全不支持支持不支持
锁机制表锁行锁表锁
B树索引支持支持支持
哈希索引不支持不支持支持
全文索引支持不支持不支持
集群索引不支持支持支持
数据缓存未知支持支持
索引缓存支持支持支持
数据可压缩支持不支持不支持
空间使用N/A
内存使用中等
批量插入速度
支持外键不支持支持不支持

数据类型

数据类型字节范围说明
TINYINT1自己算
SMALLINT2同上
MEDIUMINT3同上
INT4同上
BIGINT8同上
FLOAT4
DOUBLE8
DEC(M,D)M+2与DOUBLE相同精确度高,一般存金额啥的
BIT(M)1~8
DATE41000-01-01 ~ 9999-12-31日期
DATETIME81000-01-01 00:00:00 ~ 9999-12-31 23:59:59
TIMESTAMP419700101080001 ~ 2038年的某个时刻时间戳
TIME3
YEAR1年份
CHAR(M)M0 <=M<=255定长字符串,不管插入的实际长度多少,都是固定长度
VARCHAR(M)M0<=M<=65535可变字符串
TINYTEXT0~255值的长度为+2个字节
TEXT0-65535值的长度为+2个字节
MEDIUMTEXT0~167772150值的长度为+3个字节
LONGTEXT0~4294967295值的长度为+4个字节
BINARY(M)M允许的长度为0~M
VARBINARY(M)M少量的二进制数据可以使用这个类型存储
TINYBLOB0~255存二进制数据用的譬如图片啥的
BLOB0~2E16
MEDIUMBLOB0~2E24
LONGBLOB0~2E32

表的操作

概念

表是包含数据库中所有数据的数据库对象。
表中的数据库对象包含列,索引和触发器:
* 列(Columns)
也称属性列,在创建具体表时,必须指定列的名字和数据类型。
* 索引(Indexes)
是根据是定的数据库列建立起来的顺序,提供了快速访问数据的途径,且可监督表的数据,使其索引所指向的列中的数据不重复。
* 触发器(Triggers)
是指用户定义的事务命令的集合,当对表的数据进行插入,更新或者删除的时候这组命令就会自动执行,可以用来确保数据的完整性和安全性。

创建表

CREATE TABLE table_name (
属性名 数据类型,
属性名 数据类型,
.
.
.
属性名 数据类型
)

简单建表语句示例:

CREATE TABLE t_dept (
    deptno INT,
    dname VARCHAR(20),
    loc VARCHAR(40)
);




<div class="se-preview-section-delimiter"></div>

查看表结构

DESCRIBE t_dept;




<div class="se-preview-section-delimiter"></div>

查看表的详细定义

就是看建表使用的语句

SHOW CREATE TABLE table_name;

SHOW CREATE TABLE t_dept;




<div class="se-preview-section-delimiter"></div>

删除表

DROP TALBE table_name;

DROP TABLE t_dept;




<div class="se-preview-section-delimiter"></div>

修改表

修改表名

ALTER TABLE table_name RENAME [TO] new_table_name;

ALTER TABLE t_dept RENAME tab_dept;




<div class="se-preview-section-delimiter"></div>
增加字段
  1. 在表的最后一个位置增加字段
    ALTER TABLE table_name
    ADD 属性名 属性类型;
ALTER TABLE t_dept ADD descri VARCHAR(20);




<div class="se-preview-section-delimiter"></div>
  1. 在表的第一个位置增加字段
    ALTER TABLE table_name ADD 属性名 属性类型 FIRST;
ALTER TABLE t_dept ADD descri VARCHAR(20) FIRST;




<div class="se-preview-section-delimiter"></div>
  1. 在表的指定字段之后添加字段
    ALTER TABLE table_name ADD 属性名 属性类型 AFTER 属性名;
ALTER TABLE t_dept ADD descri VARCHAR(20) AFTER deptno;




<div class="se-preview-section-delimiter"></div>
删除字段

ALTER TABLE table_name DROP 属性名;

ALTER TABLE t_dept DROP deptno;




<div class="se-preview-section-delimiter"></div>
修改字段
  1. 修改字段类型
    ALTER TABLE table_name MODIFY 属性名 属性字段;
ALTER TABLE t_dept MODIFY deptno VARCHAR(20);




<div class="se-preview-section-delimiter"></div>
  1. 修改字段名字
    ALTER TABLE table_name CHANGE 旧属性名 新属性名 旧数据类型;
ALTER TABLE t_dept CHANGE loc location VARCHAR(40);




<div class="se-preview-section-delimiter"></div>
  1. 同时修改字段的名字和类型
    ALTER TABLE table_name CHANGE 旧属性名 新属性名 新类型;
ALTER TABLE t_dept CHANGE loc location VARCHAR(20);




<div class="se-preview-section-delimiter"></div>

表的约束

完整性约束
完整性约束关键字含义
NOT NULL约束字段不能为空
DEFAULT字段默认值
UNIQUE KEY(UK)约束字段唯一
PRIMARY KEY(PK)字段为主键 记录唯一标识
AUTO_INCREMENT自动增长
FOREIGN KEY(FK)外键
  1. 非空约束(NOT NULL)
    CREATE TABLE table_name (
    属性名 数据类型 NOT NULL,
    。。。
    );
CREATE TABLE t_dept (
    deptno INT(20) NOT NULL,
    dname VARCHAR(20),
    loc VARCHAR(40)
);




<div class="se-preview-section-delimiter"></div>
  1. 默认值(DEFAULT)
    CREATE TABLE table_name (
    属性名 数据类型 DEFAULT 默认值,

    );
CREATE TALBE t_dept(
        deptno INT NOT NULL,
        dname VARCHAR(20) DEFAULT 'luo',
        loc VARCHAR(40)
);




<div class="se-preview-section-delimiter"></div>
  1. 唯一约束(UNIQUE, UK)
    CREATE TABLE table_name (
    属性名 数据类型 UNIQUE ,
    。。。
    );
CREATE TABLE t_dept(
        deptno INT ,
        dname VARCHAR(20) UNIQUE,
        loc VARCHAR(40)
);




<div class="se-preview-section-delimiter"></div>
给UK约束设置一个名字
CREATE TABLE t_dept(
        deptno INT,
        dname VARCHAR(20),
        loc VARCHAR(40),
        CONSTRAINT uk_dname UNIQUE(dname)
);




<div class="se-preview-section-delimiter"></div>
  1. 主键(PRIMARY KEY, PK)
    单字段主键
    CREATE TABLE table_name (
    属性名 字段类型 PRIMARY KEY,

    );
CREATE TABLE t_dept (
        deptno INT PRIMARY KEY,
        dname VARCHAR(20),
        loc VARCHAR(40)
);    




<div class="se-preview-section-delimiter"></div>
给PK约束设置一个名字。
CREATE TABLE t_dept(
        deptno INT ,
        dname VARCHAR(20),
        loc VARCHAR(40),
        CONSTRAINT pk_dname PRIMARY KEY(dname)
);




<div class="se-preview-section-delimiter"></div>
多字段主键

CREATE TABLE table_name (
属性名 字段类型,

[CONSTRAINT 约束名] PRIMARY KEY (属性名,属性名…)
);

CREATE TABLE t_dept(
        deptno INT,
        dname VARCHAR(20),
        loc VARCHAR(40),
        CONSTRAINT pk_dname_deptno PRIMARY KEY(deptno, dname)
);




<div class="se-preview-section-delimiter"></div>
  1. 设置自动增加(AUTO_INCREMENT)
    CREATE TABLE table_name (
    属性名 数据类型 AUTO_INCREMENT,

    );
CREATE TALBE t_dept (
    deptno INT PRIMARY KEY AUTO_INCREMENT,
    dname VARCHAR(20),
    loc VARCHAR(40)
);




<div class="se-preview-section-delimiter"></div>
  1. 外键约束(FOREIGN KEY, FK)
    CREATE TALBE table_name (
    属性名 数据类型,
    。。。
    CONSTRAINT 外键约束名 FOREIGN KEY(属性名) REFERENCES 表名(属性名)
    );
CREATE TABLE t_dept (
    deptno INT PRIMARY KEY,
    dname VARCHAR(20),
    loc VARCHAR(40)
);

CREATE TABLE t_employee(
    empno INT PRIMARY KEY,
    ename VARCHAR(20),
    job VARCHAR(40),
    mgr INT,
    hiredate DATE,
    sal DOUBLE(10,2),
    comm DOUBLE(10,2),
    deptno INT,
    CONSTRANIT fk_deptno FOREIGN KEY(deptno) REFERENCES t_dept(deptno)
);




<div class="se-preview-section-delimiter"></div>

索引

通过索引对象,可以快速查询到数据库对象表中的特定记录,是一种提高性能的常用方式。 MySQL支持6种索引: * 普通索引 * 唯一索引 * 全文索引 * 单列索引 * 多列索引 * 空间索引 索引的创建有利有弊,创建索引可以提高查询速度,但是过多创建索引则会占据许多磁盘空间,因此在创建索引之前,必须权衡利弊。 一下情况适合创建索引: * 经常被查询的字段,即在WHERE 子句中出现的字段 * 在分组的字段,即在GROUP BY字句中出现的字段 * 存在依赖关系的子表和父表之间的联合查询,即主键或外键字段 * 设置唯一完整性约束的字段 以下情况不适合创建索引: * 在查询中很少被使用的字段 * 拥有许多重复值的字段

创建和查看索引

创建和查看普通索引
创建表时创建普通索引

CREATE TABLE table_name(
属性名 数据类型,

属性名 数据类型,
INDEX|KEY [索引名] (属性名1[(长度)] [ASC|DESC])
);

上述语句 INDEX 或 KEY 用来指定字段为索引
CREATE TABLE t_dept(
    deptno INT ,
    dname VARCHAR(20),
    loc VARCHAR(40),
    INDEX index_deptno(deptno)
);




<div class="se-preview-section-delimiter"></div>
为了校验表t_dept 中索引是否被使用 执行sql语句EXPLAIN
EXPLAIN
    SELECT * FROM t_dept WHERE deptno = 1;




<div class="se-preview-section-delimiter"></div>
在已经存在的表上创建普通索引

CREATE IDNEX 索引名 ON 表名(属性名 [(长度)] [ASC|DESC]);

CREATE INDEX index_deptno ON t_dept (deptno);




<div class="se-preview-section-delimiter"></div>
通过SQL语句ALTER TABLE 创建普通索引

ALTER TABLE table_name ADD INDEX|KEY 索引名 (属性名 [(长度)] [ASC|DESC]);

ALTER TABLE t_depte ADD INDEX index_deptno (deptno);




<div class="se-preview-section-delimiter"></div>
唯一索引
创建表时创建唯一索引

CREATE TABLE table_name (
属性名 数据类型,

UNIQUE INDEX|KEY [索引名] (属性名 [(长度)] [ASC|DESC])
);

CREATE TABLE t_dept(
    deptno INT UNIQUE,
    dname VARCHAR(20),
    loc VARCHAR(40),
    UNIQUE INDEX index_deptno(deptno)
);




<div class="se-preview-section-delimiter"></div>
在已经存在的表上创建唯一索引

CREATE UNIQUE INDEX 索引名 ON 表名 (属性名 [(长度)] [ASC|DESC]);

CREATE UNIQUE INDEX index_deptno ON t_dept (deptno);




<div class="se-preview-section-delimiter"></div>
通过ALTER TABLE 创建唯一索引

ALTER TABLE table_name ADD UNIQUE INDEX|KEY 索引名(属性名 [(长度)] [ASC|DESC]);

ALTER TABLE t_dept ADD UNIQUE INDEX index_deptno (deptno);




<div class="se-preview-section-delimiter"></div>
全文索引
存储引擎MyISAM 才支持全文索引。
创建表时创建全文索引

CREATE TABLE table_name (
属性名 数据类型,

FULLTEXT INDEX|KEY [索引名] (属性名 [(长度)] [ASC|DESC])
);

CREATE TABLE t_dept(
        deptno INT,
        dname VARCHAR(20),
        loc VARCHAR(40),
        FULLTEXT INDEX index_loc (loc)
) ENGINE = MyISAM;




<div class="se-preview-section-delimiter"></div>
已经存在的表上创建全文索引

CREATE FULLTEXT INDEX 索引名 ON 表名 (属性名 [(长度)] [ASC|DESC]);

CREATE FULLTEXT INDEX index_loc ON t_dept (loc);




<div class="se-preview-section-delimiter"></div>
通过ALTER TABLE 创建全文索引

ALTER TABLE table_name ADD FULLTEXT INDEX|KEY 索引名 (属性名 [(长度)] [ASC|DESC]);

ALTER TABLE t_dept ADD FULLTEXT INDEX index_loc (loc);




<div class="se-preview-section-delimiter"></div>
创建多列索引
创建表时创建多列索引

CREATE TABLE table_name (
属性名 数据类型,

INDEX|KEY [索引名] (属性名1 [(长度)] [ASC|DESC], 属性名n [(长度)] [ASC|DESC])
);

CREATE TABLE t_dept (
        deptno INT,
        dname VARCHAR(20),
        loc VARCHAR(40),
        KEY  index_dname_loc (dname, loc)
);




<div class="se-preview-section-delimiter"></div>
在已经存在的表创建多列索引

CREATE INDEX 索引名 ON 表名 (属性名1 [(长度)] [ASC|DESC], 属性名n [(长度)] [ASC|DESC])

CREATE INDEX index_dname_loc ON t_dept (dname, loc);




<div class="se-preview-section-delimiter"></div>
通过ALTER TABLE 创建多列索引

ALTER TABLE table_name ADD KEY|INDEX 索引名 (属性名1 [(长度)] [ASC|DESC], 属性名n [(长度)] [ASC|DESC])

ALTER TABLE t_dept ADD INDEX index_dname_loc (dname,loc);




<div class="se-preview-section-delimiter"></div>

删除索引

语法为:

DROP INDEX index_name ON table_name;

DROP INDEX index_dname_loc ON t_dept;




<div class="se-preview-section-delimiter"></div>

视图

为什么使用视图

数据库关于数据的查询有时候非常复杂,例如表连接,子查询等。当这种查询需要重复使用时,很难保证次次都编写正确,降低了数据库的实用性。 还有,有时候要求只能操作部分字段而不是全部字段,提高SQL语句的复用性和表操作的安全性。 视图的特点如下: * 视图的列可以来自不同的表,是表的抽象和在逻辑意义上建立的新关系。 * 视图是由基本表(实表)产生的表(虚表)。 * 视图的建立和删除不影响基本表。 * 对视图内容的更新(添加,删除和修改)直接影响基本表。 * 当视图来自多个基本表时,不允许添加和删除数据。

创建视图

CREATE VIEW view_name AS 查询语句;

CREATE VIEW view_selectproduct
    AS 
        SELECT id, name 
            FROM t_product;




<div class="se-preview-section-delimiter"></div>

查看视图

  1. SHOW TABLES
    SHOW TABLES 可以查看表和视图。
  2. SHOW TABLES STATUS

    SHOW TABLES STATUS [FROM db_name] [LIKE ‘pattern’];


与上面一样,可以显示表和视图的详细信息。
  1. SHOW CREATE VIEW语句查看视图定义信息
SHOW CREATE VIEW view_selectproduct;




<div class="se-preview-section-delimiter"></div>
  1. DESCRIBE | DESC 语句查看视图设计信息

    DESCRIBE | DESC viewname;

  2. 通过系统表查看系统信息

USE information_schema;
SELECT * 
    FROM views
        WHERE table_name = 'view_selectproduct';




<div class="se-preview-section-delimiter"></div>

删除视图

DROP VIEW view_name [, view_name] …;

DROP VIEW view_selectproduct;




<div class="se-preview-section-delimiter"></div>

修改视图

  1. CREATE OR REPLACE VIEW 修改视图
CREATE OR REPLACE VIEW view_selectproduct
    AS 
        SELECT name
            FROM t_product;




<div class="se-preview-section-delimiter"></div>
  1. ALTER 语句修改视图
    ALTER VIEW viewname AS 查询语句;
ALTER VIEW view_selectproduct
    AS 
        SELECT name
            FROM t_product;




<div class="se-preview-section-delimiter"></div>

触发器

触发器的执行不是程序调用,也不是手工启动,而是事件触发。

创建触发器

CREATE TRIGGER trigger_name
BEFORE | AFTRE trigger_event
ON table_name FOR EACH ROW trigger_stmt;

上述语句中,trigger_name 表示触发器名字,BEFORE AFTER 指定触发器执行实际, trigger_event 标识触发事件,包含 DELETE , INSERT, UPDATE语句,table_name 标识触发事件的表名字,FOR EACH ROW 标识任何一条记录上的操作满足触发条件都会触发触发器。
CREATE TRIGGER tri_diarytime
    BEFORE INSERT
        ON t_dept FOR EACH ROW
            INSERT INTO t_diary VALUES(NULL, 't_dept', now());




<div class="se-preview-section-delimiter"></div>

创建包含多条执行语句的触发器

CREATE TRIGGER trigger_name
BEFORE | AFTER trigger_event
ON table_name FOR EACH ROW
BEGIN
trigger_stmt
END;

在MySQL中,一般情况下使用;座位语句的结束符号,可以在创建触发器时,需要用到;符号座位执行语句的结束符,为了解决该问题,可以使用关键字DELIMITER 暂时修改结束符号。
DELIMITER $$
CREATE TRIGGER tri_diarytime2
    AFTER INSERT
        ON t_dept FOR EACH ROW
            BEGIN
                INSERT INTO t_diary VALUES(NULL, 't_dept', now());
                INSERT INTO t_diary VALUES(NULL, 't_dept', now());
            END
            $$
DELIMITER ;




<div class="se-preview-section-delimiter"></div>

查看触发器

  1. SHOW TRIGGERS查看触发器
  2. 查看系统表triggers
USE information_schema;
SELECT * FROM triggers;




<div class="se-preview-section-delimiter"></div>

删除触发器

  1. DROP TRIGGER 删除
DROP TRIGGER tri_diarytime;




<div class="se-preview-section-delimiter"></div>

数据操作(容易忘的)

避免重复数据 DISTINCT

SELECT DISTINCT job
    FROM t_employee;




<div class="se-preview-section-delimiter"></div>

运算数据查询 (+ - * / DIV % MOD)

SELECT ename, sal * 12 
    FROM t_employee;




<div class="se-preview-section-delimiter"></div>

统计函数

  • COUNT
  • AVG
  • SUM
  • MAX
  • MIN

GROUP 分组

分组的字段一定要有重复值,否则就没有意义,分组一般与统计函数一起使用。

限定分组查询(HAVING)

SELECT deptno, AVG(sal) average, GROUP_CONCAT(ename) enames, COUNT(ename) number
    FROM t_employee
    GROUP BY deptno
    HAVING AVG(sal) > 2000;




<div class="se-preview-section-delimiter"></div>

GROUP_CONCAT 函数显示每个ename。


多表查询

笛卡尔积

笛卡尔积就是没有连接条件表关系返回结果,如果表1有3个记录,表2有7个记录,那么笛卡尔积后,有21个记录

连接

内连接(INNER JOIN)

内链接就是在表关系建立笛卡尔积数据记录中,保留表关系所有匹配的数据记录,舍弃不匹配的记录。
可以分为自然连接,等值连接,不等连接。

sql示例:

SELECT e.empno, e.ename employeename, e.sal, e.job, l.ename loadername
    FROM t_employee e INNER JOIN t_employee l
        ON e.mgr = l.empno;




<div class="se-preview-section-delimiter"></div>
自然连接

自然连接就是表关系笛卡尔积中,首先根据表关系中相同的字段自动进行记录匹配,然后去掉重复字段,会自动判断相同名称字段,然后进行数据值的匹配。

等值连接

这个好理解,根据等值条件连接

不等连接

那就是不等咯

外连接(OUTER JOIN)

外连接就是在笛卡尔积中,不仅保留所有匹配的记录,还保留部分不匹配记录。

语法:

SELECT field1, field2,…fieldn
FROM join_table_name1
LEFT|RIGTH|FULL [OUTER] JOIN join_tablename2
ON join_condition;

左外连接

保留匹配记录和全部左表记录

右外连接

保留匹配记录和全部右表记录

全外连接

保留匹配记录和左右两表全部记录

合并查询数据记录

UNION | UNION ALL;

子查询

MySQL中虽然可以使用多表查询数据记录,但是却不推荐使用,这是因为连接查询的性能很差,因此出现了连接查询的替代者子查询

返回结果为单行单列和单行多列的子查询
  1. 返回结果为单行单列的子查询
SELECT * 
    FROM t_employee
    WHERE sal > (
        SELECT sal
            FROM t_employee
            WHERE ename = 'SMITH');




<div class="se-preview-section-delimiter"></div>
  1. 单行多列子查询
SELECT ename, sal, job 
    FROM t_employee
    WHERE (sal, job) = (
        SELECT sal, job
            FROM t_employee
            WHERE ename = 'SMITH');




<div class="se-preview-section-delimiter"></div>
返回结果为多行单列子查询
  1. 带有关键字IN 的子查询
SELECT *
    FROM t_employee
    WHERE deptno IN (
        SELECT deptno
            FROM t_dept
);

SELECT *
    FROM t_employee
    WHERE deptno NOT IN (
        SELECT deptno
            FROM t_dept
);





<div class="se-preview-section-delimiter"></div>
  1. 带有关键字ANY的子查询
    有三种匹配方式:
    • =ANY
      功能和IN一样
    • >ANY (>=)
      大于任意一个,也就是比里面最小的大就行了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值