MySql

MySQL笔记_新潮墨的博客-CSDN博客

关系型数据库,是把复杂的数据结构归结为简单的二元关系 (即二维表格形式),以行(row)列(column)的形式存储数据,以便于用户理解。这一系列的行和列被称为表(table),一组表组成了一个库(database)。SQL就是关系型数据库的查询语言。

特点:

  • 复杂查询可以用SQL语句方便的在一个表以及多个表之间做非常复杂的数据查询。
  • 事务支持使得对于安全性能很高的数据访问要求得以实现。

非关系型数据库(NoSQL,not only sql),可看成传统关系型数据库的功能阉割版本,基于键值对存储数据,不需要经过SQL层的解析,通过减少很少用的功能,来提高性能。

特点:

  • ​ 以key-value或json的方式存储数据
  • ​ 将数据存储在内存中
  • ​ 重在性能,读取速度快
     

关系型数据库设计规则
遵循ER模型:
E-R(entity-relationship,实体-联系)模型中有三个主要概念是:实体集属性联系集

  • E entity 代表实体的意思 对应到数据库当中的一张表
  • R relationship 代表关系的意思

具体体现

  • 一个实体集(class)对应于数据库中的一个表(table),一个实体(instance)则对应于数据库表中的一行(row),也称为一条记录(record)。一个属性(attribute)对应于数据库表中的一列(column),也称为一个字段(field)。
  • 一个数据库中可以有多个表,每个表都有一个名字,用来标识自己。表名具有唯一性。
  • 表具有一些特性,这些特性定义了数据在表中如何存储,类似java和python中 “类”的设计。
  • 表与表之间的数据记录有关系(relationship)。现实世界中的各种实体以及实体之间的各种联系均用关系模型来表示。
    • 表中的数据是按行存储的,一行即为一条记录。每一行类似于java或python中的“对象”。
  • 四种:一对一关联、一对多关联、多对多关联、自我引用

1、MySQL概述

mysql community server:社区免费版MySQL :: Download MySQL Installer

mysql enterprise edition:商业收费版

MySQL服务启停

服务:windows管理工具-服务-mysql80;

命令行:net start mysql80/net stop mysql80;

客户端连接

mysql内置工具:MySQL 8.0 command line client;

命令行:mysql [-h 127.0.0.1] [-p 3306] -u -root -p //需配置path环境变量添加目录地址

三方工具:navicat、SQL Studio、MySQL Workbench(mysql官方自带)、MySQL ODBC Connector(接口程序)

入门:Mysql概述;SQL通用语法;函数;约束;多表查询;事务(该文章仅涉及此部分内容)

进阶:存储引擎;索引;SQL优化;视图/存储过程/触发器;锁;InnoDB核心;MySQL管理;

运维:日志;主从复制;分库分表;读写分离

2、SQL通用语法 

  • 分号结尾;
  • 不mysql的sql语法不区分大小写大小写;
  • 单行注释:--#,多行注释:/*AAAAAA*/
分类全称说明
DDLData Definition Language定义数据库对象、表、字段
DMLData Manipulation Language操作数据增、删、改
DQLData Query Language查询表记录
DCLData Control Language创建用户、控制权限

一、DDL

数据库操作

SHOW DATABASES;

例:展示所有数据库。

SELECT DATABASES();

例:显示当前所处数据库。

CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARST 字符集] [COLLATE 排序规则];(新建数据库)

例: create database if not exists CHY charset 'utf8';  # 在mysql中字符集名称不要使用utf-8,字符集还有'gbk';

DROP DATABASE [IF EXISTS] 数据库名;(删除数据库)

例:drop database if exists CHY;

USE 数据库名;(使用数据库)

例:use CHY;

表操作

show tables;--查询当前数据库所有表

desc 表名;--查询表结构

show create table 表名;--查询建表语句

Create table 表名(

字段1 字段1类型 [comment 字段1注释],

字段2 字段2类型 [comment 字段2注释],

......

字段n 字段n类型 [comment 字段n注释]

) [comment 表注释];--建表语句

