一、SQL学习之单表查询

表查询的执行顺序:

where>group by>select>having>order by


SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL

一、语法



1.SQL不区分大小写,认为规定以方便编程,以分号;结尾

2.表命名规则:

                英文(a-zA-Z)、数字(0-9)、下划线_

                必须英文开头,不能重复

                一般使用小写

SHOW DATABASES;

CREATE DATABASE sqllearning;

USE sqllearning;

3.记录分隔符

  • CRLF: Carriage-Return Line-Feed的缩写,意思是回车换行,即\r\n;
  • LF: Line-Feed的缩写,意思是换行,即\n;
  • CR: Carriage-Return的缩写,回车,即\r;

 

 

4.关键字:

关键字又叫保留字,大写,不能用作表名或列名

5.列 表 数据库 一般小写

6.关键字 操作对象

7.语句结构

二、单表查询



SELECT prodname FROM order_list;
SELECT order_id,date,prodname FROM order_list;
SELECT * FROM order_list;
SELECT milk_tea.in_price FROM milk_tea;
SELECT milk_tea.net_w AS '重量' FROM milk_tea;
SELECT milk_tea.prod_id,milk_tea.valid_month AS '保质期' ,milk_tea.prod_name AS '产品名称' FROM milk_tea;
SELECT m.in_price,m.net_w,m.sale_price FROM milk_tea AS m;
SELECT *,0.9 FROM milk_tea;
SELECT *,0.9 AS 'discount' FROM milk_tea;
SELECT *,'零食' AS class FROM milk_tea;
SELECT m.prod_name,m.in_price,m.sale_price,m.sale_price-m.in_price AS '利润' FROM milk_tea AS m;
SELECT m.in_price,m.sale_price,m.sale_price*0.9 AS 'new_sale' FROM milk_tea AS m;

不影响表数据,只影响查询结果的展示

计算利润

 

字符拼接 :

SELECT *,CONCAT(m.prod_id,':',m.prod_name,m.pro_date,'(',m.net_w,')',m.valid_month) AS '产品信息' FROM milk_tea AS m;
SELECT *,CONCAT_WS('-',m.prod_id,m.prod_name,m.pro_date,m.net_w,m.valid_month) AS '用统一分隔符' FROM milk_tea AS m;
SELECT DISTINCT net_w FROM milk_tea;

 

 

排序

SELECT * FROM milk_tea ORDER BY sale_price DESC;
SELECT * FROM milk_tea ORDER BY valid_month DESC,in_price ASC;
SELECT prod_id,prod_name FROM milk_tea ORDER BY sale_price;
SELECT * FROM milk_tea ORDER BY pro_date;
SELECT * FROM supplier_info ORDER BY CONVERT(supplier_info.supplier_name USING gbk);

排序:

 

数据过滤---where:

SELECT s.tel FROM supplier_info AS s WHERE s.tel LIKE '133%';
SELECT * FROM milk_tea AS m WHERE m.prod_id=2;
SELECT * FROM milk_tea WHERE in_price>10 and valid_month=18;
SELECT * FROM milk_tea WHERE net_w='150g';
SELECT * FROM milk_tea WHERE sale_price!=15;
SELECT * FROM milk_tea WHERE sale_price<>15;
SELECT * FROM milk_tea WHERE sale_price*0.9<15;

SELECT * FROM milk_tea WHERE IFNULL(sale_price,0)<>15;

 

 

SELECT * FROM milk_tea WHERE IFNULL(sale_price,0)<>15;
SELECT * FROM milk_tea WHERE sale_price IS NOT NULL; 
SELECT * FROM milk_tea WHERE sale_price IS NULL; 
SELECT * FROM milk_tea WHERE sale_price BETWEEN 15 AND 20;

 

like模糊查询

尽量不要把通配符放在开头,查询效率较低

? _一个字符

% *0个或1个或多个

\转义字符

 

 多条件查询

SELECT * FROM milk_tea AS m WHERE m.pro_date IS NULL AND m.in_price>10 OR sale_price<5;

 

 

