MySQL-----DQL基础操作

MySQL-----DQL基础操作_第1张图片

目录

DQL--基本查询

▶ 简单查询

▶ 运算符

一   算术运算符 

二   比较运算符 

三   逻辑运算符 

 四   位运算符

▶ 条件查询

▶ 排序查询 

▶ 聚合查询

▶ 分组查询

▶ 分页查询


▶ 概念

数据库管理系统一个重要功能就是数据杳询数据,查询不应只是简单返回数据库中存储的数据,还应该根据需要对数据进行筛选以及确定数据什么样的格式显示。
▣ MySQL提供了功能强大、灵活的语句来实现这些操作。
▣ MySQL数据库使用select语句来查询数据。

 ▶ 应用

 ▶ 语法格式

 ▶ 基本语法

select
        [all | distinct]
        <目标列的表达式1>[别名],<目标列的表达式2>[别名]...
from<表名或视图名>[别名],<表名或视图名>[别名]...[where<条件表达式>]
[group by<列名>]

[having <条件表达式>]]
[order by <列名> [asc | desc]]

[limit<数字或者列表>];

 ▶ 简化版语法

        select * | 列名 from 表    where 条件 

DQL--基本查询

数据准备

        我们创建如下一张表后续的查询操作均在此表中完成。

MySQL-----DQL基础操作_第2张图片

MySQL-----DQL基础操作_第3张图片

MySQL-----DQL基础操作_第4张图片

▶ 简单查询

 ▶ 查询所有的商品.
        select * from product;

MySQL-----DQL基础操作_第5张图片

 ▶ 查询商品名和商品价格

         select pname ,price from product;

MySQL-----DQL基础操作_第6张图片

 ▶ 别名查询

        1.表别名

           select *from product as p;(as 可以省略)

MySQL-----DQL基础操作_第7张图片

        2.列别名

          select pname as '商品名',price '商品价格'  from product;

MySQL-----DQL基础操作_第8张图片

 ▶ 去除重复值

        select distinct 列名(price) from product;

        select distinct * from product;(去除所有列中重复的值)

MySQL-----DQL基础操作_第9张图片

 ▶ 运算查询

    查询结果是表达式(运算查询):将所有商品的价格+10元进行显示.

    select pname ,price+10 new_price  from product;

MySQL-----DQL基础操作_第10张图片



▶ 运算符

MySQL支持4种运算符

▣ 算术运算符

▣ 比较运算符

▣ 逻辑运算符

▣ 位运算符

一   算术运算符 

MySQL-----DQL基础操作_第11张图片

 ▶算术运算符运算操作

▣   select 操作数1 算术运算符 操作数2

MySQL-----DQL基础操作_第12张图片

 ▣   select 操作列对象名(算术运算符)数字   as  别名   from  表名 

 MySQL-----DQL基础操作_第13张图片

二   比较运算符 

MySQL-----DQL基础操作_第14张图片

三   逻辑运算符 

MySQL-----DQL基础操作_第15张图片

 四   位运算符

         位运算符是二进制数上进行计算的运算符。位运算符会先将操作数变成二进制,进行位运算。然后再将计算结果从二进制变回十进制数。

MySQL-----DQL基础操作_第16张图片


select 3&5;   -- 位与
/*
	3的二进制:0011
	5的二进制:0101
	 0011
  &0101
	 ----
	 0001  --> 2的0次幂=1
*/
select 3|5;  -- 位或
/*
	 0011
  |0101
	 ----
	 0111  --> 4+2+1=7
*/
select 3^5;  -- 位异或
/*
	0011
	0101
	----
	0110   -->4+2=6
*/
select 3<<1;  -- 位左移
/*
0011 --> 0110  = 4+2 = 6(相当于乘以移位数)
*/
select 3>>1; -- 位右移
/*
0011 --> 0001  = 3/2 = 1 (取整)相当于除以2
*/
select ~3;  -- 位取反
/*
 0000 0000 0000 0000 0000 0000 0000 0011 (32位)
 ---------------------------------------
 1111 1111 1111 1111 1111 1111 1111 1100
*/



▶ 条件查询

使用where关键字实现条件查询,where关键字后面接查询的条件。

MySQL-----DQL基础操作_第17张图片

MySQL-----DQL基础操作_第18张图片 基本应用

-- 查询商品名称为“海尔洗衣机”的商品所有信息:
select * from product where pname = '海尔洗衣机';
-- 查询价格为800商品
select * from product where price = 800;
-- 查询价格不是800的所有商品
select * from product where price <> 800;
-- 查询商品价格大于60元的所有商品信息
select * from product where price > 60;
-- 查询商品价格在200到1000之间所有商品
select * from product where price>=200  and price <=1000
select * from product where price between 200 and 1000;
select * from product where price>=200  && price <=1000
-- 查询商品价格是200或800的所有商品
select * from product where price in(200,800);
select * from product where price=200 or price=800;
select * from product where price=200 || price=800;
-- 查询含有"裤'字的所有商品
select * from product where pname like '%裤%' ; -- % 用来匹配任意字符
-- 查询以'海'开头的所有商品
select * from product where pname like '海%' ;