数据类型

字符串类型

类型大小(Bytes字节)描述
CHAR0-255定长字符串
VARCHAR0-65535变长字符串
TINYBLOB0-255不超过255字符的二进制数据
TINYTEXT0-255短文本字符串
BLOB0-65535二进制形式的长文本数据
TEXT0-65535长文本数据
MEDIUMBLOB0-16777215二进制形式的中等长度文本数据
MEDIUMTEXT0-16777215中等长度文本数据
LONGBLOB0-4294967295二进制形式的极大文本数据
LONGTEXT0-4294967295极大文本数据

日期类型

类型大小范围格式描述
DATE31000-01-01至9999-12-31YYYY-MM-DD日期值
TIME3-838:59:59至838:59:59HH:MM:SS时间值或持续时间
YEAR11901-2155YYYY年份值
DATETIME81000-01-01 00:00:00至9999-12-31 23:59:59YYYY-MM-DD HH:MM:SS混合日期和时间值
TIMESTAMP41970-01-01 00:00:00至2038-01-19 03:14:07YYYY-MM-DD HH:MM:SS混合日期和时间值,时间戳

数值类型

类型

大小

(byte字节)

有符号(SIGNED)范围无符号(UNSIGNED)范围描述
TINYINT1(-128,127)(0,255)小整数值
SMALLINT2(-32768,32767)(0,65535)大整数值
MEDIUMINT3(-8388608,8388607)(0,16777215)大整数值
INT或INTEGER4(-2147483648,2147483647)(0,4294967295)大整数值
BIGINT8(-2^63,2^63-1)(0,2^64-1)极大整数值
FLOAT4(-3.402823466E+38,3.402823466351E+38)0和(-1.175494351E-38,3.402823466E+38)单精度浮点数值
DOUBLE8(-1.7976931348623157E+308,1.7676931348623157E+308)0和(2.2250738585072014E-308,1.7976931843623157E+308)双精度浮点数值
DECIMAL依赖于M(精度)和D(标度)的值依赖于M(精度)和D(标度)的值小数值(精确定点数)

decimal(M,D):表示最长为M位,其中小数点后D位

double(M,D):表示最长为M位,其中小数点后D位
例如:double(5,2)表示的数据范围[-999.99,999.99],如果超过这个范围会报错。

char如果没有指定宽度,默认为1个字符
varchar(M),必须指定宽度

ALTER TABLE 表名 ADD 字段名 类型(长度) [COMMENT 注释] [约束];→添加字段

alter table 【数据库名.]表名称 add 【column】 字段名 数据类型;
alter table 【数据库名.]表名称 add 【column】 字段名 数据类型 first;
alter table 【数据库名.]表名称 add 【column】 字段名 数据类型 after 另一个字段;

ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);→修改数据类型        

alter table 【数据库名.]表名称 modify 【column】字段名 数据类型 first;
alter table 【数据库名.]表名称 modify 【column】字段名 数据类型 after 另一个字段;

ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度) [COMMENT 注释][约束];→修改字段名和字段类型

ALTER TABLE 表名 DROP 字段名;→删除字段

ALTER TABLE 表名 RENAME TO 新表名;→修改表名

DROP TABLE [IF EXISTS] 表名;→删除表

TRUNCATE TABLE 表名;→删除指定表并重新创建

二、DML(增删改)

1、添加数据

INSERT INTO 表名(字段1,字段,2......) VALUES(值1,值2,......);--指定字段添加数据

INSERT INTO 表名 VALUES(值1,值2,.......);--全部字段添加数据

INSERT INTO 表名 (字段1,字段2,......) VALUES (值1,值2,......),(值1,值2,......),(值1,值2,......);

INSERT INTO 表名 VALUES (值1,值2,......),(值1,值2,......),(值1,值2,......);--批量添加数据

  • 插入数据时,指定的字段顺序需要与值得顺序是一一对应的;
  • 字符串和日期型数据需要用引号包含;
  • 插入的数据大小需要符合字段规定。
2、删除数据

