SQL语句的操作无外乎增删改查,其中“查”就占据了半壁江山……下面的代码中分别是一些实例(去除重复记录、查询过程中重新命名列、模糊查询、查询排序、聚合函数、分组求和等),结合具体的需求来掌握语句的写法效果会更好,个人见解~~~
CREATE TABLE zhangmu(
-- 账务ID
id INT PRIMARY KEY AUTO_INCREMENT,
-- 账务名称
zname VARCHAR(200),
-- 金额
zmoney DOUBLE
);
RENAME TABLE zhangmu TO zhangwu;
INSERT INTO zhangwu(id,zname,zmoney) VALUES (1,'吃饭支出',247);
INSERT INTO zhangwu(id,zname,zmoney) VALUES (2,'工资收入',12345);
INSERT INTO zhangwu(id,zname,zmoney) VALUES (3,'服装支出',1000);
INSERT INTO zhangwu(id,zname,zmoney) VALUES (4,'吃饭支出',325);
INSERT INTO zhangwu(id,zname,zmoney) VALUES (5,'股票收入',8000);
INSERT INTO zhangwu(id,zname,zmoney) VALUES (6,'打麻将支出',8000);
INSERT INTO zhangwu(id,zname,zmoney) VALUES (7,NULL,5000);
/*
查询所有列的数据
格式;
select * from 表名
*/
SELECT * FROM zhangwu;
/*
查询去掉重复记录
DISTINCT 关键字 跟随列名
且只查一列
*/
SELECT DISTINCT zname FROM zhangwu;
/*
查询重新命名列
as 关键字
仅仅是查询的临时改名
as可以省略
使用时机:在下面做数学运算的时候用
为了显示的时候更方便的看
*/
SELECT zname AS 'name' FROM zhangwu;
/*
在查询数据中,直接做数学计算
列 对数字进行计算
*/
SELECT zname ,zmoney+1000 AS 'sum' FROM zhangwu;
/*
查询所有的吃饭支出
*/
SELECT * FROM zhangwu WHERE zname='吃饭支出';
-- 查询金额大于1000
SELECT * FROM zhangwu WHERE zmoney>1000;
-- 查询金额在500-5000之间的
SELECT * FROM zhangwu WHERE zmoney >=500 AND zmoney<=5000;
-- ========================================================================
-- 将上述方法改造成between and 方式
SELECT * FROM zhangwu WHERE zmoney BETWEEN 500 AND 5000;
-- 金额是1000,3500,5000其中一个
SELECT * FROM zhangwu WHERE zmoney=1000 OR zmoney=3500 OR zmoney=5000;
-- 改造成in方式
SELECT * FROM zhangwu WHERE zmoney IN(1000,3500,5000);
-- ========================================================================
-- 模糊查询
/*
like 模糊查询 配合通配符
*/
-- 查询所有的支出 %代表0个或者多个字符
SELECT * FROM zhangwu WHERE zname LIKE '%支出%';
-- 支出前只有一个字符
SELECT * FROM zhangwu WHERE zname LIKE '_支出%';
-- 以支出打头
SELECT * FROM zhangwu WHERE zname LIKE '支出%';
-- 查询账务名字,五个字符的(写五个下划线)
SELECT * FROM zhangwu WHERE zname LIKE '_____';
-- 查询账务名不为空的(使用)
SELECT * FROM zhangwu WHERE zname IS NOT NULL;
-- 不建议使用下面的方式
SELECT * FROM zhangwu WHERE NOT (zname IS NULL);
-- ========================================================================
-- 查询排序
/*
查询,对结果集进行排序
升序,降序,对指定的列排序
order by 列名 [desc][asc]
desc 降序
asc 升序(默认,可以不写)
一般不对中文进行排序,否则结果无法预知
*/
-- 查询账务表,价格进行升序
SELECT * FROM zhangwu ORDER BY zmoney;
-- 查询账务表,价格进行降序,如果价格相同,给出次要条件,以前边的为主
SELECT * FROM zhangwu ORDER BY zmoney DESC,id DESC;
-- 查询账务表,查询所有的支出,对金额降序排列
-- 切记:先过滤条件 where 查询的结果再排序
SELECT * FROM zhangwu WHERE zname LIKE '%支出%' ORDER BY zmoney DESC;
-- ========================================================================
-- 聚合函数
/*
使用聚合函数进行查询计算
*/
-- count求和,对表中的数据的个数进行求和 count(列名)
-- 查询统计账务表中,一共有多少条数据
-- 查询过程中算上空,但是不算上null; (注意:null和空是不一样的)
SELECT COUNT(*) AS 'count' FROM zhangwu;
-- sum 函数求和,对一列中数据进行求和计算 sum(列名)
-- sum求和的时候如果是空值或者是非数值型,它会默认它们是0
-- 对账务表查询,对所有的金额求和计算
SELECT SUM(zmoney) FROM zhangwu;
-- 还可以加入条件求和:统计所有支出的总金额
SELECT SUM(zmoney) FROM zhangwu WHERE zname LIKE '%支出%';
-- avg 函数,计算一个列所有数据的平均数
SELECT AVG(zmoney) FROM zhangwu;
-- max 函数,对某列数据获取最大值(还有MIN函数,都不常用)
SELECT MAX(zmoney) FROM zhangwu;
-- =====================================================================
-- 分组求和
/*
查询各类支出,分别计算总额
思路:
必须使用sum聚合函数对金额进行求和
按照zname中的内容,重复的内容求和
故引出新的查询方式——分组查询
group by (被分组的列名)
必须跟随聚合函数
select 查询的时候,被分组的列,要出现在select 选择列的后面
*/
SELECT SUM(zmoney),zname FROM zhangwu GROUP BY zname;
-- 对zname内容进行分组查询求和,但是只要支出
-- 下面的代码容易造成阅读上的混淆
SELECT SUM(zmoney),zname FROM zhangwu WHERE zname LIKE '%支出%'
GROUP BY zname
ORDER BY SUM(zmoney) DESC;
-- 用as改一下
SELECT SUM(zmoney) AS 'getsum',zname FROM zhangwu WHERE zname LIKE '%支出%'
GROUP BY zname
ORDER BY getsum DESC;
-- 对zname内容进行分组查询求和,但是只要支出,显示金额大于5000
-- 结果集是分组查询后再次进行筛选,不能使用where
-- 分组后再次过滤,关键字 having 必须放在group by后边
SELECT SUM(zmoney) AS 'getsum',zname FROM zhangwu WHERE zname LIKE '%支出%'
GROUP BY zname HAVING getsum>5000;