mysql语法之DQL操作详解

目录
  • 简单查询
  • 运算符查询
  • 排序查询
  • 聚合查询
  • 分组查询
  • 分页查询
  • 一张表查询结果插入到另一张表
  • SQL语句分析
  • DQL小练习1
  • DQL小练习2
  • 正则表达式
  • 总结

DQL(Data Query Language),数据查询语言,主要是用来查询数据的,这也是SQL中最重要的部分!

简单查询

#DQL操作之基本查询

#创建数据库
CREATE DATABASE IF NOT EXISTS mydb2;
#使用数据库
USE mydb2;
#创建表
CREATE TABLE IF NOT EXISTS product(
		pid int PRIMARY KEY auto_increment,
		pname varchar(20) not null,
		price double,
		category_id varchar(20)
);
#添加数据 可以简写 但建议平常养成良好代码规范
INSERT INTO product(pid,pname,price,category_id)
						values(null,'海尔洗衣机',5000,'c001'),
									(null,'海尔洗衣机',3000,'c001'),
									(null,'格力空调',5000,'c001'),
									(null,'九阳电饭煲',5000,'c001');

#查询所有商品
SELECT * FROM product;
SELECT pid,pname,price,category_id FROM product;

#查询商品名和价格
SELECT pname,price FROM product;

#别名查询 关键字是as 可省略
#表别名
SELECT * FROM product as p;
#列别名
SELECT pname as '商品名',price as '商品价格' FROM product;

#去掉重复值
#去除某一列重复的
SELECT DISTINCT price FROM product;
#去除某一行重复的
SELECT DISTINCT * FROM product;

#运算查询(查询结果是表达式):可以将结果进行取别名
SELECT pname,price+10 as now_price FROM product;

运算符查询

#运算符 (在哪查(表) 要什么(字段) 什么条件(条件))

#算术运算符
SELECT pname,price+10 as now_price FROM product;
SELECT pname,price*1.2 as now_price FROM product;

#比较运算符
#逻辑运算符

SELECT * FROM product where pname = '海尔洗衣机';
SELECT * FROM product where price <> 3000;
SELECT * FROM product where price BETWEEN 3000 AND 5000;
SELECT * FROM product where price IN(3000,4000);

# %可以匹配任意字符 _可以匹配单个字符

SELECT * FROM product where pname LIKE '%洗衣机';
SELECT * FROM product where pname LIKE '__洗衣机%';

#NULL判断
SELECT * FROM product where category_id IS NOT NULL;

#使用Least函数来求最小值 如果有一个是NULL 则不会进行比较 直接结果为NULL
SELECT LEAST(10,20,3); 

#使用Greatest函数来求最大值
SELECT GREATEST(28,35,21);

排序查询

#排序查询 对读取的数据进行排序 多个字段时按照从前往后依次排序 默认asc升序 desc是降序
SELECT * FROM product ORDER BY price;
SELECT * FROM product ORDER BY price DESC;

SELECT * FROM product ORDER BY price DESC,pname ASC;

#去重排序
SELECT DISTINCT price FROM product ORDER BY price;

聚合查询

#聚合查询 聚合函数 以前的查询是以行为单位 聚合查询是以列为单位的 

#常见聚合查询函数是对NULL视而不见的 count(*) count(1) count(主键) 三个一样

#一般聚合函数和分组一起用

#查询商品的总条目
#pid字段不为空的(建议主键)
SELECT COUNT(pid) FROM product;
#行不为空的
SELECT COUNT(*) FROM product;

#查询价格大于3000的商品总条目 先查大于3000的 再算总条目
SELECT COUNT(pid) FROM product WHERE price >3000;

#查询价格总和
SELECT SUM(price) FROM product;

#聚合查询对NULL处理
#如果是整数的话可以在定义的时候设置default 0

分组查询

#分组查询 group by(group by后面的字段相同的放在一组)
#首先是根据group by来进行分组 然后再对每组进行聚合查询 最后进行select得出结果
#分组之后 select后面只能写分组字段和聚合函数

#统计各个分类商品的个数
SELECT category_id,count(pid) FROM product GROUP BY category_id;

#分组之后的条件筛选 having   from->where->group by->select->having
#where筛选from子句产生的行 group by筛选where子句 having用来筛选group by产生的结果

#统计各个分类商品的个数 并且筛选出大于等于3的
SELECT category_id,count(pid) FROM product GROUP BY category_id HAVING count(pid)>=3;

分页查询

#分页查询 limit 用于商品数量太大 故进行分页显示 下标为0奥
SELECT * FROM product LIMIT 5;
SELECT * FROM product LIMIT 3,2;

一张表查询结果插入到另一张表

#insert into select 将一张表的数据导入另一场存在的表中

CREATE TABLE product2(
	pname VARCHAR(20),
	price DOUBLE
);