DELETE FROM 表名 [WHERE 条件]

  • 若无where条件,默认清空数据;
  • delete删除的是记录,不是字段。
3、修改数据

UPDATE 表名 SET 字段名1=值1,字段名2=值2,......[WHERE 条件];

  • 若无where条件,默认修改所有数据;

三、DCL

1、管理用户

use mysql;

select * from user;--查询用户

create user '用户名'@'主机名' indentified by ‘密码’;--创建用户

alter user '用户名'@'主机名' indentified with mysql _native_password by '新密码';--修改用户密码

drop user '用户名'@'主机名' ; --删除用户

主机名可以使用%通配。

2、权限控制

show grants for '用户名'@'主机名' ;--查询权限

grant 权限列表 on 数据库名.表名 to '用户名'@'主机名' ;--授予权限

revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名' ;--撤销权限

权限说明
all,all privileges所有权限
select查询数据
insert插入数据
update修改数据
delete删除数据
alter修改表
drop删除数据库/表/视图
create创建数据库/表

多个权限之间使用逗号分隔;

授权时,数据库名和表名可以使用*进行通配,代表所有;

四、DQL(查)

SELECT

           字段列表

FROM

            表名列表

WHERE

           条件列表

GROUP BY

           分组字段列表

HAVING

           分组后条件列表

ORDER BY

           排序字段列表

LIMIT

           分页参数

  • 基本查询
  • 条件查询--where
  • 聚合查询--count、max、min、avg、sum
  • 分组查询--group by
  • 排序查询--order by
  • 分页查询--limit
1、基本查询

SELECT 字段1,字段2,......FROM 表名;

SELECT * FROM 表名;--多字段查询

SELECT 字段1 [AS 别名1],字段2 [AS 别名2],......FROM 表名;--设置别名

SELECT DISRINCT 字段列表 FROM 表名;--去除重复记录

2、条件查询

SELECT 字段列表 FROM 表名 WHERE 条件列表;

条件:

比较运算说明逻辑运算说明
>、>=、<、<=、=、<>或!=

等于:= 不能用于null判断

安全等于:<=> 可以用于null值判断

and或&&
between...and...

范围:

between x and y not between x and y

or或||
IN(...)

数组之一,

in (x,x,x)等同于=x||x||x||

not in(x,x,x)

not或!
LIKE 占位符模糊匹配(_单个字符,%任意字符) ('__'两个字符,'%X'尾数为x)^或xor异或,只能满足其中的一个条件,不能同时满足,也不能都不满足,结果A∪B-A∩B
is null

判断时

xx is null

xx is not null

xx <=> null

计算时

ifnull(xx,代替值) 当xx是null时,用代替值计算

+

-

*

/

%(mod)取余数

div(仅保留整数部分)

算术运算

LEAST

GREATEST

最小值运算符:在多个值中返回最小值

最大值运算符:在多个值中返回最大值

REGEXP

RLIKE

正则表达式运算符


 

# 回避特殊符号的:使用转义符。如果使用\表示转义,要省略ESCAPE。如果不是\,则要加上ESCAPE。
# 查询第2个字符是_且第3个字符是'a'的员工信息
# 需要使用转义字符: \ 
SELECT last_name
FROM employees
WHERE last_name LIKE '_\_a%';
#或者  (了解)
SELECT last_name
FROM employees
WHERE last_name LIKE '_$_a%' ESCAPE '$';
(1)‘^’匹配以该字符后面的字符开头的字符串。
(2)‘$’匹配以该字符前面的字符结尾的字符串。
(3)‘.’匹配任何一个单字符。
(4)“[...]”匹配在方括号内的任何字符。例如,“[abc]”匹配“a”或“b”或“c”。为了命名字符的范围,使用一 个‘-’。“[a-z]”匹配任何字母,而“[0-9]”匹配任何数字。
(5)‘*’匹配零个或多个在它前面的字符。例如,“x*”匹配任何数量的‘x’字符,“[0-9]*”匹配任何数量的数字, 而“*”匹配任何数量的任何字符。
3、聚合查询

