(用于数据库访问、处理操作的)sql语法(含左外连接、右外连接)及分类(DQL、DML、DDL、DCL)

数据库操作的sql语法

简介

SQL,全称Structured Query Language,是一种结构化查询语言,是一种 ANSI 的标准计算机语言。SQL用来访问和操作数据库系统,使我们有能力访问数据库、取回和更新数据库中的数据。

待补入SQL语法官方文档,如下图所示
在这里插入图片描述

分类

可以把 SQL 分为两个部分:数据查询语言(DQL)、数据操作语言 (DML) 和数据定义语言 (DDL)。

数据定义语言 (DDL,Data Definition Language)

SQL的DDL部分用来定义数据对象(数据库对象是数据库的组成部分,常见的有:数据库、表、字段、索引、视图、规则Rule、触发器Trigger、存储过程Stored Procedure、用户User),提供了创建、修改或删除数据库、数据表的功能,我们也可以定义索引(键),规定表之间的链接,以及施加表间的约束:

数据库操作

查询所有数据库

show databases;:查询所有数据库,运行效果如下图所示(先从网上借了张图)。
在这里插入图片描述

查询当前数据库

select database();:查询当前数据库,运行如下图所示(先从网上借了张图)。
在这里插入图片描述

创建数据库

create database [ if not exists ] 数据库名 [ default charset 字符集 ] [ collate 排序 规则 ] ;:创建数据

使用数据库默认字符集的简易版只使用CREATE DATABASE 数据库名称即可。

  • create database yun3k;:创建一个名为yun3k的数据库,使用数据库默认的字符集,运行如下图所示(先从网上借了张图)。
    在这里插入图片描述
创建一个指定字符集的数据库

create database yun3k_com default charset utf8mb4;:创建一个名为yun3k_com 并指定字符集为utf8mb4 的数据库,运行如下图所示(先从网上借了张图)。
在这里插入图片描述

在同一个数据库服务器中,不能创建两个名称相同的数据库,否则会报错,如下图所示。

在这里插入图片描述

  • create database if not exists yun3k;可以通过if not exists 参数来解决上面这个问题——数据库不存在,则创建该数据库,如果存在,则不创建。创建一个yun3k数据库,使用数据库默认的字符集,运行如下图所示(先从网上借了张图)。
    在这里插入图片描述
创建表时 设置主键、指定属性非空、指定属性自增

CREATE TABLE student(id integer not null primary key AUTOINCREMENT, name varchar(100)):在创建student表时设置id为非空、自增的integer类型主键——以后在此表中插入数据时便可以不用再输入id,直接INSERT INTO student(name) VALUES ('test1')。但如果你不小心在插入数据时向其中指定了一个比现在已有id大的id,接下来的会从这个大的id继续自增。

修改数据库

ALTER DATABASE:比如,``

删除数据库

DROP DATABASE test;:删除数据库test。
如果删除一个不存在的数据库,将会报错。此时,可以加上参数 if exists 参数来解决上面这个问题,
drop database [ if exists ] 数据库名 ;:如果数据库存在,再执行删除,否则不执行删除。运行如下图所示(先从网上借了张图)。
在这里插入图片描述

切换数据库

use 数据库名;:我们要操作另一个数据库下的表时,就需要通过该指令,切换到对应数据库下,否则是不能操作的。运行如下图所示(先从网上借了张图)。
在这里插入图片描述

数据库中的表操作

查看指定表的状态(当前的表设置、其中数据量、大小等信息)

SHOW TABLE STATUS LIKE 'table_name':查看当前表使用的行格式,其中row_format就代表了当前使用的行记录结构类型,运行如下图所示(先从网上借了张图)。
在这里插入图片描述

查询当前数据库所有表

show tables;:查询当前数据库所有表,运行如下图所示(先从网上借了张图)。
在这里插入图片描述

查询 指定表名 的表结构

desc 表名;:查看【该表名对应的表】中的设置信息,比如【字段,字段的类型、是否可以为NULL、是否存在默认值】等信息,运行如下图所示(先从网上借了张图)。
在这里插入图片描述

查询 指定表 的建表语句

show create table 表名;:查看建表语句,运行如下图所示(先从网上借了张图)。

有一部分参数是我们在创建表的时候并未指定的,这些参数也会查询到,因为这部分是数据库的默认值,如:存储引擎、字符集等。

在这里插入图片描述

创建表 时指定字段、属性等结构

数据库创建的(集合多种要求)示例,如下所示。

 CREATE TABLE hogwarts_user (
 id int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 name varchar(20) DEFAULT NULL,
 age int(10) DEFAULT NULL COMMENT '年龄',
 primary key (id) USING BTREE //以B+树结构的索引来【存储数据or建立关于主键ID的索引?】
 )ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='霍格沃兹学生';

//AUTO_INCREMENT=3 表示第一条记录将从3开始自动递增,而不是默认值1。
//DEFAULT CHARSET=utf8 设置表的默认编码集。自认 DEFAULT 只管到了其紧跟的第一个字段,未将后续的ROW_FORMAT设置为默认
//ROW_FORMAT=DYNAMIC,大体意思是 表中的每条记录是“以行的形式存储。这意味着页中保存着表中一行行的数据。到MySQL 5.1时,InnoDB存储引擎提供了Compact和Redundant两种格式来存放行记录数据”,具体含义详见[此博客](https://blog.csdn.net/festone000/article/details/105906232/)

comment用于添加对应字段的注释。

运行结果如下图所示。
在这里插入图片描述
若向hogwarts_user 表中插入数据insert into hogwarts_user(name, age) values('霍格沃兹测试学院',1),正常情况下不必手动指定id。这是因为在创建hogwarts_user表时,将id设置为了自增AUTO_INCREMENT,所以一般不在插入新数据时设置id,防止自己设定的id与数据库自增的id冲突,交由数据库自增即可。若非要设置id,语法上可行

从其他博客中找到了另一个示例图片,如下所示。
在这里插入图片描述

