数据库DQL单表查询

素颜马尾好姑娘i 2024-04-24 04:44 162阅读 0赞

以下数据都出自该emp表,创建代码在下面.6a225727b42f457683d9c9f8192481e6.png

复制如下代码到mysql中运行即可在empdb库中建立emp表,后面sql语句都基于此emp表数据操作

  1. CREATE DATABASE /*!32312 IF NOT EXISTS*/`empdb` /*!40100 DEFAULT CHARACTER SET utf8 */;
  2. USE `empdb`;
  3. DROP TABLE IF EXISTS `emp`;
  4. CREATE TABLE `emp` (
  5. `id` int(4) NOT NULL AUTO_INCREMENT,
  6. `name` varchar(10) NOT NULL,
  7. `job` varchar(9) DEFAULT NULL,
  8. `manager` int(4) DEFAULT NULL,
  9. `hiredate` date DEFAULT NULL,
  10. `sal` double(7,2) DEFAULT NULL,
  11. `comm` double(7,2) DEFAULT NULL,
  12. `dept_id` int(4) DEFAULT NULL,
  13. PRIMARY KEY (`id`)
  14. ) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;
  15. insert into `emp`(`id`,`name`,`job`,`manager`,`hiredate`,`sal`,`comm`,`dept_id`) values (1,'孙悟空','销售',4,'1980-12-17',800.00,NULL,1),(2,'猪八戒','销售',4,'1981-02-20',1600.00,300.00,1),(3,'沙僧','销售',4,'1981-02-22',1250.00,500.00,1),(4,'唐僧','销售经理',8,'1981-04-02',2975.00,NULL,1),(5,'刘备','项目经理',NULL,'1981-09-28',1250.00,1400.00,3),(6,'关羽','程序员',5,'1981-05-01',2850.00,NULL,3),(7,'张飞','程序员',5,'1981-06-09',2450.00,NULL,3),(8,'观音','CEO',NULL,'1981-11-17',5000.00,NULL,1),(9,'白骨精','人事',8,'1981-09-08',1500.00,0.00,2),(10,'蜘蛛精','人事',8,'1981-12-03',950.00,NULL,2),(11,'黑熊怪','市场',8,'1981-12-03',3000.00,NULL,2);
  1. 单表查询语句
  2. # SELECT 字段/字面量/聚合函数(分组函数)...
  3. # FROM 表名
  4. # WHERE 筛选条件(不允许出现分组函数)
  5. # GROUP BY (分组)字段1,字段2...
  6. # HAVING 筛选条件(只能出现聚合函数和分组字段)
  7. # ORDER BY 排序字段1 [ASC]升序/DESC降序,字段2 [ASC]升序/DESC降序,... [ASC]升序/DESC降序;
  8. # 语句执行顺序:
  9. # 1、from
  10. # 2、where
  11. # 3、group by
  12. # 4、having
  13. # 5、select
  14. # 6、order by
  15. distinct 去重:对字段中的相同数据去重为一条数据,也可对多字段去重。
  16. 用法:SELECT DISTINCT 字段1,字段2... FROM 表名;
  17. 注意:distinct关键字前面不允许加字段或字面量.
  18. #ORDER BY:排序 ORDER BY 字段名1,字段名2... [ASC]/DESC;
  19. # 1、位于查询语句的最后一句,为了不破坏排序结果要等所有语句操作执行完才能执行排序。
  20. # 2、ASC是升序(默认不写),DESC是降序。
  21. # 3、多字段排序的时候,是以第一的字段为主导,第二或第一以后的全部字段是起辅导作用。也就是,先后顺序的意思。
  22. # 4、排序还可以字段位置但考虑到查询的健壮性不建议使用。如:ORDER BY 数字1,数字2... [ASC]/DESC;
  23. 此处补充一下:limit 接在order by后面作为跳转查询,使用方法如 limit [起始位置,长度]。起始位置从下标0开始,所以查询某段想要的数据行。
  1. SELECT * FROM emp ORDER BY dept_id ASC,sal DESC;
  2. SELECT * FROM emp ORDER BY 4 DESC,5;
  3. #查询的是第3+1行开始往后数4条数据,也就是排序后第4、5、6、7行的数据。
  4. SELECT * FROM emp ORDER BY sal DESC LIMIT 3,4;
  1. #数据处理函数又称为单行处理函数。常见:lower、upper、length、trim、concat、substr、round、rand、str_to_date、date_format、format、case..when..then..when..then..else..end。
  2. #聚合函数(分组函数)又称为多行处理函数。常见:min、max、avg、sum、count。一般搭配group by分组使用,若未分组则默认为一组。
  3. #单行处理函数的特点:一个输入对应一个输出(一行数据处理)
  4. #多行处理函数的特点:多个输入对应一个输出(一个字段(列)的数据进行处理)
  5. #单行处理函数
  6. # 注意:SELECT 可以查询字段也可以查询字面量
  7. # 1、查询字段就是根据列显示,将字段中的数据按列显示
  8. # 2、查询字面量则是根据表中有多少行就显示多少条字面量。字面量显示行数据,是查询的数据。
  9. # 3、字面量是可以用单引号'数据',也可以不用单引号' '表示,但是不能是双引号" "。
  10. # 4、查询时SELECT后面放入数字字面量是表示查询第几列,一般是覆盖所有显示行。
  11. # SELECT 字段(属性列)/字面量 FROM 表名;
  12. # lower() 转小写:SELECT lower(字段/字面量) FROM 表名;
  1. SELECT LOWER('sdaNDFdfsMI') FROM emp;
  1. # upper() 转大写:SELECT upper(字段/字面量) FROM 表名;
  1. SELECT UPPER('sdasdhfjHKDF') FROM emp;
  1. # length() 长度:SELECT length(字段/字面量) FROM 表名; 注意:一个中文字符占3个字节
  1. SELECT LENGTH(name) FROM emp;
  2. SELECT name FROM emp WHERE LENGTH(name)=6; #查询两个汉字的名字。
  1. # trim() 去除前后空格: SELECT 字段 FROM 表名 WHERE 字段=trim(前后空格数据);
  1. SELECT TRIM(' 孙悟空 ') FROM emp; #去除空格
  2. SELECT ' 孙悟空 ' FROM emp; #未去除空格
  3. SELECT name FROM emp WHERE name=TRIM(' 孙悟空 '); #判断去除空格的数据
  1. # substr() 截取字符串:SELECT substr(字段/字面量,字符位置,截取长度) FROM 表名;
  2. # 注意:在此处是从1位开始,没有下标0这个说法。所以字符位置根据十进制实际位数来。
  1. SELECT SUBSTR(name,1,1) FROM emp; #截取第一个字符
  2. #给首字母大写
  3. SELECT CONCAT(UPPER(SUBSTR('asdffs',1,1)),SUBSTR('asdffs',2,LENGTH('asdffs')-1));
  1. # concat() 字符拼接:SELECT count(字段/字面量,字段/字面量...) FROM 表名
  1. SELECT CONCAT(name,'HHHH',sal) FROM emp;
  1. # round() 四舍五入:SELECT round(字段/字面量,位置) FROM 表名
  1. SELECT ROUND(233.523); #不设置位置参数,默认对整数操作
  2. SELECT ROUND(233.523,0); #设置0位置忽略小数位置
  3. SELECT ROUND(233.523,1); #设置保留1位小数并四舍五入
  4. SELECT ROUND(233.523,5); #保留5位小数,不足位置补0
  5. SELECT ROUND(233.523,-1); #-1是对个位进行四舍五入,个位补0
  6. SELECT ROUND(233.523,-2); #-2对十位四舍五入,十位个位补0
  7. SELECT ROUND(233.523,-5); #-5对万位四舍五入,这里进位是不足的,补0就是0
  8. SELECT ROUND('233.52a3',4); #碰到不是数字的就不返回后面内容。
  1. # rand() 随机数:SELECT rand([字面量/字段]) FROM 表名;
  2. # 注意:RAND(字面量/字段)括号中添加了字面量或者字段的话,那么就是相当于本次随机数值赋值给该字面量或者字段了,下次运行还是这个结果
  3. # 要是没指定字面量/字段的话那么是没有’容量‘来存储随机值,也就每次运行的随机值结果不一致了。
  1. SELECT RAND(sal) FROM emp;
  2. SELECT ROUND(RAND()*100,2) R; #生成一个0~100之间的随机数并保留两位小数。
  1. # case.. when..then..when..then..else..end;
  2. # 判断语句:case 字面量/字段 when 条件1 then 满条件1执行 when 条件2 then 满足条件2执行 .... else 都不满足条件,执行! end;
  3. # 注意:只能有一个条件执行。
  1. SELECT
  2. CASE 'hello'
  3. WHEN substr('hello',1,1)='h' THEN 'H'
  4. WHEN substr('hello',1,1)<>'h' THEN 'h'
  5. ELSE 'hello'
  6. END;
  1. # IFNULL 判断为空 SELECT IFNULL(字段/字面量,如果为空就赋值) FROM emp;
  1. SELECT IFNULL(sal,0) FROM emp; #如果sal字段的某条数据为空就给null=0;
  1. # 多行处理函数
  2. # 分组函数(聚合函数)
  3. # 1、分组函数没使用分组查询group by的话那么默认是在一个组当中
  4. # 2、分组查询是执行group by分组之后的,而select的执行顺序from->where->group by->having->select是处在group by之后所以可以进行聚合操作。
  5. # 3、分组函数不能出现在where子句当中,因为where执行顺序在group by之前
  6. # 4、分组函数是默认不计算null的,也就是忽略null值。想要加入null的数据的话就进行ifnull赋值
  7. # min 最小值
  1. SELECT MIN(sal) FROM emp;
  1. # max 最大值
  1. SELECT MAX(sal) FROM emp;
  1. # avg 平均值
  2. # 注意:求平均值的时候要是字段中存在null值,那么会忽略不计入平均值数据。那么我们需要对它进行ifnull空判断赋值才能达到全字段平均值效果。
  1. # SELECT AVG(IFNULL(sal,0)) FROM emp;
  2. #在求平均值之前进行null=0操作,有了值的数据就会算入平均之中。
  3. SELECT AVG(sal) FROM emp;
  1. # sum 求和:
  1. SELECT SUM(sal) FROM emp;
  1. # count 统计:
  2. # 注意:统计表的行数,*是代表全部的字段,因为没有哪一行的数据会全部同时存在null值。
  1. # SELECT COUNT(*) FROM emp;
  2. # 因为分组函数不对null数据进行计算,所以我们就把所有的数据进行统计从而得到表中行数
  3. SELECT COUNT(sal) FROM emp;
  1. # group by 分组查询
  2. # 1、对数据进行分组查询操作,并且对聚合函数进行改变。执行在聚合函数之前。
  3. # 2、group by对字段进行分组。可以进行多字段分组
  4. # 3、多字段分组,以第一个字段为主,其后字段为辅
  5. # 4、需搭配聚合函数使用c
  1. # 注意:SELECT sal FROM emp GROUP BY dept_id;
  2. # 报错! 未对分组进行数据整合,所以我们需要加上聚合函数
  3. SELECT MAX(sal) FROM emp GROUP BY dept_id;
  1. # having 筛选(分组函数/分组字段)
  2. # 1、having筛选的数据可以是字段和聚合函数。但是出于性能考虑一般是用来筛选聚合函数;
  3. # 2、having与where两者都是筛选但最大区别是可以对聚合函数进行操作,where则不行。这就跟他们的执行顺序有关了where执行在group by之前,having在之后
  4. # 3、但是where也有能比having的优势那就是where执行的越前那么对筛序的数据就越早,以此给其他函数和语句减轻不必要的数据量。
  5. # 4、如果having之前没有group by也可以对分组函数进行筛选,因为查询表中没有group by默认分为一组,如果有group by则执行顺序依旧在group by之后。
  1. select sal,name from emp having sal=1250; #没有聚合函数也可以筛选,对应着默认分一组。
  2. select min(sal) from emp having min(sal)>700; #对聚合函数筛选
  1. # 例题:查询所有部门里有哪几种工作,并对该工作高于1000工资进行求平均,筛选出平均结果大于2000的数据并对平均结果降序排序
  1. SELECT dept_id,AVG(sal) avg_sal,job
  2. FROM emp
  3. WHERE sal>1000
  4. GROUP BY dept_id,job
  5. HAVING AVG(sal)>2000
  6. ORDER BY dept_id ASC,avg_sal DESC;

End…

DQL多表关系查询见:https://blog.csdn.net/qq_48475590/article/details/126934276?spm=1001.2014.3001.5502

发表评论

表情:
评论列表 (有 0 条评论,162人围观)

还没有评论,来说两句吧...

相关阅读

    相关 DQL数据库查询语言

     DQL 1.通过as给列加别名,as不可以省略 2.可以直接在表名后面加别名,as不需要写,访问字段的时候通过别名.字段名的方式 3.通过order by t.a

    相关 数据库查询

    数据库单表查询: 1. 选择表中的若干列 2. 选择表中的若干元组 3. 对查询结果排序 4. 使用集函数 5. 对查询结果分组 1.选择表中若干列