SELECT 聚合函数(字段列表) FROM 表名;--将一列作为一个整体进行纵向计算

  • null值不参与任何聚合计算。
4、分组查询

SELECT 字段列表 FROM 表名 [WHERE 条件] GROUP BY 分组字段名 [HAVING 分组后过滤条件];

where和having的区别:

  • 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;having是分组后进行过滤。
  • 判断条件不同:where不能对聚合函数判断,having可以。

执行顺序:where→聚合函数→having

分组之后,查询的字段一般为聚合函数或分组字段,查询其他字段无意义。

5、排序查询

SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式,字段2 排序方式2;

排序方式:esc 升序(默认值),desc 降序

如果是多字段排序,当第一个排序字段相同时,才会排序第二个字段。

6、分页查询

SELECT 字段列表 FROM 表名 LIMIT 起始索引,查询记录数;

  • 起始索引从0开始,起始索引=(查询页码-1)*每页记录数;
  • 分页查询仅为mysql所有,其他数据库实现机制不同;
  • 如果查询为第一页数据,起始索引可以省略,简写为limit 10。

3、函数

①字符串函数

函数用法
ASCII(S)返回字符串S中的第一个字符的ASCII码值
CHAR_LENGTH(s)返回字符串s的字符数。作用与CHARACTER_LENGTH(s)相同
LENGTH(s)返回字符串s的字节数,和字符集有关
CONCAT(s1,s2,…,sn)连接s1,s2,…,sn为一个字符串
CONCAT_WS(x,s1,s2,…,sn)同CONCAT(s1,s2,…)函数,但是每个字符串之间要加上x
INSERT(str, idx, len,replacestr)将字符串str从第idx位置开始,len个字符长的子串替换为字符串replacestr
REPLACE(str, a, b)用字符串b替换字符串str中所有出现的字符串a
UPPER(s) 或 UCASE(s)将字符串s的所有字母转成大写字母
LOWER(s) 或LCASE(s)将字符串s的所有字母转成小写字母
LEFT(str,n)返回字符串str最左边的n个字符
RIGHT(str,n)返回字符串str最右边的n个字符
LPAD(str, len, pad)用字符串pad对str最左边进行填充,直到str的长度为len个字符,实现右对齐效果
RPAD(str ,len, pad)用字符串pad对str最右边进行填充,直到str的长度为len个字符,实现左对齐效果
LTRIM(s)去掉字符串s左侧的空格
RTRIM(s)去掉字符串s右侧的空格
TRIM(s)去掉字符串s开始与结尾的空格
TRIM(s1 FROM s)去掉字符串s开始与结尾的s1
TRIM(LEADING s1 FROM s)去掉字符串s开始处的s1
TRIM(TRAILING s1 FROM s)去掉字符串s结尾处的s1
REPEAT(str, n)返回str重复n次的结果
SPACE(n)返回n个空格
STRCMP(s1,s2)比较字符串s1,s2的ASCII码值的大小
SUBSTR(s,index,len)返回从字符串s的index位置其len个字符,作用与SUBSTRING(s,n,len)、MID(s,n,len)相同
LOCATE(substr,str)返回字符串substr在字符串str中首次出现的位置,作用于POSITION(substr IN str)、INSTR(str,substr)相同。未找到,返回0
ELT(m,s1,s2,…,sn)返回指定位置的字符串,如果m=1,则返回s1,如果m=2,则返回s2,如果m=n,则返回sn
FIELD(s,s1,s2,…,sn)返回字符串s在字符串列表中第一次出现的位置
FIND_IN_SET(s1,s2)返回字符串s1在字符串s2中出现的位置。其中,字符串s2是一个以逗号分隔的字符串
REVERSE(s)返回s反转后的字符串
NULLIF(value1,value2)比较两个字符串,如果value1与value2相等,则返回NULL,否则返回value1

②数值函数