SELECT * FROM milk_tea WHERE milk_tea.prod_name='奶茶';
SELECT * FROM milk_tea WHERE NOT milk_tea.prod_name='奶茶';
SELECT * FROM milk_tea WHERE in_price IN(12.3,2.1,16.1);
SELECT * FROM milk_tea WHERE NOT prod_name IN('饼干','火腿肠','棒棒糖');

 

数据类型

VARCHAR不定长省空间,CHAR定长方便查找,适合固定长度的:手机号、身份证号

GBK一个中文占2个字节,最好自己测试一下不同编码的站字节数

 

 

 

 

聚合函数

COUNT对空值不计入

--聚合函数COUNT SUM AVG MAX MIN

--计算表的总行数
SELECT COUNT(*) FROM milk_tea;
SELECT COUNT(1) FROM milk_tea;

--计算某一列的行数 NULL不计入
SELECT COUNT(m.pro_date) FROM milk_tea AS m;

--DISTINCT计算种类数,去除重复值
SELECT COUNT(DISTINCT milk_tea.sale_price) FROM milk_tea;

--DISTINCT同时对多列,尽量一个语句不要多个COUNT函数
SELECT COUNT(DISTINCT milk_tea.in_price),COUNT(DISTINCT milk_tea.valid_month) FROM milk_tea;

 

 

--SUM直接忽略掉空值  155.5
SELECT SUM(m.in_price) FROM milk_tea AS m;

--171.5
SELECT SUM(m.sale_price) FROM milk_tea AS m;

--31.5 之所以不相等,是因为sale_price中有一个空值
SELECT SUM(m.sale_price-m.in_price) FROM milk_tea AS m;

--16加上IFNULL之后值就相等了
SELECT SUM(IFNULL(m.sale_price,0)-m.in_price) FROM milk_tea AS m;

--NULL 
SELECT m.sale_price-m.in_price FROM milk_tea AS m WHERE m.in_price=15.5;

---15.5结果正常
SELECT IFNULL(m.sale_price,0)-m.in_price FROM milk_tea AS m WHERE m.in_price=15.5;

--忽略空值 /8(空值的个数不计算在内)
SELECT AVG(m.sale_price) FROM milk_tea AS m;


SELECT MAX(m.in_price) FROM milk_tea AS m;
SELECT MIN(m.in_price) FROM milk_tea AS m;

 

 

数据分组:

SELECT m.net_w,SUM(m.sale_price) FROM milk_tea AS m GROUP BY m.net_w;

SELECT m.net_w,AVG(m.sale_price) FROM milk_tea AS m WHERE m.net_w IN('100g','150g') GROUP BY m.net_w;

SELECT m.net_w,SUM(m.sale_price) FROM milk_tea AS m GROUP BY m.net_w;

SELECT COUNT(o.prodname),o.quantity FROM order_list AS o WHERE o.quantity IN(1,2) GROUP BY o.quantity;

SELECT COUNT(o.prodname),o.quantity FROM order_list AS o GROUP BY o.quantity HAVING o.quantity IN(1,2);--不推荐

SELECT SUM(m.sale_price),m.net_w FROM milk_tea AS m  GROUP BY m.net_w;

--Having 对聚合之后的结果再过滤
SELECT SUM(m.sale_price),m.net_w FROM milk_tea AS m  GROUP BY m.net_w HAVING SUM(m.sale_price)>30;

SELECT p.class,SUM(p.cost) FROM prod_info AS p GROUP BY p.class;

SELECT p.class,COUNT(p.cost) FROM prod_info AS p GROUP BY p.class HAVING COUNT(p.cost)>4;

SELECT p.class,COUNT(p.cost) FROM prod_info AS p WHERE p.class<>'零食' GROUP BY p.class HAVING COUNT(p.cost)>4;

SELECT p.class,COUNT(p.cost) FROM prod_info AS p WHERE p.sale_price>10 GROUP BY p.class;

 

单表查询总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值