数据库DQL单表查询

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

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

CREATE DATABASE /*!32312 IF NOT EXISTS*/`empdb` /*!40100 DEFAULT CHARACTER SET utf8 */;
 
USE `empdb`;
 
DROP TABLE IF EXISTS `emp`;
 
CREATE TABLE `emp` (
                       `id` int(4) NOT NULL AUTO_INCREMENT,
                       `name` varchar(10) NOT NULL,
                       `job` varchar(9) DEFAULT NULL,
                       `manager` int(4) DEFAULT NULL,
                       `hiredate` date DEFAULT NULL,
                       `sal` double(7,2) DEFAULT NULL,
                       `comm` double(7,2) DEFAULT NULL,
                       `dept_id` int(4) DEFAULT NULL,
                       PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;
 
 
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);
单表查询语句
#         SELECT 字段/字面量/聚合函数(分组函数)...
#         FROM 表名
#         WHERE 筛选条件(不允许出现分组函数)
#         GROUP BY (分组)字段1,字段2...
#         HAVING 筛选条件(只能出现聚合函数和分组字段)
#         ORDER BY 排序字段1 [ASC]升序/DESC降序,字段2 [ASC]升序/DESC降序,... [ASC]升序/DESC降序;

# 语句执行顺序:
#     1、from
#     2、where
#     3、group by
#     4、having
#     5、select
#     6、order by

distinct 去重:对字段中的相同数据去重为一条数据,也可对多字段去重。
用法:SELECT DISTINCT 字段1,字段2... FROM 表名;
注意:distinct关键字前面不允许加字段或字面量.


#ORDER BY:排序  ORDER BY 字段名1,字段名2... [ASC]/DESC;
#       1、位于查询语句的最后一句,为了不破坏排序结果要等所有语句操作执行完才能执行排序。
#       2、ASC是升序(默认不写),DESC是降序。
#       3、多字段排序的时候,是以第一的字段为主导,第二或第一以后的全部字段是起辅导作用。也就是,先后顺序的意思。
#       4、排序还可以字段位置但考虑到查询的健壮性不建议使用。如:ORDER BY 数字1,数字2... [ASC]/DESC;

此处补充一下:limit 接在order by后面作为跳转查询,使用方法如 limit [起始位置,长度]。起始位置从下标0开始,所以查询某段想要的数据行。

SELECT * FROM emp ORDER BY dept_id ASC,sal DESC;

SELECT * FROM emp ORDER BY 4 DESC,5;

#查询的是第3+1行开始往后数4条数据,也就是排序后第4、5、6、7行的数据。
SELECT * FROM emp ORDER BY sal DESC LIMIT 3,4;
#数据处理函数又称为单行处理函数。常见:lower、upper、length、trim、concat、substr、round、rand、str_to_date、date_format、format、case..when..then..when..then..else..end。
#聚合函数(分组函数)又称为多行处理函数。常见:min、max、avg、sum、count。一般搭配group by分组使用,若未分组则默认为一组。
#单行处理函数的特点:一个输入对应一个输出(一行数据处理)
#多行处理函数的特点:多个输入对应一个输出(一个字段(列)的数据进行处理)


#单行处理函数
#   注意:SELECT 可以查询字段也可以查询字面量
#           1、查询字段就是根据列显示,将字段中的数据按列显示
#           2、查询字面量则是根据表中有多少行就显示多少条字面量。字面量显示行数据,是查询的数据。
#           3、字面量是可以用单引号'数据',也可以不用单引号' '表示,但是不能是双引号" "。
#           4、查询时SELECT后面放入数字字面量是表示查询第几列,一般是覆盖所有显示行。
#       SELECT 字段(属性列)/字面量 FROM 表名;

# lower() 转小写:SELECT lower(字段/字面量) FROM 表名;

SELECT LOWER('sdaNDFdfsMI') FROM emp;
# upper() 转大写:SELECT upper(字段/字面量) FROM 表名;

SELECT UPPER('sdasdhfjHKDF') FROM emp;
# length() 长度:SELECT length(字段/字面量) FROM 表名; 注意:一个中文字符占3个字节

SELECT LENGTH(name) FROM emp;

SELECT name  FROM emp WHERE LENGTH(name)=6;  #查询两个汉字的名字。
# trim() 去除前后空格: SELECT 字段 FROM 表名 WHERE 字段=trim(前后空格数据);

SELECT TRIM(' 孙悟空     ') FROM emp; #去除空格
SELECT '      孙悟空     ' FROM emp;  #未去除空格
SELECT name FROM emp WHERE name=TRIM(' 孙悟空     '); #判断去除空格的数据
# substr() 截取字符串:SELECT substr(字段/字面量,字符位置,截取长度) FROM 表名;
#           注意:在此处是从1位开始,没有下标0这个说法。所以字符位置根据十进制实际位数来。

SELECT SUBSTR(name,1,1) FROM emp; #截取第一个字符

#给首字母大写
SELECT CONCAT(UPPER(SUBSTR('asdffs',1,1)),SUBSTR('asdffs',2,LENGTH('asdffs')-1));
# concat() 字符拼接:SELECT count(字段/字面量,字段/字面量...) FROM 表名