函数用法
ABS(x)返回x的绝对值
CEIL(x)返回大于x的最小整数值
FLOOR(x)返回小于x的最大整数值
MOD(x,y)返回x/y的模
RAND()返回0~1的随机值
ROUND(x,y)返回参数x的四舍五入的有y位的小数的值
TRUNCATE(x,y)返回数字x截断为y位小数的结果
SQRT(x)返回x的平方根
POW(x,y)返回x的y次方

③日期函数

函数用法
CURDATE() 或 CURRENT_DATE()返回当前日期
CURTIME() 或 CURRENT_TIME()返回当前时间
NOW() / SYSDATE() / CURRENT_TIMESTAMP() / LOCALTIME() / LOCALTIMESTAMP()返回当前系统日期时间
YEAR(date) / MONTH(date) / DAY(date) / HOUR(time) / MINUTE(time) / SECOND(time)返回具体的时间值
WEEK(date) / WEEKOFYEAR(date)返回一年中的第几周
DAYOFWEEK()返回周几,注意:周日是1,周一是2,。。。周六是7
WEEKDAY(date)返回周几,注意,周1是0,周2是1,。。。周日是6
DAYNAME(date)返回星期:MONDAY,TUESDAY…SUNDAY
MONTHNAME(date)返回月份:January,。。。。。
DATEDIFF(date1,date2) / TIMEDIFF(time1, time2)返回date1 - date2的日期间隔 / 返回time1 - time2的时间间隔
DATE_ADD/SUB(datetime, INTERVAL expr type)返回与给定日期时间相差INTERVAL时间段的日期时间
DATE_FORMAT(datetime ,fmt)按照字符串fmt格式化日期datetime值
STR_TO_DATE(str, fmt)按照字符串fmt对str进行解析,解析为一个日期

DATE_FORMAT( IF ( HOUR ( createtime )>= 14, 
DATE_ADD(createtime, interval 1 day), date( createtime )), '%Y-%m-%d' ) AS date  
#大于14点作业日期+1

createtime >= DATE_SUB(CURDATE(),INTERVAL 15 day) 
#当前日前往前推

ROUND((UNIX_TIMESTAMP(signtime)-UNIX_TIMESTAMP(deliveryouttime))/60/60/24,1) 
#时间相减

DATE_FORMAT(FROM_UNIXTIME(a.complete_time), '%Y-%m-%d') 
#日期时间显示为数字,转换为年月日时分秒

(2)DATE_FORMAT(datetime,fmt) 和 STR_TO_DATE(str, fmt)

格式符说明格式符说明
%Y4位数字表示年份%y表示两位数字表示年份
%M月名表示月份(January,…)%m两位数字表示月份(01,02,03。。。)
%b缩写的月名(Jan.,Feb.,…)%c数字表示月份(1,2,3,…)
%D英文后缀表示月中的天数(1st,2nd,3rd,…)%d两位数字表示月中的天数(01,02…)
%e数字形式表示月中的天数(1,2,3,4,5…)
%H两位数字表示小数,24小时制(01,02…)%h和%I两位数字表示小时,12小时制(01,02…)
%k数字形式的小时,24小时制(1,2,3)%l数字形式表示小时,12小时制(1,2,3,4…)
%i两位数字表示分钟(00,01,02)%S和%s两位数字表示秒(00,01,02…)
%W一周中的星期名称(Sunday…)%a一周中的星期缩写(Sun.,Mon.,Tues.,…)
%w以数字表示周中的天数(0=Sunday,1=Monday…)
%j以3位数字表示年中的天数(001,002…)%U以数字表示年中的第几周,(1,2,3。。)其中Sunday为周中第一天
%u以数字表示年中的第几周,(1,2,3。。)其中Monday为周中第一天
%T24小时制,%H:%i:%s%r12小时制
%pAM或PM%%表示%

DATE_FORMAT( IF ( HOUR ( createtime )>= 14, 
DATE_ADD(createtime, interval 1 day), date( createtime )), '%Y-%m-%d' ) AS date  
#大于14点作业日期+1

createtime >= DATE_SUB(CURDATE(),INTERVAL 15 day) 
#当前日前往前推