创建表时可以指定的字段类型
数值类型
类型大小有符号(SIGNED)范围无符号(UNSIGNED)范围描述
TINYINT1 byte(-128, 127)(0, 255)小整数值
SMALLINT2 bytes(-32768, 32767)(0, 65536)大整数值
MEDIUMINT3 bytes(-8388608, 8388607)(0, 16777215)大整数值
INT/INTEGER4 bytes(-2147483648, 2147483647)(0, 4294967295)大整数值
BIGINT8 bytes(-2^63, 2^63 - 1)(0, 2^64 - 1)极大整数值
FLOAT4 bytes(-3.402823466 E+38, 3.402823466351 E+38)0和(1.175494351 E-38, 3.402823466 E + 38)单精度浮点数值
DOUBLE8 bytes(-1.7976931348623157 E+308, 1.7976931348623157 E+308)0和(2.2250738585072014 E-308, 1.7976931348623157 E+308)双精度浮点数值
DECIMAL依赖于M(精度)和D(标度)的值依赖于M(精度)和D(标度)的值小数值(精确定点数)
字符串类型
类型大小描述
CHAR0 - 255 bytes定长字符串(需要指定长度)
VARCHAR0 - 65535 bytes变长字符串(需要指定长度)
TINYBLOB0 -255 bytes不超过255个字符的二进制数据
TINYTEXT0 - 255 bytes短文本字符串
BLOB0 - 65535 bytes二进制形式的长文本数据
TEXT0 - 65535 bytes长文本数据
MEDIUMBLOB0 - 16777215 bytes二进制形式的中等长度文本
MEDIUMTEXT0 - 16777215 bytes中等长度文本数据
LONGBLOB0 - 4294967295 bytes二进制形式的极大文本数据
LONGTEXT0 - 4294967295 bytes极大文本数据

char与varchar都可以描述字符串:

  • char是定长字符串,指定长度多少,就占用多少个字符,和字段值的长度无关;
  • varchar是变长字符串,指定的长度为最大占用长度。
     

相对来说,char的性能会更高些。

####### 字段类型选取示例

  • 案例1:用户名 username长度不定,最长不会超过50
    username varchar(20)
  • 案例2:性别 gender存储值,不是男,就是女
    gender char(1)
  • 案例3:手机号 phone固定长度为11
    phone char(11)
日期时间类型
类型大小范围格式描述
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:01 至 2038-01-19 03:14:07YYYY-MM-DD HH:MM:SS混合日期和时间值,时间戳

####### 字段类型选取示例

  • 案例1:生日字段 birthday
    birthday date
  • 案例2:创建时间 createtime
    createtime datetime
修改表

ALTER TABLE:变更(改变)数据库表

向表中添加字段

ALTER TABLE 表名 ADD 字段名 类型 (长度) [ COMMENT 注释 ] [ 约束 ];:比如,为yun3k_emp表增加一个新的字段”昵称”为nickname,类型为varchar(20),ALTER TABLE yun3k_emp ADD nickname varchar(20) COMMENT '昵称';,运行前后的效果如下图所示(先从网上借了张图)。
在这里插入图片描述

从表中添加字段删除字段

ALTER TABLE 表名 DROP 字段名;:比如,将yun3k_emp表的字段username删除,ALTER TABLE yun3k_emp DROP username;,运行前后的效果如下图所示(先从网上借了张图)。
在这里插入图片描述

修改表中某字段的数据类型

ALTER TABLE 表名 MODIFY 字段名 新数据类型 (长度);:比如,将yun3k_emp表的nickname字段类型改为varchar(100),ALTER TABLE yun3k_emp MODIFY nickname varchar(100);,运行前后的效果如下图所示(先从网上借了张图)。
在这里插入图片描述

修改字段名和字段类型

ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型 (长度) [ COMMENT 注释 ] [ 约束 ];:比如,将yun3k_emp表的nickname字段修改为username,类型为varchar(30),ALTER TABLE yun3k_emp CHANGE nickname username varchar(30) COMMENT '昵称';,运行前后的效果如下图所示(先从网上借了张图)。
在这里插入图片描述

从表中删除某字段

ALTER TABLE 表名 DROP 字段名;:比如,将yun3k_emp表的字段username删除,ALTER TABLE yun3k_emp DROP username;,运行前后的效果如下图所示(先从网上借了张图)。
在这里插入图片描述

修改表名

ALTER TABLE 表名 RENAME TO 新表名;:比如,将yun3k_emp表的表名修改为yun3k_employee,ALTER TABLE yun3k_emp RENAME TO yun3k_employee;,运行前后的效果如下图所示(先从网上借了张图)。
在这里插入图片描述

删除表

DROP TABLE [ IF EXISTS ] 表名;:删除表,比如DROP TABLE student删除student表。可选项 IF EXISTS 代表 只有该表存在时才会删除该表;表名不存在,则不执行删除操作(如果不加该参数项,删除一张不存在的表,执行将会报错)。比如DROP TABLE IF EXISTS yun3k_user;,运行前后的效果如下图所示(先从网上借了张图)。
在这里插入图片描述

删除指定表,并重新创建表

TRUNCATE TABLE 表名;:在删除表的时候,表中的全部数据也都会被删除。所以他的作用是清空表中数据?

创建索引

CREATE INDEX :比如,``。

删除索引

DROP INDEX:比如,``。

创建视图

CREATE VIEW :比如,``。

视图:当对通过视图看到的数据进行修改时,相应的基本表的数据也要发生变化。同时,若基本表的数据发生变化,则这种变化也可以自动地反映到视图中。

数据库操作语言(DML,Data Manipulation Language)

SQL 的 DML 部分用来对数据库表中的记录进行【增、删、改】的操作,提供了新增、更新、删除数据的功能:

  • INSERT INTO - 向数据库表中插入数据
  • UPDATE - 更新数据库表中的数据
  • DELETE - 从数据库表中删除数据

添加数据(INSERT INTO)

给指定字段添加数据

INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...);:比如,向yun3k_employee表中添加一条记录,该记录的全部字段均添加数据,insert into yun3k_employee(id,workno,name,gender,age,idcard,entrydate) values(1,'1','yun3k','男',10,'123456789012345678','2000-01-01');,运行前后的效果如下图所示(先从网上借了张图)。
在这里插入图片描述

给全部字段添加数据(可省略字段名称)

INSERT INTO 表名 VALUES (值1, 值2, ...);:比如,给yun3k_employee表所有的字段添加数据,insert into yun3k_employee values(2,'2','yun3k_com','男',20,'123456789012345679','2020-01-01');,运行前后的效果如下图所示(先从网上借了张图)。
在这里插入图片描述
INSERT INTO 表名 VALUES (值1, 值2, ...), (值1, 值2, ...), (值1, 值2, ...);:自认,添加的值 需要与该表结构中的每个字段逐一对应 缺一不可——包括已设置为自增的id