INSERT INTO product2(pname,price) SELECT pname,price FROM product where category_id = 'c001';

CREATE TABLE product3(
	category_id VARCHAR(20),
	product_count int
);

INSERT INTO product3 SELECT category_id,count(*) FROM product GROUP BY category_id;
可以先根据表结构分析要进行的操作是什么,对应的操作顺序是什么,先干什么,再干什么,整个分析来后,再去写对应的SQL语言。虽然有很多简写方法,但是先建议写基础的,写熟悉了后再简化,基础阶段打基础为主。

SQL语句分析

#SQL书写顺序(基本不以人的意志为转移)

SELECT category_id,count(pid) as cnt
	FROM product
		WHERE price >1000
			GROUP BY category_id
				HAVING cnt > 3
					ORDER BY cnt
						LIMIT 1;

#SQL执行顺序(帮助分析)

from->where->group by->count->having->order by->limit

DQL小练习1

基础一定打牢固,重要不在于答案,在于分析答案的过程!

#DQL操作练习

USE mydb2;

CREATE TABLE IF NOT EXISTS student(
	id INT,
	name VARCHAR(20),
	gender VARCHAR(20),
	chinese INT,
	english INT,
	math INT
);
#最后一个字段定义后不要加,并且字段名和类型之间是用空格隔开

INSERT INTO student(id,name,gender,chinese,english,math)
						VALUES(1,'张明','男',89,78,90),
									(2,'李进','男',67,53,95),
									(3,'王五','女',87,78,77),
									(4,'李一','女',88,98,92),
									(5,'李财','男',82,84,67),
									(6,'张宝','男',55,85,45),
									(7,'黄蓉','女',75,65,30),
									(7,'黄蓉','女',75,65,30);

#查询每个学生的总分(聚合查询是一整列运算 但是此处的是不同列相加)
SELECT name,(chinese+english+math) as total_score FROM student;

#我一开始还想的group by id再进行相加 但是仔细想想select时候
#本来就是一行一行的 所以这些字段就相当于在某一行的基础上的操作

#查询总分大于200的同学

#此处WHERE (chinese+english+math)>200不能写成total_score>200 因为想想SQL执行顺序 当where的时候都没有前面的select执行
SELECT *,(chinese+english+math) as total_score FROM student WHERE (chinese+english+math)>200;

#查询数学分数不为89 90 91的同学 in()表示是这几个数其中的某一个 以下两个均可
SELECT name,math FROM student WHERE math not in(89,90,91);
SELECT name,math FROM student WHERE NOT(math in(89,90,91));

#对姓李的同学总分降序排序 先是找到姓李的同学 再求总分并且降序排序
SELECT * FROM student WHERE name LIKE '李%' ORDER BY (chinese+english+math) DESC;

#查询男生女生各有多少人 并且将人数降序排序输出
#按照顺序写的时候 select不知道写什么可以先写* 后面写了后再改前面的
SELECT gender,count(id) FROM student GROUP BY gender ORDER BY count(id);

#查询男生女生各有多少人 并且将人数降序排序输出 并选择总数大于4的输出
#此处需要明白 这个总数大于4在分组后就已经开始筛选了 筛选后再排序!!
#先根据要求分析要进行什么操作 再看这些操作的依次顺序 最后再进行写SQL语言 一步一查
SELECT gender,count(id) FROM student GROUP BY gender HAVING count(id) > 4 ORDER BY count(id);

DQL小练习2

#DQL操作练习

USE mydb2;

CREATE TABLE IF NOT EXISTS emp(
	empno INT,    #员工编号
	ename VARCHAR(50),  #员工姓名
	job VARCHAR(50),		#工作名字
	mgr INT,		#上级领导编号
	hiredate date,  #入职日期
	sal INT,  #薪资
	comm INT,  #奖金
	deptno INT #部门编号
);

INSERT INTO emp VALUES(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20),
											(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30),
											(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30),
											(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20),
											(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30),
											(7698,'BLAKE','MANAGER',7839,'1981-06-09',2450,NULL,10);

#查询姓名第二个字母不是A且薪水大于1000的员工信息 按年薪降序排列 第二个字母不是A就是not like实现
#ifnull(sal,0) 如果sal为NULL则为0 否则是原来的数值
SELECT * FROM emp WHERE ename NOT LIKE '_A%' && sal >1000 ORDER BY 12*sal+ifnull(comm,0) DESC;

#求每一个部门的平均薪水 每一个部门 那就是分组查询 平均想到聚合函数
SELECT deptno,AVG(sal) FROM emp GROUP BY deptno;

#求每一个部门的最高薪水
SELECT deptno,max(sal) FROM emp GROUP BY deptno;

