mysql查询常用查询关键字解析

2020-11-08  本文已影响0人  Restart白蓝

创建测试表

CREATE TABLE bailan_student (
 id int, -- 编号
 name varchar(20), -- 姓名
 age int, -- 年龄
 sex varchar(5), -- 性别
 address varchar(100), -- 地址
 math int, -- 数学
 english int -- 英语
);

INSERT INTO bailan_student(id,NAME,age,sex,address,math,english) VALUES
 (1,'马云',55,'男','杭州',66,78),(2,'马化腾',45,'女','深圳',98,87),(3,'马景涛',55,'男','香港',56,77),
(4,'柳岩',20,'女','湖南',76,65),(5,'柳青',20,'男','湖南',86,NULL),(6,'刘德华',57,'男','香港',99,99),
(7,'马德',22,'女','香港',99,99),(8,'德玛西亚',18,'男','南京',56,65);

CREATE TABLE `bailan_things` (
  `id` int NOT NULL COMMENT '主键',
  `bs_id` int NOT NULL COMMENT '外键',
  `things` varchar(50) DEFAULT NULL COMMENT '拥有的东西',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO bailan_things VALUES (1, 3, '铅笔'),(2, 1, '铅笔'), (3, 1, '钱包'), (4, 2, '钱包'), 
(5, 3, '手表'),(6, 3, '钱包'), (7, 4, '钱包'), (8, 4, '电脑');

CREATE TABLE `bailan_student2` (
  `id` int DEFAULT NULL,
  `name` varchar(20) DEFAULT NULL,
  KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO bailan_student2(id,NAME) VALUES
 (1,'马云'),(2,'马化腾');

1、order by

asc升序(默认)
desc降序

select * from bailan_student order by age desc;
select * from bailan_student order by math desc,english asc;

2、limit

limit y 分句表示: 读取 y 条数据
limit x, y 分句表示: 跳过 x 条数据,读取 y 条数据
limit y offset x 分句表示: 跳过 x 条数据,读取 y 条数据
注:开始索引=(当前页码 - 1)* 读取条数

检索5条记录(1-5)
select * from bailan_student limit 5; 
select * from bailan_student limit 0,5;     
select * from bailan_student limit 5 offset 0;
检索记录4条记录(4-7)
select * from bailan_student limit 3,4; 
select * from bailan_student limit 4 offset 3; 

3、聚合函数

avg(字段名) : 求字段的平均值
sum(字段名) : 求字段的和
max(字段名) : 求字段的最大值
min(字段名) : 求字段的最小值
count(字段名) : 统计该字段的记录的个数

select avg(math) from bailan_student;
select sum(english) from bailan_student;
select max(age) from bailan_student;
select min(age) from bailan_student;
select count(id) from bailan_student;

4、distinct

作用:过滤字段的重复值

select distinct address from bailan_student;

5、group by

通常配合聚合函数使用

求各地区的的数学平均分,及人数
select address ,avg(math) ,count(id) from bailan_student group by address;

6、between

取介于两个值之间的数据范围。数值、文本或者日期。

取20岁到50岁之间的学生
select name from bailan_student  where age  BETWEEN 20 and 50  ;

7、where/having

这两个放在一起讲
where在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来。
where后不可以跟聚合面数,having可以进行聚合面数的判断。

求各地区的的数学平均分,及人数
select address ,avg(math) ,count(id) from bailan_student group by address;
求各地区的的数学平均分,但人数要大于等于2的
select address ,avg(math) ,count(id) from bailan_student  where age >17 group by address having count(id)>=2;

8、Alias

简写 as 更简写可以不写
给列名表名一个别名

求各地区的英语总分别名total
select address ,sum(english) as total from bailan_student group by address;

9、like

多用于模糊查询
_等于一个
%等于多个

把姓马的查出来
select name from bailan_student WHERE   name like   '马%';
把姓马的,并且是是两个字的查出来
select name from bailan_student WHERE   name like   '马_';

10. inner join

内连接 两个表的交集 inner可省略

隐式写法(常见子查询做为虚拟表)
select * from bailan_student as bs,bailan_things  as bh  WHERE bs.id =bh.bs_id;
显式写法
select * from bailan_student as bs inner join bailan_things  as bh  on bs.id =bh.bs_id;

11.left join

左连接 left join 是left outer join的简写
(外)连接,左表(a_table)的记录将会全部表示出来,而右表(b_table)只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。

select * from bailan_student as bs left join bailan_things as bh on bs.id = bh.bs_id;

12、right join

右连接 right join是right outer join的简写
与左(外)连接相反,右(外)连接,左表(a_table)只会显示符合搜索条件的记录,而右表(b_table)的记录将会全部表示出来。左表记录不足的地方均为NULL。

select bs.id as bsid,bh.*  from bailan_student as bs  right join bailan_things as bh on bs.id = bh.bs_id;

13、union

[all | distinct] 这两个是可选的

 单union并不会吧重复的值查询出来,也就是加不加distinct不影响结果
 select name from bailan_student  where address="深圳"
 union 
 select name from  bailan_student2
 加上all会拿到全部值
 select name from bailan_student where address="深圳"
 union all
 select name from  bailan_student2

14、null值

MySQL中判断null 是不能用!=这样子判断的,无效
需要使用is null is not null

查询英语成绩为null的
select name  from  bailan_student where english is null;
查询英语成绩不为null的
select name  from  bailan_student where english is not null;

15、in /not in

相当于多个or

两条语句的结果是相反的
select name from bailan_student where id in(2,3,4)
select name from bailan_student where id not in(2,3,4)
in的子查询返回必须只有一个字段
select name from bailan_student where id in(select bs_id from bailan_things);

16、exists

exists不关心子查询的返回值内容是什么,只关系存在不存在返回值,既对应返回真假
注:通常查询表大的用exists,子查询表小的用in

此条效率效果要比上述的in高,子查询还走了索引。
select name from bailan_student bs where exists(select name from bailan_things bh where bh.bs_id =bs.id)
上一篇下一篇

猜你喜欢

热点阅读