批量添加记录

INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...), (值1, 值2, ...), (值 1, 值2, ...);:插入数据时,值需要与对应字段的顺序是一一对应的,字符串和日期型数据应该包含在引号中。比如,insert into yun3k_employee values(3,'3','杨过','男',38,'123456789018845670','2005-01-01'), (4,'4','小龙女','女',40,'123477789018845670','2015-01-01');,运行前后的效果如下图所示(先从网上借了张图)。
在这里插入图片描述

修改数据(UPDATE)

UPDATE 表名 SET 字段名1 = 值1 , 字段名2 = 值2 , .... [ WHERE 条件 ];:批量修改【where范围内每条】记录中的多个字段的值,如果没有where条件语句,则修改所有记录。比如,修改yun3k_employee表中id为1的数据,将name修改为黄蓉,gender修改为女。update yun3k_employee set name = '黄蓉', gender = '女' where id = 1;,运行前后的效果如下图所示(先从网上借了张图)。
在这里插入图片描述
再比如,将所有的员工入职日期entrydate修改为2009-01-01,update yun3k_employee set entrydate = '2009-01-01';,运行前后的效果如下图所示(先从网上借了张图)。
在这里插入图片描述

删除数据(DELETE)

DELETE FROM 表名 [ WHERE 条件 ];如果没有where条件语句,则删除整张表中的所有记录。比如,delete from yun3k_employee;,会删除yun3k_employee表中的所有员工,运行前后的效果如下图所示(先从网上借了张图)。
在这里插入图片描述

DELETE 语句不能删除某一个字段的值(可以使用UPDATE,将该字段值置为NULL即可)

数据查询语言 (DQL,Data Query Language)

SQL的DQL部分用来查询数据库中表的记录,提供了查询数据库中数据的功能:

  • SELECTSQL中的列选择器,自认,用于从数据库表中检索、获取数据。
SELECT
  字段列表 
FROM
  表名列表 
WHERE
  条件列表 
GROUP BY 
  分组字段列表 
HAVING
  分组后条件列表 
ORDER BY 
  排序字段列表 
LIMIT
  分页参数

基本查询(不带任何条件)
条件查询(WHERE)
聚合函数(count、max、min、avg、sum)
分组查询(group by)
排序查询(order by)
分页查询(limit)

执行顺序

各字段执行顺序,如下所示。验证的方式是通过在不同位置起别名、用别名,以运行时是否会报错(若是先用别名、再起别名则会提示该别名未定义)为依据来判断,验证过程详见此博客中的第四章节 第9小节
在这里插入图片描述

SQL的查询过程/基本原理

理解SQL查询的过程是进行SQL优化的理论依据,sql的查询过程如下所示。

  • 单表查询:根据WHERE条件过滤表中的记录,形成中间表(这个中间表对用户是不可见的);然后根据【列选择器SELECT】选择相应的列,然后返回最终结果。
  • 两表连接查询:对两表求积(笛卡尔积)并用ON条件和连接连接类型进行过滤,形成中间表;然后根据WHERE条件过滤中间表的记录,并根据【列选择器SELECT】中指定的列返回查询结果。
  • 多表连接查询:先对第一个和第二个表按照两表连接做查询,然后用查询结果和第三个表做连接查询,以此类推,逐个做两表连接查询,直到所有的表都连接完毕为止,最终形成一个中间的结果表,然后根据WHERE条件过滤中间表的记录,并根据【列选择器SELECT】中指定的列返回查询结果。

基本查询(不带任何条件)

SELECT 字段1, 字段2, 字段3 ... FROM 表名; //自认,展示的检索结果会按照字段1、字段2、的顺序展示。

SELECT * FROM 表名; //有博客提到“* 号代表查询所有字段,在实际开发中尽量少用(不直观、影响效率)。”

SELECT 字段1 [ AS 别名1 ] , 字段2 [ AS 别名2 ] ... FROM 表名; //设置别名,展示的检索结果会按照顺序展示别名,示例如下所示。
select workaddress as '工作地址' from yun3k_emp;
select workaddress '工作地址' from yun3k_emp; //as可以省略 

条件查询(WHERE)

  • [WHERE…]//搜索的限制条件

比如where name like '%霍格沃兹%'将name中包含有“霍格沃兹”的结果显示出来。

<>!=:不等于。助记:小于大于=>不等于。
BETWEEN ... AND ...:在某个范围之内(含最小、最大值)。
IN(...)select * from yun3k_emp where age in(18,20,40);等价于select * from yun3k_emp where age = 18 or age = 20 or age =40;
LIKE 占位符:模糊匹配(_匹配单个字符,%匹配任意个字符)。
IS NULL:是NULL;IS NOT NULL,不是NULL。
NOT!:非,不是。
%

示例如下所示:
select * from yun3k_emp where idcard is null;:运行前后的效果如下图所示(先从网上借了张图)。
在这里插入图片描述
select * from yun3k_emp where idcard is not null;:运行前后的效果如下图所示(先从网上借了张图)。
在这里插入图片描述
select * from yun3k_emp where age <> 88;:等价于select * from yun3k_emp where age != 88;,运行前后的效果如下图所示(先从网上借了张图)。
在这里插入图片描述
select * from yun3k_emp where age between 15 and 20;:等价于select * from yun3k_emp where age >= 15 and age <= 20;select * from yun3k_emp where age >= 15 && age <= 20;,运行前后的效果如下图所示(先从网上借了张图)。
在这里插入图片描述
select * from yun3k_emp where age in(18,20,40);:等价于select * from yun3k_emp where age = 18 or age = 20 or age =40;,运行前后的效果如下图所示(先从网上借了张图)。
在这里插入图片描述
select * from yun3k_emp where name like '__';:运行前后的效果如下图所示(先从网上借了张图)。
在这里插入图片描述

聚合函数(count、max、min、avg、sum)

SELECT 聚合函数(字段列表) FROM 表名;NULL值不参与所有聚合函数运算
聚合函数有如下种:

函数功能
count(列名)统计数量
max(列名)最大值
min(列名)最小值
avg(列名)平均值
sum(列名)求和