#求每一个部门每一个岗位最高薪水 每一个部门 每一个岗位 分组字段是两个 不是两次分组两个GROUP BY
SELECT deptno,job,max(sal) FROM emp GROUP BY deptno,job;

#看到最高 最低 平均就要想到聚合函数(对列操作)一般是一个数 加上分组其个数就是分组数

#查询最高和最低薪资的差距
SELECT max(sal) - min(sal) FROM emp;

正则表达式

正则表达式是一套描述字符匹配的规则,MYSQL使用REGEXP关键字支持正则表达式进行字符串匹配。

符号 含义
^ 匹配输入字符串的开始位置
$ 匹配输入字符串的结束位置
. 匹配除’\n’之外的任何单个字符
[…] 匹配所包含的任意一个字符
[^…] 匹配未包含的任意字符
p1|p2|p3 匹配p1或者p2或者p3
* 匹配前面的子表达式0次或多次
+ 匹配前面的子表达式1次或多次
? 匹配前面的子表达式1次或0次
{n} 匹配确定的n次
{n,} 匹配最少n次
{n,m} 匹配最少n次最多m次
#正则表达式查询(千万不能死记 用到什么回来查什么)

SELECT 'abc' REGEXP '^a';
SELECT 'abc' REGEXP 'c$';

#REGEXP 表达式 就是正则表达式 即需要匹配的字符串格式
SELECT * FROM product WHERE pname REGEXP '^海';

#.是任意除'\n'外的单个字符 '.b'表示任意字符+b
SELECT 'abc' REGEXP '.b';

#表示是否存在字符在前面出现了
SELECT 'abc' REGEXP '[xaz]';

#表示是否存在任意字符都没有在前面出现
SELECT 'abc' REGEXP '[^abc]';

#一般是自动匹配*|+前面一个字符 想要多个就打括号

#a*表示匹配0个或者多个a包括空字符串
SELECT 'stab' REGEXP '.ta*b';
SELECT 'stb' REGEXP '.ta*b';

#a+表示匹配1个或者多个a不包括空字符串
SELECT 'stab' REGEXP '.ta+b';
SELECT 'stb' REGEXP '.ta+b';

#a?表示匹配0个或者1个a包括空字符串
SELECT 'stab' REGEXP '.ta?b';
SELECT 'staab' REGEXP '.ta?b';

SELECT 'a' REGEXP 'a|b';
SELECT 'c' REGEXP '^(a|b)';

SELECT 'auuuuc' REGEXP 'au{4}c';

SELECT 'auuuuc' REGEXP 'au{4,}c';

SELECT 'auuuuc' REGEXP 'au{3,5}c';
到这里基础查询就结束啦,明天开始多表查询,由于都是我在navicat写的,然后再来写的csdn,故大部分我在学习中的注释也都写啦,重在分析过程!!!

总结