SELECT CONCAT(name,'HHHH',sal) FROM emp;
# round() 四舍五入:SELECT round(字段/字面量,位置) FROM 表名

SELECT ROUND(233.523); #不设置位置参数,默认对整数操作
SELECT ROUND(233.523,0); #设置0位置忽略小数位置
SELECT ROUND(233.523,1); #设置保留1位小数并四舍五入
SELECT ROUND(233.523,5); #保留5位小数,不足位置补0
SELECT ROUND(233.523,-1); #-1是对个位进行四舍五入,个位补0
SELECT ROUND(233.523,-2); #-2对十位四舍五入,十位个位补0
SELECT ROUND(233.523,-5); #-5对万位四舍五入,这里进位是不足的,补0就是0
SELECT ROUND('233.52a3',4); #碰到不是数字的就不返回后面内容。
# rand() 随机数:SELECT rand([字面量/字段]) FROM 表名;
#       注意:RAND(字面量/字段)括号中添加了字面量或者字段的话,那么就是相当于本次随机数值赋值给该字面量或者字段了,下次运行还是这个结果
#           要是没指定字面量/字段的话那么是没有’容量‘来存储随机值,也就每次运行的随机值结果不一致了。
SELECT RAND(sal) FROM emp;

SELECT ROUND(RAND()*100,2) R; #生成一个0~100之间的随机数并保留两位小数。
# case.. when..then..when..then..else..end;
# 判断语句:case 字面量/字段 when 条件1 then 满条件1执行 when 条件2 then 满足条件2执行 .... else 都不满足条件,执行! end;
#       注意:只能有一个条件执行。
SELECT 
CASE 'hello' 
WHEN substr('hello',1,1)='h' THEN 'H' 
WHEN substr('hello',1,1)<>'h' THEN 'h' 
ELSE 'hello' 
END;
# IFNULL 判断为空 SELECT IFNULL(字段/字面量,如果为空就赋值) FROM emp;
SELECT IFNULL(sal,0) FROM emp; #如果sal字段的某条数据为空就给null=0;

# 多行处理函数
# 分组函数(聚合函数)
#   1、分组函数没使用分组查询group by的话那么默认是在一个组当中
#   2、分组查询是执行group by分组之后的,而select的执行顺序from->where->group by->having->select是处在group by之后所以可以进行聚合操作。
#   3、分组函数不能出现在where子句当中,因为where执行顺序在group by之前
#   4、分组函数是默认不计算null的,也就是忽略null值。想要加入null的数据的话就进行ifnull赋值

# min 最小值
SELECT MIN(sal) FROM emp;
# max 最大值
SELECT MAX(sal) FROM emp;
# avg 平均值
#       注意:求平均值的时候要是字段中存在null值,那么会忽略不计入平均值数据。那么我们需要对它进行ifnull空判断赋值才能达到全字段平均值效果。

#       SELECT AVG(IFNULL(sal,0)) FROM emp; 
#在求平均值之前进行null=0操作,有了值的数据就会算入平均之中。

SELECT AVG(sal) FROM emp;
# sum 求和:

SELECT SUM(sal) FROM emp;
# count 统计:
#       注意:统计表的行数,*是代表全部的字段,因为没有哪一行的数据会全部同时存在null值。

#           SELECT COUNT(*) FROM emp; 
# 因为分组函数不对null数据进行计算,所以我们就把所有的数据进行统计从而得到表中行数

SELECT COUNT(sal) FROM emp;
# group by 分组查询
#       1、对数据进行分组查询操作,并且对聚合函数进行改变。执行在聚合函数之前。
#       2、group by对字段进行分组。可以进行多字段分组
#       3、多字段分组,以第一个字段为主,其后字段为辅
#       4、需搭配聚合函数使用c

#            注意:SELECT sal FROM emp GROUP BY dept_id;
 # 报错! 未对分组进行数据整合,所以我们需要加上聚合函数

SELECT MAX(sal) FROM emp GROUP BY dept_id;
# having 筛选(分组函数/分组字段)
#         1、having筛选的数据可以是字段和聚合函数。但是出于性能考虑一般是用来筛选聚合函数;
#         2、having与where两者都是筛选但最大区别是可以对聚合函数进行操作,where则不行。这就跟他们的执行顺序有关了where执行在group by之前,having在之后
#         3、但是where也有能比having的优势那就是where执行的越前那么对筛序的数据就越早,以此给其他函数和语句减轻不必要的数据量。
#         4、如果having之前没有group by也可以对分组函数进行筛选,因为查询表中没有group by默认分为一组,如果有group by则执行顺序依旧在group by之后。

select sal,name from emp having sal=1250; #没有聚合函数也可以筛选,对应着默认分一组。

select min(sal) from emp having min(sal)>700; #对聚合函数筛选
# 例题:查询所有部门里有哪几种工作,并对该工作高于1000工资进行求平均,筛选出平均结果大于2000的数据并对平均结果降序排序

SELECT dept_id,AVG(sal) avg_sal,job 
FROM emp 
WHERE sal>1000 
GROUP BY dept_id,job 
HAVING AVG(sal)>2000  
ORDER BY dept_id ASC,avg_sal DESC;

End...

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值