-- 查询第二个字为'蔻'的所有商品
select * from product where pname like '_蔻%';   -- 下划线匹配单个字符
-- 查询category_id为null的商品
select * from product where category_id is null;
-- 查询category_id不为null分类的商品
select * from product where category_id is not null;
-- 使用least求最小值
select least(10,5,20) as small_number;
select least(10,null,20) as small_number; -- 如果求最小值时,有个值位null,则不会进行比较,结果直接为null
-- 使用greatest求最大值
select greatest(10,20,30) as big_number;
select greatest(10,null,30) as big_number;-- 如果求最大值时,有个值位null,则不会进行比较,结果直接为null


▶ 排序查询 

    如果我们需要对读取的数据进行排序,我们就可以使用MySQL的order by子句来设定你想按哪个字段哪种方式来进行排序,再返回搜索结果。

▶ 语法

select
    字段名1,字段名2,...
from 表名
order by 字段名1 [asc | desc],字段名2[asc|desc]....

▶ 特点

1.asc代表升序,desc代表降序,如果不写默认升序
2.order by用于子句中可以支持单个字段,多个字段,表达式,函数,别名
3.ORDER by子句,放在查询语句的最后面。LIMIT子句除外。

 示例演示

select
	字段名1,字段名2,...
from 表名
order by 字段名1 [asc | desc],字段名2[asc|desc]....
-- 特点
1.asc代表升序,desc代表降序,如果不写默认升序
2.order by用于子句中可以支持单个字段,多个字段,表达式,函数,别名
3.ORDER by子句,放在查询语句的最后面。LIMIT子句除外。


-- 1.使用价格排序(降序,默认升序)	
select * from product order by price desc;
-- 2.再价格排序的基础上,以分类排序(降序)
select * from product order by price desc,category_id desc;
-- 3.显示商品的价格(去重复),并排序(降序)、
select distinct price from product order by price desc;

演示效果 

MySQL-----DQL基础操作_第19张图片

MySQL-----DQL基础操作_第20张图片

MySQL-----DQL基础操作_第21张图片



▶ 聚合查询

▶ 简介

        之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个单一的值;另外聚合函数会忽略空值。

MySQL-----DQL基础操作_第22张图片

▶ 语法

     seletc 函数名(操作的列名) from 表名 where (在什么条件)

示例演示 

--聚合函数
/*
count()统计指定列不为NULL的记录行数;
sum()计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0
max()计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
min()计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
avg()计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0
-*/
-- 1查询商品的总条数
select count(pid) from product;
select count(*) from product;
-- 2查询价格大于200商品的总条数
select count(pid) from product where price>200;
-- 3查询分类为'c001'的所有商品的总和
select sum(price) from product where category_id='c001';
-- 4.查询商品的最大价格
select max(price) from product;
-- 5.查询商品的最小价格
select min(price) from product;
-- 6.查询分类为'c001'的所有商品的平均价格
select avg(price) from product where category_id='c002'

 演示效果MySQL-----DQL基础操作_第23张图片MySQL-----DQL基础操作_第24张图片MySQL-----DQL基础操作_第25张图片MySQL-----DQL基础操作_第26张图片MySQL-----DQL基础操作_第27张图片


聚合查询对null值的处理

1、count函数对null值的处理:
        如果count函数的参数为星号(*),则统计所有记录的个数。而如果参数为某字段,不统计含null值的记录个数。
2、sum和avg函数对null值的处理:
        这两个函数忽略null值的存在,就好象该条记录不存在一样。
3、max和min函数对null值的处理
        max和min两个函数同样忽略null值的存在。

求平均值时,对null的数据忽略不计,总数不加null的数据。

MySQL-----DQL基础操作_第28张图片

MySQL-----DQL基础操作_第29张图片



▶ 分组查询

简介

分组查询是指使用group by字句对查询信息进行分组。

格式

select 字段1,字段2,... from 表名 group by 分组字段 having 分组条件;

分组之后的条件筛选-having
▶  分组之后对统计结果进行筛选的话必须使用having,不能使用where

         where子句用来筛选FROM子句中指定的操作所产生的行
        group by子句用来分组WHERE子句的输出。
        having子句用来从分组的结果中筛选行

 

示例演示

-- 分组查询
-- 格式
select 字段1,字段2,... from 表名 group by 分组字段 having 分组条件;
-- 1.统计各个分类商品的个数
-- 注意 分组之后select的后边只能写分组字段和聚合函数
select category_id,count(*) from product group by category_id;

-- 分组之后的条件筛选-having
-- select字段1,字段.. from表名 group by分组字段 having分组条件;
-- 2.统计各个分类商品的个数,且只显示个数大于4的信息
select category_id '商品类别',count(*) '商品数量' from product group by category_id having count(*)>4;

演示效果

MySQL-----DQL基础操作_第30张图片

MySQL-----DQL基础操作_第31张图片

SQL语句执行顺序

MySQL-----DQL基础操作_第32张图片