到此这篇关于mysql语法之DQL操作详解的文章就介绍到这了,更多相关mysql DQL语法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MySQL 使用DQL命令查询数据的实现方法

    本篇文章博主将带大家一起学习MySQL中常用的数据查询语言. DQL(Data Query Language 数据查询语言) SELECT 语法 SELECT [ALL | DISTINCT] { * | table.* | [table.field1 [as alias1][,table.field2] [as alias2][,...]]} FROM table_name [as table_alias] [left | out | inner join table_name2] #联合查询

  • Mysql学习之数据库检索语句DQL大全小白篇

    目录 1.简单检索数据 2.排序检索数据 2.1.基本语法 2.2.指定排序方向 3.检索过滤数据 3.1使用简单where子句 3.2组合where子句 3.3使用通配符 4.使用正则表达式检索数据 5.检索计算字段 5.1使用拼接字段 5.2使用别名 5.3执行算数计算 6.使用函数检索数据 6.1常用文本处理函数: 6.2日期和时间处理函数: 6.3数值处理函数: 6.4聚集函数: 7.分组检索数据 7.1.简单分组 7.2过滤分组: 8.使用子查询检索数据 8.1子查询简介 8.2各种子

  • mysql语法之DQL操作详解

    目录 简单查询 运算符查询 排序查询 聚合查询 分组查询 分页查询 一张表查询结果插入到另一张表 SQL语句分析 DQL小练习1 DQL小练习2 正则表达式 总结 DQL(Data Query Language),数据查询语言,主要是用来查询数据的,这也是SQL中最重要的部分! 简单查询 #DQL操作之基本查询 #创建数据库 CREATE DATABASE IF NOT EXISTS mydb2; #使用数据库 USE mydb2; #创建表 CREATE TABLE IF NOT EXISTS

  • MySQL中数据视图操作详解

    目录 1.视图概述 1.1创建视图 1.2视图的查询 2.操作视图 2.1通过视图操作数据 2.2修改视图定义 2.3删除视图 1.视图概述 视图是从一个或多个表(或视图)导出的表.视图与表(有时为与视图区别,也称表为基本表)不同,视图是一个虚表,即视图所对应的数据不进行实际存储,数据库中只存储视图的定义,对视图的数据进行操作时,系统根据视图的定义去操作与视图相关联的基本表. 视图一经定义,就可以像表一样被查询.修改.删除和更新.使用视图有下列优点: 1.为用户集中数据,简化用户的数据查询和处理

  • MySQL学习之数据更新操作详解

    目录 UPDATE 语句 UPDATE 语句练习① UPDATE 语句练习② UPDATE 语句练习③ UPDATE 语句的表连接 UPDATE 语句练习④ UPDATE 语句 UPDATE 语句用于修改表的记录,语法如下 UPDATE IGNORE 表名 SET 字段1=值1, 字段2=值2, 字段3=值3, ...... WHERE 条件1 ...... ORDER BY ...... LIMIT ......; -- 注意:IGNORE - 是可选条件,使用后,会针对有冲突的修改记录忽略

  • MySQL数据库中表的操作详解

    目录 1.Mysql中的数据类型 2.创建数据表 3.删除表 4.插入数据 5.更新数据 6.删除数据 7.快速复制表 8.快速删除表数据 1.Mysql中的数据类型 varchar 动态字符串类型(最长255位),可以根据实际长度来动态分配空间,例如:varchar(100) char 定长字符串(最长255位),存储空间是固定的,例如:char(10) int 整数型(最长11位) long 长整型 float 单精度 double 双精度 date 短日期,只包括年月日 datetime

  • MySql常用数据类型与操作详解

    目录 常用数据类型 数据库基本操作 约束类型 常用数据类型 1.int:整形 2.double(m,d) decimal(m,d):浮点数类型 (m指定长度,d表示小数点位数) 3.varchar(size):字符串类型 4.timestamp:日期类型 数据库基本操作 不管执行什么语句,都要在语句的最后加上:(分号). 1.创建数据库 create database 数据库名: 2.显示当前数据库 show databases; 3.删除数据库 drop database 数据库名; 4.使用

  • MySQL 去重实例操作详解

    目录 前言 1.创建测试数据 2.distinct 使用 2.1 单列去重 2.2 多列去重 2.3 聚合函数+去重 3.group by 使用 3.1 单列去重 3.2 多列去重 3.3 聚合函数 + group by 4.distinct 和 group by 的区别 区别1:查询结果集不同 区别2:使用业务场景不同 区别3:性能不同 总结 前言 在 MySQL 中,最常见的去重方法有两个:使用 distinct 或使用 group by,那它们有什么区别呢?接下来我们一起来看. 1.创建测

  • MySQL筑基篇之增删改查操作详解

    目录 一.增加表中数据 1.无自增列时 2.有自增列时 二.删除表中数据 1.使用delete 2.使用truncate 三.修改表中数据 四.*查询操作 1.简单查询 2.条件查询 3.排序 一.增加表中数据 1.无自增列时 1.指定字段添加数据 给表中的部分列添加数据:值的顺序必须跟指定列的顺序保持一致 语法:insert into 表名(列1,列2,...) values(值1,值2,...) 2.默认添加数据 向表中的所有列添加数据:值的顺序必须跟字段顺序保持一致 语法:insert i

  • SpringBoot yaml语法与数据读取操作详解

    目录 yaml yaml语法规则 字面值表示方式: 数组表示方式: 对象数组格式: 对象数组缩略格式: 读取yaml数据 编写yaml文件 读取单一数据 读取二级数据 读取数组数据 读取服务器端口号 读取对象属性 封装全部数据到Environment对象 读取yaml引用类型属性数据 application.yml MyDataSource 读取数据 变量的引用 application.yml 读取数据 context-path @Autowired报错解决方案 yaml YAML是一种数据序列

  • MySQL数据库基础学习之JSON函数各类操作详解

    目录 前言 一.JSON语法规则 二.JSON函数 1.JSON_CONTAINS(json_doc,value)函数 2.JSON_SEARCH()函数 3.JSON_PRETTY(json_doc)函数 4.JSON_DEPTH(json_doc)函数 5.JSON_LENGTH(json_doc[,path])函数 6.JSON_KEYS(json_doc[,path])函数 7. JSON_INSERT(json_doc,path,val[,path,val] ...)函数 8.JSON

  • MySQL操作之JSON数据类型操作详解

    上一篇文章我们介绍了mysql数据存储过程参数实例详解,今天我们看看MySQL操作之JSON数据类型的相关内容. 概述 mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点.但mysql毕竟是关系型数据库,在处理json这种非结构化的数据时,还是比较别扭的. 创建一个JSON字段的表 首先先创建一个表,这个表包含一个json格式的字段: CREATE TABLE table_name ( id INT NOT NULL

随机推荐