mysql语法中DQL操作方法是什么
发表于:2024-12-12 作者:千家信息网编辑
千家信息网最后更新 2024年12月12日,今天小编给大家分享一下mysql语法中DQL操作方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我
千家信息网最后更新 2024年12月12日mysql语法中DQL操作方法是什么
今天小编给大家分享一下mysql语法中DQL操作方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
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 则不会进行比较 直接结果为NULLSELECT 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 BYSELECT 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'表示任意字符+bSELECT '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操作方法是什么"这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注行业资讯频道。
查询
字符
分组
表达式
商品
字段
排序
函数
数据
分析
运算
就是
结果
部门
顺序
个数
基础
正则
洗衣机
运算符
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
数据库应用技术 sql题
商城服务器租用
上汽软件开发部 IT储备生
秦皇岛数据库管理师证
怎么检查数据库防火墙关闭
御诚网络技术
公司网络安全管理承诺书
网络安全及教育信息化办公室
网络安全顾问就业方向
GP数据库常见面试题
ifix 历史数据库
四川软件开发有哪些
数据库应用系统设计第二阶段
计算机网络技术相关专业知识
网络安全行业平均寿命
云服务器需要配置网络吗
恒星数据库
数据库access宏
广州鲜檬网络技术有限公司
软件开发文档学生模板下载
数据库显示正在恢复
练数据库技术计算机三级的软件
中央网信办网络安全应急
实时查询数据库显示
无影云电脑与云服务器的区别
高中网络技术应用课件教科版
逍客显示屏服务器错误
视频服务器每隔几小时就跳几分钟
电信网络安全工作内容
中国移动集团网络技术有限公司