▶ 分页查询

▶ 简介

        分页查询在项目开发中常见,由于数据量很大,显示屏长度有限,因此对数据需要采取分页显示方式。例如数据共有30条,每页显示5条,第一页显示1-5条,第二页显示6-10条。

        关键字---limit

▶ 语法格式

▶ 格式一 -- 显示前n条
        select 字段1,字段2...from 表名 limit n;
▶格式二 -- 分页显示
        select 字段1,字段2...from 表名 limit m,n;
        m:整数,表示从第几条所引开始,计算方式(当前页-1)*每页显示条数
        n:整数,表示查询多少条数据

示例演示


-- 分页查询
-- 格式一 -- 显示前n条
select 字段1,字段2...from 表名 limit n;
-- 格式二 -- 分页显示
select 字段1,字段2...from 表名 limit m,n;
m:整数,表示从第几条所引开始,计算方式(当前页-1)*每页显示条数
n:整数,表示查询多少条数据

-- 1.查询前5条记录
select * from product limit 5;
-- 2.从第四条开始显示,显示5条
select * from product limit 3,5;

演示效果

MySQL-----DQL基础操作_第33张图片

MySQL-----DQL基础操作_第34张图片



总结:DQL的语法总结

MySQL-----DQL基础操作_第35张图片

综合练习

show databases;
create database Mybase;

use mybase;

create table student(
	id INT comment '学号',
	NAME varchar(20) comment '姓名',
	gender varchar(2) comment '性别',
	chinese INT,
	english INT,
	math int
);


INSERT INTO student(id,NAME,gender ,chinese, english ,math) VALUES(1,'张明','男',89,78,90);
INSERT INTO student(id,NAME,gender ,chinese,english,math)VALUES(2,'李进','男',67,53,95);
INSERT INTO student(id,NAME, gender ,chinese,english,math)VALUES(3, '王五','女',87,78,77);
INSERT INTO student(id,NAME, gender ,chinese,english,math)VALUES(4, '李一','女',88,98,92);
INSERT INTO student(id,NAME,gender ,chinese,english,math)VALUES(5,'李财','男',82,84,67);
INSERT INTO student(id,NAME, gender ,chinese,english,math)VALUES(6,'张宝','男',55,85,45);
INSERT INTO student(id,NAME,gender , chinese,english,math) VALUES(7,'黄蓉', '女',75,65,30);
INSERT INTO student(id,NAME,gender , chinese,english,math) VALUES(7,'黄蓉','女',75,65,30);


-- 查询表中所有学生的信息。
select * from student;
-- 查询表中所有学生的姓名和对应的英语成绩。
select NAME '姓名',english '英语成绩' from student
-- 过滤表中重复数据。
select distinct * from student;
-- 统计每个学生的总分。
select NAME '姓名',chinese+english+math '总分'from student;
-- 在所有学生总分数上加10分特长分。
select NAME '姓名',chinese+english+math+10 '总分'from student;
-- 使用别名表示学生分数。
select NAME '姓名',chinese '语文成绩',english '英语成绩',math '数学成绩' from student;
-- 查询英语成绩大于90分的同学
select * from student where english>=90;
-- 查询总分大于200分的所有同学
select  NAME '姓名',chinese '语文成绩',english '英语成绩',math '数学成绩',(chinese+english+math) '总分' 
from student 
where chinese+english+math>200 ORDER BY (chinese+english+math) desc;
-- 查询英语分数在80-90之间的同学。
select NAME '姓名',chinese '语文成绩',english '英语成绩',math '数学成绩' 
from student
where english BETWEEN 80 and 90;

-- 查询英语分数不在80—90之间的同学。
select NAME '姓名',chinese '语文成绩',english '英语成绩',math '数学成绩' 
from student
where english <80 or english>90 ;


-- 查询数学分数为89,90,91的同学。
select * from student where math in(89,90,91);
-- 查询所有姓李的学生英语成绩。
select * from student where NAME like '李%'
-- 查询数学分80并且语文分80的同学。
select * from student where math = 80 and chinese=80;
-- 查询英语80或者总分200的同学
select  NAME '姓名',chinese '语文成绩',english '英语成绩',math '数学成绩',(chinese+english+math) '总分' 
from student 
where english= 80 or chinese+english+math=200 ORDER BY (chinese+english+math) desc;
-- 对数学成绩降序排序后输出。
select  * from student ORDER BY math desc;
-- 对总分排序后输出,然后再按从高到低的顺序输出
select  NAME '姓名',chinese '语文成绩',english '英语成绩',math '数学成绩',(chinese+english+math) '总分' 
from student 
where chinese+english+math>200 ORDER BY (chinese+english+math) desc;
-- 对姓李的学生总分成绩排序输出
select  *
from student 
where NAME like '李%' ORDER BY (chinese+english+math) desc;
-- 查询男生和女生分别有多少人,并将人数降序排序输出
select gender,count(*) as total_count from student group by gender ORDER BY total_count desc;

 

你可能感兴趣的:(数据库MySQL,mysql,数据库)