ROUND((UNIX_TIMESTAMP(signtime)-UNIX_TIMESTAMP(deliveryouttime))/60/60/24,1) 
#时间相减

DATE_FORMAT(FROM_UNIXTIME(a.complete_time), '%Y-%m-%d') 
#日期时间显示为数字,转换为年月日时分秒

④流程函数

IF(value,t,f)如果value=true,返回t,否则f
IFNULL(value1,value2)如果value1为空,返回value1,否则value2
CASE WHEN [val1] THEN [res1]...else [default] END如果val1为true,返回res1...否则返回默认值default
CASE [expr] WHEN [val1] THEN [res1]...else [default] END如果expr的值为val1,返回res1...否则返回默认值default

case  when province in('贵州省','云南省') 
then '云贵不转物流' else '可转物流' end as 省份剔除,#条件包含数组之一

case  when goods REGEXP '刀|一大兜|LED|电池' 
then '危险物品不转物流' else '可转物流' end  AS 危险品剔除,#条件符合正则表达式

CASE a.status
 WHEN  1 THEN '待质检'
 WHEN  2 then '已质检'
 ELSE '错误'
 END as 质检状态,#正常条件判定

⑤json函数

【好文分享】MySQL JSON 数据类型解说_mysql json类型_Mr song song的博客-CSDN博客

MySQL数据库基础:JSON函数各类操作一文详解_mysql json_小二上酒8的博客-CSDN博客




#json数组分列
SELECT
 sb.id1,
 st.orderno,
 st.createtime,
 hour(createtime),
 SUBSTRING_INDEX( SUBSTRING_INDEX( st.skuid, ',', sb.id1 + 1 ), ',',- 1 ) +0 AS skuid1,
 SUBSTRING_INDEX( SUBSTRING_INDEX( st.sale, ',', sb.id1 + 1 ), ',',- 1 )+0 AS sale1 
FROM
 (
 SELECT
  orderno,
  createtime,
  replace(replace(replace(JSON_EXTRACT( goods, '$**.sku_id' ),'"',''),'[',''),']','') AS skuid,
  replace(replace(JSON_EXTRACT( goods, '$**.num' ),'[',''),']','') AS sale 
 FROM
  taohuayuan.`orders` 
 WHERE
  createtime > DATE_ADD(CURDATE(), INTERVAL 14 HOUR )
 ) st
 JOIN ( SELECT id - 1 AS id1 FROM taohuayuan.n_expressno ) sb ON sb.id1 < ( LENGTH( st.skuid ) - LENGTH( REPLACE ( st.skuid, ',', '' )) + 1 )


#json数组拼接
SELECT
  x.id,
 x.stock as "库存",
 if(x.unlimited_stock=1,"是","否") as "是否无限库存",
  concat(
  y.NAME,
  ",",
  ifnull(
   IFNULL(
    json_unquote( JSON_EXTRACT( x.attributes, '$[0]."等级"' ) ),
  json_unquote( JSON_EXTRACT( x.attributes, '$[0]."规格"' ) )),json_unquote( JSON_EXTRACT( x.attributes, '$[0]."长度"' ) )),
  ",",
 json_unquote( JSON_EXTRACT( x.attributes, '$[0]."数量"' ) ))  AS name2 
 FROM
  taohuayuan.c_goods x
 JOIN taohuayuan.c_goods y ON x.goods = y.id 
 where x.`status`=0

4、约束

①概述

约束使用作用于表中字段的规则,用于限制存储在表中的数据,目的是为了保证数据的有效完整性。约束是作用在表中字段上,可以创建表或者修改表的时候添加约束。

约束说明keyword
非空约束限制该字段不能为nullNOT NULL
唯一约束该字段所有数据不能重复,是唯一的UNIQUE
主键约束主键是一行数据的唯一标识,要求非空且唯一PRIMARY KEY(auto_increment添加该字段标识自增)
默认约束未指定字段值时,采用默认值DEFAULT
检查约束保证字段满足某一个条件CHECK
外键约束两张表之间建立连接,保证数据一致完整性FOREIGN KEY