select count(*) from yun3k_emp;:统计的是记录总条数。
select count(idcard) from yun3k_emp;:统计的是idcard字段不为null的记录条数。
在这里插入图片描述

对于count聚合函数,统计符合条件的总记录数,还可以通过count(数字/字符串)进行统计查询,比如:select count(1) from yun3k_emp;,运行前后的效果如下图所示(先从网上借了张图)。
在这里插入图片描述
select avg(age) from yun3k_emp;
select max(age) from yun3k_emp;
select min(age) from yun3k_emp;
select sum(age) from yun3k_emp where workaddress = '西安';

分组查询(GROUP BY)

分组显示搜索结果
SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组后的过滤条件 ];:按照GROUP BY字段的【每个】【存在】的值,逐一分组。比如GROUP BY字段为gender,where查询后的结果中gender的值有男、女两项,最终分组将分为两组。
select workaddress, gender, count(*) '数量' from yun3k_emp group by gender , workaddress;:运行前后的效果如下图所示(先从网上借了张图)。
在这里插入图片描述

[HAVING…]过滤条件,搭配[GROUP BY…]使用。
where和having区别
  • 执行时机不同:where是【分组之前、进行查询的条件】,不满足where条件的数据不参与分组;having是对【分组之后的结果】进行查询的条件。三者执行顺序:where > 分组 group by(自加,待确认) > 聚合函数 > having。
  • 判断条件不同:where不能对聚合函数进行判断,而having可以。

排序查询(ORDER BY)

SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1 , 字段2 排序方式2;:如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。>例ORDER BY age ASC,name DESC//表示先按照age升序排列,age相同的按照name升序排列

  • ASC:升序(默认值
  • DESC:降序

比如,select * from yun3k_emp order by age asc, entrydate desc;:先根据年龄对公司的员工进行升序排序,在年龄相同的员工中,再按照入职时间进行降序排序,运行前后的效果如下图所示(先从网上借了张图)。
在这里插入图片描述

分页查询(limit)

LIMIT是在按照前面的限制条件进行搜索得到的结果后,定义最终显示给用户是几条数据。比如,LIMIT 0,3表示限制最终显示条数为3。

SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数;:起始索引从0开始,起始索引 = (查询页码 - 1)* 每页显示记录数。如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10,运行前后的效果如下图所示(先从网上借了张图)。

分页查询是数据库的方言,不同的数据库有不同的实现,Mysql中是LIMIT

在这里插入图片描述

select * from yun3k_emp limit 10,10;:查询第2页员工数据,每页展示10条记录((页码 - 1)* 页展示记录数),运行前后的效果如下图所示(先从网上借了张图)。
在这里插入图片描述

联合查询

联合查询(比 依次执行单个查询,自认)的效率更高。
在这里插入图片描述

内连接查询(inner join)

内连接查询(以两圆并集为基准,所以叫“内”查询——在两圆并集之内查询):是将“连接”查询的两表中(都在的记录且) 符合检索条件的内容 一并检索并存入一张“拥有连接查询的两表中所有列的”表 返回给用户,最终拼接的表中因为是将两表中的记录拼接成一条记录,【所以记录中的每个属性不会有(因为内连接查询而产生的)NULL,自认】,如下图所示

在这里插入图片描述

  • 两表内连接查询select * from a_table a inner join b_table b on a.a_id = b.b_id;//将表a_table和b_table分别起别名为a、b,然后使用内连接查询将a_table、b_table表中id相同的数据检索出来,最后a_table、b_table表中id相同的每条数据组成一条数据并存入返回给用户展示的结果集的表中。请注意,内连接查询是使用on,而非where,来连接查询条件
    虽然 内连接查询select * from T1 inner join T2 on T1.userid=T2.userid的执行结果 等同于 select * from T1 ,T2 where T1.userid = T2.userid,但是内连接查询的执行效率却要比普通的select查询高出很多
  • 三表内连接查询SELECT c.* FROM exptable e INNER JOIN event_list v INNER JOIN code_list c ON e.expid=v.expid AND v.eventid=c.actioneditid AND e.expname='20220420120135_科学实验_tongmj4';等同于SELECT c.* FROM exptable e,event_list v,code_list c WHERE e.expid=v.expid AND v.eventid=c.actioneditid AND e.expname='20220420120135_科学实验_tongmj4';
外连接查询(OUTER JOIN)

以左/右一侧的表为基准,将另一侧的表符合检索条件的记录内容 拼接到 基准表中,当另一侧没有符合检索条件的记录内容时,基准表中的另一侧表的对应属性为NULL。

左(外)连接查询(LEFT OUTER JOIN 或 LEFT JOIN)

左(外)连接查询(以两圆并集为基准,所以叫“外”查询——在【两圆并集再加上左外部分】内查询):是将“连接”查询的两表中的【左表T1中的所有行】以及符合检索条件的【右表中的对应行】的内容拼接成一条记录 并存入一张“拥有【左外连接查询的两表中所有列】的”表,最后返回、展示给用户。最终拼接的表中因为是以左表为依据创建、却又拥有左右两表的所有列,所以当右表中没有可以与左表匹配的列时,该条记录的右表对应属性会自动填充(因为左外连接查询而产生的)NULL

在这里插入图片描述
比如,SELECT * FROM a_table a left join b_table b ON a.a_id = b.b_id; //left join是left outer join的简写,全称左(外)连接。返回的检索结果会显示a_table和b_table所有的列,然后左表(a_table a)的内容全部填充并显示出来,右表(b_table b)的内容只会将符合搜索条件(a.a_id = b.b_id)的那条记录的内容填充显示到检索结果中,右表没有匹配内容的部分在检索结果中以NULL来显示——按照搜索条件 能与左表匹配上——的右表记录,检索结果中存在的列但是右表记录不足的地方均为NULL。

右(外)连接查询(RIGHT OUTER JOIN 或 RIGHT JOIN)

右(外)连接查询(以两圆并集为基准,所以叫“外”查询——在【两圆并集再加上右外部分】内查询):是将“连接”查询的两表中的【右表T1中的所有行】以及符合检索条件的【做表中的对应行】的内容拼接成一条记录 并存入一张“拥有【右外连接查询的两表中所有列】的”表,最后返回、展示给用户。最终拼接的表中因为是以右表为依据创建、却又拥有左右两表的所有列,所以当左表中没有可以与右表匹配的列时,该条记录的左表对应属性会自动填充(因为右外连接查询而产生的)NULL

在这里插入图片描述
比如,SELECT * FROM a_table a right outer join b_table b ON a.a_id = b.b_id; //right join是right outer join的简写,全称右(外)连接。其右表(b_table b)的内容会全部显示出来,左表(a_table a)只会显示符合搜索条件(a.a_id = b.b_id)——按照搜索条件 能与右表匹配上——的左表记录,左表记录不足的地方均为NULL。

全(外)连接查询(full outer join,有博客提到MySQL暂不支持)

全(外)连接查询(以两圆并集为基准,所以叫“外”查询——在【两圆并集再加上全外部分】内查询):左右两个表的所有记录(不分左右两个表谁是基准、谁是主表,只要两个表中有一个有这条记录)都展示出来,显示左表T1、右表T2两边中的所有行,即把左联结果表+右联结果表组合在一起,然后过滤掉重复的。
在这里插入图片描述

左(外)连接查询:

 
右(外)连接查询:

 
 
左外连接查询更常用因为开发一般都是拼接sql语句,所以左外连接更符合在上一步检索结果的基础上进一步检索、处理下一张表中能与本检索结果匹配的数据的习惯。左外连接的查询不会使左侧(上一步)的检索结果变少,而是用右侧表中的数据项扩展(当然,select中要检索)现有检索结果的内容
 
还可以三表查询——将满足检索条件的三表多个属性都用select检索出来,SELECT hogwarts_user.name, j_course.id aid,j_course.name aname,j_chapters.name bname FROM j_course left join j_chapters ON j_course.id = j_chapters.course_id left join hogwarts_user ON hogwarts_user.id = j_course.user_id;

多表联合查询

SELECT c.* FROM exptable e INNER JOIN event_list v INNER JOIN code_list c ON e.expid=v.expid AND v.eventid=c.actioneditid AND e.expname='20220420120135_科学实验_tongmj4';
等同于
SELECT c.* FROM exptable e,event_list v,code_list c WHERE e.expid=v.expid AND v.eventid=c.actioneditid AND e.expname='20220420120135_科学实验_tongmj4';

示例

  1. 统计员工表中,年龄小于60岁的,男性员工和女性员工的人数:select gender, count(*) from yun3k_emp where age < 60 group by gender;,运行前后的效果如下图所示(先从网上借了张图)。聚合函数count(*)是对【最终结果——where条件查询和分组查询group by之后的结果】进行统计
    在这里插入图片描述
  2. 统计员工表中,年龄小于60岁的,男性员工和女性员工的人数:select gender, count(*) from yun3k_emp where age < 60 group by gender;,运行前后的效果如下图所示(先从网上借了张图)。
    在这里插入图片描述
  3. 查询性别为男,且年龄为20-40岁(含)以内的前5个员工信息,对查询的结果按年龄升序排序,年龄相同按入职时间升序排序:select * from yun3k_emp where gender = '男' and age between 20 and 40 order by age asc , entrydate asc limit 5;,运行前后的效果如下图所示(先从网上借了张图)。
    在这里插入图片描述
  4. 全(外)连接查询:select * from T1 full outer join T2 on T1.userid=T2.userid
  5. 官方例句:SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id LEFT JOIN table3 ON table2.id = table3.id;

数据控制语言(DCL,Data Control Language)

SQL的DCL部分用来创建数据库用户、控制数据库的访问权限。

  • 在数据库中创建存储过程,归DCL吗?
  • 设置表、存储过程和视图的权限

管理用户

在Mysql中需要通过【用户名@主机名】的方式来唯一标识一个用户。

主机名可以使用%通配

查询用户

select * from mysql.user;:运行前后的效果如下图所示(先从网上借了张图)。其中

  • Host代表当前访问的主机,如果为localhost,仅代表只能够在当前本机访问,是不可以远程访问的
  • User代表访问该数据库的用户名。在Mysql中需要通过Host和User来唯一标识一个用户。
    在这里插入图片描述
创建用户

CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';:比如,创建一个名为"yun3k"的用户,设置密码为”123456”,并且只能通过本地访问该数据库CREATE USER 'yun3k'@'localhost' IDENTIFIED BY '123456';,运行前后的效果如下图所示(先从网上借了张图)。
在这里插入图片描述
创建一个名为”yun3k_com”、可以在任意主机访问该数据库的用户:CREATE USER 'yun3k_com'@'%' IDENTIFIED BY '123456';,运行前后的效果如下图所示(先从网上借了张图)。
在这里插入图片描述

修改用户密码

ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码';:比如,ALTER USER 'yun3k'@'localhost' IDENTIFIED WITH mysql_native_password BY '654321';,运行前后的效果如下图所示(先从网上借了张图)。
在这里插入图片描述

删除用户

DROP USER '用户名'@'主机名' ;:比如,DROP USER 'yun3k'@'localhost';,运行前后的效果如下图所示(先从网上借了张图)。
在这里插入图片描述

权限控制

权限说明
ALL,ALL PRIVILEGES所有权限
SELECT查询数据
INSERT插入数据
UPDATE修改数据
DELETE删除数据
ALTER修改表
DROP删除数据库/表
CREATE创建数据库/表

多个权限之间,使用逗号分隔
授权时,数据库名和表名可以使用*进行通配,代表所有

查询权限

SHOW GRANTS FOR '用户名'@'主机名' ;:如前所述,在Mysql中需要通过用户名@主机名的方式来唯一标识一个用户,运行前后的效果如下图所示(先从网上借了张图)。下图中的结果是当前用户是没有任何表的权限的示例,表头第二行的信息是指“授权 (数据库的)使用 针对任意*.*数据库 给 某某用户”——即该用户在哪些数据库表中拥有哪些权限。
在这里插入图片描述
有权限的用户 显示的结果,如下图所示。
在这里插入图片描述

授予权限

GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';:比如,授予【'yun3k_com'@'%'用户yun3k数据库所有表】的所有操作权限,grant all on yun3k.* to 'yun3k_com'@'%';,运行效果如下图所示(先从网上借了张图)。
在这里插入图片描述

撤销权限

REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';:比如,撤销’yun3k_com’@'%'用户的yun3k数据库的所有权限,revoke all on yun3k.* from 'yun3k_com'@'%';,运行效果如下图所示(先从网上借了张图)。
在这里插入图片描述

下面内容待合并整入上面章节

语法(本部分看编辑界面,内容、格式待进一步整理)

SQL语法详见MySQL官方文档

补入此文章中的全部内容
补入此博客有每个词的讲解和运行结果

查询操作

select用于设置查询操作结束后,结果应包含有哪些属性以及这些属性间的先后顺序。

  • SELECT [ ALL | DISTINCT | DISTINCTROW | TOP ]

ALL:是默认选项,展示全部搜索结果;
DISTINCT:如果多条记录的该字段值重复,只返回其中一个;
DISTINCTROW:如果有重复的记录则只返回一条;
TOP:要配合显示的百分比数来表示最终的显示给用户的搜索结果的前百分之几,比如select TOP 5 percent;

  • {|talbe.|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}
    用于定义select从表中选取哪些数据,每个选取的数据是否取别名,选取的结果被存储在一个结果表中(称为结果集)。

比如 SELECT emp_name, DATE_FORMAT(hire_date, '%M %e, %Y') FROM employees;,其运行结果为
在这里插入图片描述
使用别名后,列名变为别名,比如SELECT emp_name, DATE_FORMAT(hire_date, '%M %e, %Y') AS hire_date FROM employees;,其运行结果为
在这里插入图片描述
当给多个变量起别名时,中间要用分割,如下图所示。
在这里插入图片描述

  • FROM tableexpression[,…][IN externaldatabase] //内、外连接查询

多表查询:
SELECT c.code,s.sendtime FROM exptable e ,event_list v , code_list c ,send_list s where e.expid=v.expid and v.eventid=c.actioneditid and c.actioneditid=s.actioneditid and c.instructionid=s.instructionid and c.injectid=s.injectid and e.expname='20220420120135_科学实验_tongmj6':四表起别名关联查询

select * from send_list s,code_list c ,(select max(sendtime) as maxtime from send_list t where t.instructionid='" + instructionId + "') m where c.instructionid = s.instructionid and s.instructionid= '要查询的指定值' and s.sendtime = m.maxtime以内层select结果集作为一张表继续与其余现有表联合查询。

关于上面select的模板说明

用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。
1 FROM子句
FROM子句指定了SELECT语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。
例:下列SQL语句返回所有有定单的客户:
SELECT OrderID,Customer.customerID
FROM Orders Customers
WHERE Orders.CustomerID=Customers.CustomeersID

2 ALL、DISTINCT、DISTINCTROW、TOP谓词
(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。
例:SELECT ALL FirstName,LastName
FROM Employees
(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。
(3) DISTINCTROW 如果有重复的记录,只返回一个
(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)
例:返回5%定货额最大的定单
SELECT TOP 5 PERCENT*
FROM [ Order Details]
ORDER BY UnitPriceQuantity(1-Discount) DESC

3 用 AS 子句为字段取别名
如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
例:返回FirstName字段取别名为NickName
SELECT FirstName AS NickName ,LastName ,City
FROM Employees
例:返回新的一列显示库存价值
SELECT ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock
FROM Products

二 .WHERE 子句指定查询条件

1 比较运算符
比较运算符 含义
= 等于

大于
< 小于
= 大于等于
<= 小于等于
<> 不等于
!> 不大于
!< 不小于
例:返回96年1月的定单
SELECT OrderID, CustomerID, OrderDate
FROM Orders
WHERE OrderDate>#1/1/96# AND OrderDate<#1/30/96#
注意:
Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。
例:
WHERE OrderDate>#96-1-1#
也可以表示为:
WHERE OrderDate>Datevalue(‘1/1/96’)
使用 NOT 表达式求反。
例:查看96年1月1日以后的定单
WHERE Not OrderDate<=#1/1/96#
2 范围(BETWEEN 和 NOT BETWEEN)
BETWEEN …AND…运算符指定了要搜索的一个闭区间。
例:返回96年1月到96年2月的定单。
WHERE OrderDate Between #1/1/96# And #2/1/96#
3 列表(IN ,NOT IN)
IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。
例:要找出住在 London、Paris或Berlin的所有客户
SELECT CustomerID, CompanyName, ContactName, City
FROM Customers
WHERE City In(‘London’,’ Paris’,’ Berlin’)
4 模式匹配(LIKE)
LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。
LIKE运算符里使用的通配符
通配符 含义
? 任何一个单一的字符

  • 任意长度的字符

sql选取某一属性(列)里最大值

SELECT MAX(column_name) FROM table_name,详见W3C网站此页

sql查询记录的条数

SQL COUNT(column_name) 语法,即查询某一列属性的条数,详见W3C网站此页

插入操作

插入单条数据

insert into 表名(字段名1,字段名2,....)values (值a1,值a2, .....);:插入一条数据。

插入多条数据

insert into 表名(字段名1,字段名2,....)values (值a1,值a2, .....), (值b1,值b2, .....),..... ;:插入多条数据。

插入子查询的结果

将子查询语句select的结果插入表中,如下图所示。请注意,此时select的结果要与被插入表的结构一一对应send_list(actioneditid,instructionid,injectid,sendstatus,sendtime),若个数不一致会报错

insert into  send_list(actioneditid,instructionid,injectid,sendstatus,sendtime)
select actioneditid,instructionid,injectid,1,1 from code_list WHERE injectid = '1679885340000000005';

插入固定值数据

insert into 表名 set 字段名1=值1,字段名2=值2, ..... ;:全部字段?
insert into 表名(字段名1,字段名2,....)values (值a1,值a2, .....);:指定部分字段赋值

删除操作

真删除

delete from 表名 where 字段名1 = 字段值1:删除一条数据
DELETE FROM users WHERE id IN (1, 2, 3, 4);:批量删除多条数据
delete from 表名:删除该表中的所有数据
mysql数据库中的主键id设置为自增后,不会因为之前一条的数据被删除,而使后面新增的数据id为之前的被删除数据的id,而是继续从当前最新创建的id继续自增

假删除

update 表名 set 字段名1 = 字段值1 where 字段名2 = 字段值2:将要假删除的数据的删除标识值改为已删除即可。

更改操作

update 表名 set 字段名1 = 字段值1 where 字段名2 = 字段值2:修改一条数据的一个属性。
update 表名 set 字段名1 = 字段值1,字段名2 = 字段值2 where 字段名3 = 字段值3:修改一条数据的两个属性。
update 表名 set 字段名1 = 字段值1:修改表中的所有数据,如下图所示。
在这里插入图片描述

创表操作

详见MySQL说明文档
格式一:

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
(create_definition,…)
[table_options]
[partition_options]

格式二:

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    [(create_definition,...)][^1]
    [table_options]
    [partition_options]
    [IGNORE | REPLACE]
    [AS] query_expression

格式三:

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    { LIKE old_tbl_name | (LIKE old_tbl_name) }

此处先给出一个示例,如下所示。

 CREATE TABLE hogwarts_user (id int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',name varchar(20) DEFAULT NULL,age int(10) DEFAULT NULL COMMENT '年龄',primary key (id) USING BTREE)ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='霍格沃兹学生';

视图操作

  • 创建视图:CREATE VIEW ExptableAndEvent AS SELECT e.expid,e.expname,e.type,e.savetime,ev.expid,ev.eventid,ev.eventorder,ev.inentifydomain,ev.subsystemcode,ev.commandlenght,ev.timetype,ev.timetypeaction,ev.actionname,ev.actioncode,ev.benchmarktimetype,ev.dategap FROM exptable e,event_list ev;
    上述示例是多表查询创建视图
  • 查询视图:SELECT expid,expname,type,savetime,eventid,eventorder,inentifydomain,subsystemcode,commandlenght,timetype,timetypeaction,actionname,actioncode,benchmarktimetype,dategap FROM ExptableAndEvent;
  • 删除视图:DROP VIEW ExptableAndEvent;

索引操作

待验证此博客

事务操作

参考此博客中sql语句的内容

开启事务【START TRANSACTION / BEGIN】

提交事务【COMMIT】

回滚事务【ROLLBACK】

ROLLBACK回滚示例

运行结果为数据表未变化

START TRANSACTION;
INSERT INTO hogwarts_user(`name`,age) VALUES ('测试回滚1',1),('测试回滚2',2),('测试回滚3',3);
ROLLBACK;

综合示例

//第一部分:表示开启事务,我看网上还有说是`START TRANSACTION READ WRITE;`,但是在Navicat中使用时报错,故仍使用begin
	//方式一:开启事务
BEGIN;//亲测有效
	//方式二:开启事务
START TRANSACTION;//亲测有效
-- START TRANSACTION READ WRITE;//在Navicat使用时报错

	//要进行事务操作的sql语句们
INSERT INTO send_list ( actioneditid, instructionid, injectid, sendstatus, sendtime )
VALUES ( 1, 1, 1, 1, 1 ),( 2, 2, 2, 2, 2 );
DELETE FROM send_list where actioneditid IN (1,2);

//第三部分:表示事务结尾是要提交还是回滚
	//提交,即事务中的sql语句生效,亲测可以正常运行,但是不确认是否是事务
-- COMMIT;
	//回滚,即事务中的sql语句全部取消、数据库还原到这些sql语句执行前的状态,亲测有效
ROLLBACK;

通配符

  • %:代表零个或多个字符。
  • _:仅替代一个字符。
  • [charlist]:字符列中的任何单一字符。
  • [^charlist]或者[!charlist]:不在字符列中的任何单一字符。

0~9之间的单一数字

[字符列表] 在字符列表里的任一值
[!字符列表] 不在字符列表里的任一值

  • 指定字符范围,两边的值分别为其上下限
    例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户
    SELECT CustomerID ,CompanyName,City,Phone
    FROM Customers
    WHERE Phone Like ‘(171)555-####’
    LIKE运算符的一些样式及含义
    样式 含义 不符合
    LIKE ‘A*’ A后跟任意长度的字符 Bc,c255
    LIKE’5
    ’ 55 555
    LIKE’5?5’ 5与5之间有任意一个字符 55,5wer5
    LIKE’5##5’ 5235,5005 5kd5,5346
    LIKE’[a-z]’ a-z间的任意一个字符 5,%
    LIKE’[!0-9]’ 非0-9间的任意一个字符 0,1
    LIKE’[[]’ 1,

    三 .用ORDER BY子句排序结果
    ORDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。
    ORDER子句中定义了多个字段,则按照字段的先后顺序排序。
    例:
    SELECT ProductName,UnitPrice, UnitInStock
    FROM Products
    ORDER BY UnitInStock DESC , UnitPrice DESC, ProductName
    ORDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。
    例:下面的语句产生与上列相同的效果。
    SELECT ProductName,UnitPrice, UnitInStock
    FROM Products
    ORDER BY 1 DESC , 2 DESC,3
    四 .运用连接关系实现多表查询
    例:找出同一个城市中供应商和客户的名字
    SELECT Customers.CompanyName, Suppliers.ComPany.Name
    FROM Customers, Suppliers
    WHERE Customers.City=Suppliers.City
    例:找出产品库存量大于同一种产品的定单的数量的产品和定单
    SELECT ProductName,OrderID, UnitInStock, Quantity
    FROM Products, [Order Deails]
    WHERE Product.productID=[Order Details].ProductID
    AND UnitsInStock>Quantity
    另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN
    语法:
    FROM table1 INNER JOIN table2
    ON table1.field1 comparision table2.field2
    其中comparision 就是前面WHERE子句用到的比较运算符。
    SELECT FirstName,lastName,OrderID,CustomerID,OrderDate
    FROM Employees
    INNER JOIN Orders ON Employees.EmployeeID=Orders.EmployeeID
    注意:
    INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。
    在一个JOIN语句中连接多个ON子句
    语法:
    SELECT fields
    FROM table1 INNER JOIN table2
    ON table1.field1 compopr table2.field1 AND
    ON table1.field2 compopr table2.field2 OR
    ON table1.field3 compopr table2.field3
    也可以
    SELECT fields
    FROM table1 INNER JOIN
    (table2 INNER JOIN [( ]table3
    [INNER JOER] [( ]tablex[INNER JOIN]
    ON table1.field1 compopr table2.field1
    ON table1.field2 compopr table2.field2
    ON table1.field3 compopr table2.field3
    外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。
    FROM table [LEFT|RIGHT]JOIN table2
    ON table1.field1comparision table.field2
    用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据
    例:不管有没有定货量,返回所有商品
    SELECT ProductName ,OrderID
    FROM Products
    LEFT JOIN Orders ON Products.PrductsID=Orders.ProductID
    右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。
    例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。
    空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。
    SELECT *
    FROM talbe1
    LEFT JOIN table2 ON table1.a=table2.c
    1 连接查询中使用Iif函数实现以0值显示空值
    Iif表达式: Iif(IsNull(Amount,0,Amout)
    例:无论定货大于或小于¥50,都要返回一个标志。
    Iif([Amount]>50,?Big order?,?Small order?)
    五. 分组和总结查询结果
    在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。
    GROUP BY 子句的语法
    SELECT fidldlist
    FROM table
    WHERE criteria
    [GROUP BY groupfieldlist [HAVING groupcriteria]]
    注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。
    GROUP BY字段中的Null值以备分组但是不能被省略。
    在任何SQL合计函数中不计算Null值。
    GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。
    例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。
    SELECT Title ,Count(Title) as Total
    FROM Employees
    WHERE Region = ‘WA’
    GROUP BY Title
    HAVING Count(Title)>1
    JET SQL 中的聚积函数
    聚集函数 意义
    SUM ( ) 求和
    AVG ( ) 平均值
    COUNT ( ) 表达式中记录的数目
    COUNT (* ) 计算记录的数目
    MAX 最大值
    MIN 最小值
    VAR 方差
    STDEV 标准误差
    FIRST 第一个值
    LAST 最后一个值
    六. 用Parameters声明创建参数查询
    Parameters声明的语法:
    PARAMETERS name datatype[,name datatype[, …]]
    其中name 是参数的标志符,可以通过标志符引用参数.
    Datatype说明参数的数据类型.
    使用时要把PARAMETERS 声明置于任何其他语句之前.
    例:
    PARAMETERS[Low price] Currency,[Beginning date]datatime
    SELECT OrderID ,OrderAmount
    FROM Orders
    WHERE OrderAMount>[low price]
    AND OrderDate>=[Beginning date]
    七. 功能查询
    所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.
    1 更新查询
    UPDATE子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.
    更新查询语法:
    UPDATE 表名
    SET 新值
    WHERE 准则
    例:英国客户的定货量增加5%,货运量增加3%
    UPDATE OEDERS
    SET OrderAmount = OrderAmount 1.1
    Freight = Freight
    1.03
    WHERE ShipCountry = ‘UK’
    2 删除查询
    DELETE子句可以使用户删除大量的过时的或冗于的数据.
    注:删除查询的对象是整个记录.
    DELETE子句的语法:
    DELETE [表名.*]
    FROM 来源表
    WHERE 准则
    例: 要删除所有94年前的定单
    DELETE *
    FROM Orders
    WHERE OrderData<#94-1-1#
    3 追加查询
    INSERT子句可以将一个或一组记录追加到一个或多个表的尾部.
    INTO 子句指定接受新记录的表
    valueS 关键字指定新记录所包含的数据值.
    INSERT 子句的语法:
    INSETR INTO 目的表或查询(字段1,字段2,…)
    valueS(数值1,数值2,…)
    例:增加一个客户
    INSERT INTO Employees(FirstName,LastName,title)
    valueS(‘Harry’,’Washington’,’Trainee’)
    4 生成表查询
    可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.
    SELECT INTO子句用来创建生成表查询语法:
    SELECT 字段1,字段2,…
    INTO 新表[IN 外部数据库]
    FROM 来源数据库
    WHERE 准则
    例:为定单制作一个存档备份
    SELECT *
    INTO OrdersArchive
    FROM Orders
    八. 联合查询
    UNION运算可以把多个查询的结果合并到一个结果集里显示.
    UNION运算的一般语法:
    [表]查询1 UNION [ALL]查询2 UNION …
    例:返回巴西所有供给商和客户的名字和城市
    SELECT CompanyName,City
    FROM Suppliers
    WHERE Country = ‘Brazil’
    UNION
    SELECT CompanyName,City
    FROM Customers
    WHERE Country = ‘Brazil’
    注:
    缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
    UNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.
    每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.
    九. 交叉查询
    交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.
    Microsoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:
    TRANSFORM aggfunction
    SELECT 语句
    GROUP BY 子句
    PIVOT pivotfield[IN(value1 [,value2[,…]]) ]
    Aggfounction指SQL聚积函数,
    SELECT语句选择作为标题的的字段,
    GROUP BY 分组
    说明:
    Pivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.
    value代表创建列标题的固定值.
    例:显示在1996年里每一季度每一位员工所接的定单的数目:
    TRANSFORM Count(OrderID)
    SELECT FirstName&’’&LastName AS FullName
    FROM Employees INNER JOIN Orders
    ON Employees.EmployeeID = Orders.EmployeeID
    WHERE DatePart(“yyyy”,OrderDate)= ‘1996’
    GROUP BY FirstName&’’&LastName
    ORDER BY FirstName&’’&LastName
    POVOT DatePart(“q”,OrderDate)&’季度’
    十 .子查询
    子查询可以理解为 套查询.子查询是一个SELECT语句.
    1 表达式的值与子查询返回的单一值做比较
    语法:
    表达式 comparision ANY|ALL|SOME
    说明:
    ANY和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既WHERE子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生True结果,才回返回True值.
    例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品
    SELECT * FROM Products
    WHERE UnitPrice>ANY
    (SELECT UnitPrice FROM[Order Details] WHERE Discount>0.25)

2 检查表达式的值是否匹配子查询返回的一组值的某个值
语法:
[NOT]IN(子查询)
例:返回库存价值大于等于1000的产品.
SELECT ProductName FROM Products
WHERE ProductID IN
(SELECT PrdoctID FROM [Order DEtails]
WHERE UnitPrice*Quantity>= 1000)

3检测子查询是否返回任何记录
语法:
[NOT]EXISTS (子查询)
例:用EXISTS检索英国的客户
SELECT ComPanyName,ContactName
FROM Orders
WHERE EXISTS
(SELECT *
FROM Customers
WHERE Country = ‘UK’ AND
Customers.CustomerID= Orders.CustomerID)

查询

查询数据库的数据表有无数据:

注意事项

补入这篇博客

JEECG中的使用——sql增强

insert into 表名 values(‘#{UUID}’,‘#{id}’,0,0,0);
其中的变量,#{UUID} #{id}相当于把数据填充进去

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值