例:id int primary key auto_increment comment '主键'

②外键约束

create table 表名(

字段名 数据类型,

...

[constraint] [外键名称] FOREIGN KEY (外键字段名)references 主表 (主表列名)

);--建表时添加外键

alter table 表名 add constraint 外键名称 FOREIGN KEY (外键字段名)references 主表 (主表列名)--修改表外键

alter table 表名 drop FOREIGN KEY 外键名称;--删除外键

alter table 表名 add constraint 外键名称 FOREIGN KEY (外键字段名)references 主表 (主表列名) ON UPDATE CASCADE ON DELETE CASCADE;--更新外键

No ACTION在父表中删除/更新对应记录时,如果该记录有外键则不允许操作。
RESTRICT在父表中删除/更新对应记录时,如果该记录有外键则不允许操作。
CASCADE在父表中删除/更新对应记录时,如果该记录有外键则会同步删除/更新子表中的记录。
SET NULL在父表中删除/更新对应记录时,如果该记录有外键则设置子表外键值为null。
SET DEFAULT父表有变更时,子表将外键值设置成默认值。

5、多表查询

①内连接

select 字段列表
from A表 inner join B表
on 关联条件
where 等其他子句;

或

select 字段列表
from A表 , B表
where 关联条件 and 等其他子句;

②左外连接

#实现查询结果是A
select 字段列表
from A表 left join B表
on 关联条件
where 等其他子句;

#实现A -  A∩B
select 字段列表
from A表 left join B表
on 关联条件
where 从表关联字段 is null and 等其他子句;

③右外连接

#实现查询结果是B
select 字段列表
from A表 right join B表
on 关联条件
where 等其他子句;

#实现B -  A∩B
select 字段列表
from A表 right join B表
on 关联条件
where 从表关联字段 is null and 等其他子句;

④union全外连接

#实现查询结果是A∪B
#用左外的A,union 右外的B
select 字段列表
from A表 left join B表
on 关联条件
where 等其他子句

union 

select 字段列表
from A表 right join B表
on 关联条件
where 等其他子句;



#实现A∪B -  A∩B  或   (A -  A∩B) ∪ (B - A∩B)
#使用左外的 (A -  A∩B)  union 右外的(B - A∩B)
select 字段列表
from A表 left join B表
on 关联条件
where 从表关联字段 is null and 等其他子句

union

select 字段列表
from A表 right join B表
on 关联条件
where 从表关联字段 is null and 等其他子句

⑤自连接

select 字段列表
from 表名 别名1 inner/left/right join 表名 别名2
on 别名1.关联字段 = 别名2的关联字段
where 其他条件

6、子查询

嵌套在另一个查询中的查询,根据位置不同,分为:where型,from型,exists型。注意:不管子查询在哪里,子查询必须使用()括起来。

①where型


①子查询是单值结果,那么可以对其使用(=,>等比较运算符)

②子查询是多值结果,那么可对其使用(【not】in(子查询结果),或 >all(子查询结果),或>=all(子查询结果),<all(子查询结果),<=all(子查询结果),或 >any(子查询结果),或>=any(子查询结果),<any(子查询结果),<=any(子查询结果))
 

查询全公司最高工资的员工信息
select * from 员工表 where 薪资 = (select max(薪资) from 员工表);

select * from 员工表 where 薪资 > all(select salary from 员工表  where 员工姓名 in(...));

②from型

子查询的结果是多行多列的结果,类似于一张表格。

必须给子查询取别名,即临时表名,表的别名不要加“”和空格。

查询每个部门的编号,名称,平均工资
select 部门编号, 部门名称, 平均工资
from 部门表 inner join (select 部门编号,avg(薪资) from 员工表  group by 部门编号) temp
on 部门表.部门编号 = temp.部门编号

③exists型

查询那些有员工的部门
select 部门编号, 部门名称 from 部门表
where exists (select * from 员工表  where 部门表.部门编号 = 员工表.部门编号);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值