SQL查询语句基础篇

168 阅读6分钟

查询语句

简单查询

select 字段名 from 表名;

其中要注意:

select和from都是关键字。

字段和表名都是标识符。

强调:

对SQL语句来说,是通用的

所有SQL语句都是“;”结尾

另外SQL语句不区分大小写,都行。

查询所有字段
第一种方式:可以吧每个字段都写上(推荐)
第二种方式可以用*
这种方式的缺点:
    1.效率低
    2.可读性差
在实际开发中不建议,你可以在**Dos**命令窗口想快速看一看全表数据可以采用这种方式。
​
给查询的列起别名使用AS关键字起别名。
mysql去重函数distinct  用法:select distinct 需要去重的字段 from表;

分组查询

# group by :分组
# 对stus表的数据按照班级进行分组,并看每个班级都有多少人
select gradeld,count(*) as num from stus group by gradeld;
# 对stus表的数据按照班级进行分组,查看每个班级都有多少人以及班级英语平均分;
select gradeld,count(*) as num,avg(english) as english
from stus
group by
gradeld;
# having:过滤
# 对stus表的数据按照班级进行分组,查看每个班都有多少人以及班级英语平均分;
select gradeld,count(*) as num,avg(ebglish) as english from stus group by 
gradeld having count(*) > 1;
​
​
# having和where区别
# 执行时间不一样:where是分组之前进行限定,不满足where条件就不参与分组,而having是分组之后对结果进行过滤
# 可判断的条件不一样:where不能对聚合函数进行判断,having可以
# where > 聚合函数 > having

模糊查询

需要配合 like 使用

# % 多个任意字符串
# 查询stus以路开头的学生信息:
select * from stus where name like "路%";
# 查询stus表中name以某某结尾的学生信息:
select * from stus where name like '%某某';
# 查询stus表中name中包含猪的学生信息:
select * from stus where name like '%猪%';
​
# _ 单个字符
# (_代表一个字符,可以使用多个_)
# 查询stus表中以路开头的且名字长度为2的学生信息;
select * from stus where name like '路_';
# 查询stus表中以路开头的且名字长度为3的学生信息;
select * from stus where name like '路__';
# 查询stus表中name以路开头以某结尾的且名字长度为3的学生信息:
select * from staus where name like '路_某';

排序查询

# order by
# ASC 升序(默认是升序,所以不指定关键字也可以)
# 查询stus表name字字段,要求按照年龄的升序进行排序;
select name from stus order by age;
# 查询stus表中名字,年龄字段要求按照年龄大于7进行筛选之后按照年龄升序进行排列
select name from stus where age > 7 order by age;
# DESC 倒序
# 查询stus表中name字段,要求按照年龄的升序进行排序,如果年龄相同在按照英文成绩降序排列:
select name from stus order by age,english desc; # sql必知必会有讲解
# 查询stus表中name字段,要求按年龄的升序进行排序,并通过limit返回一条数据,即年龄最小的;
select name from stus order by age asc limit 1;
​
# 位置问题
# 在使用order by 子句对检索出得数据进行排序时,应该保证它是位于from,如果没有条件,应位于where之后,如果使用limit,它必须位于order by之后,使用子句的次序不会产生错误

条件查询

# 大于 >
# 查找stus表中年龄大于18岁的学生姓名;
select name from stus where age > 18;
# 小于 <
# 查找stus表中年龄大于18岁的学生姓名;
select name from stus where age < 18;
# 等于 =
# 查找stus表中年龄大于18岁的学生姓名;
select name from stus where age = 18;
# 大于等于 >=
# 查找stus表中年龄大于18岁的学生姓名;
select name from stus where age >= 18;
# 小于等于 >=
# 查找stus表中年龄大于18岁的学生姓名;
select name from stus where age <= 18;
# 不能等于 <> 或 !=
# 查找stus表中年龄大于18岁的学生姓名;
select name from stus where age != 18;
# BETWEEN...and... 在某个范围内(都会包含)
# 查找stus表中年龄在10~18之间的学生姓名;
select name from stus between 10 and 18;
# IN(...) 多选
# 查找stus表中年龄为15和16的学生姓名;
select name from stus where age in(7,8);
# IS NULL——是NULL
# 查找stus中名字为空的学生信息;
select * from stus where name is null# IS NOT NULL——不是NULL
# 查找stus中名字不为空的学生信息;
select * from stus where name is not null# AND或&&&——并且
# 查找找stus表中年龄为18岁的路某的学生信息;
select *  from stus where name = '路某' AND age = '18';
# OR或||——或者
# 查找stus表中名字叫路某或者叫张三的学生信息;
select * from stus where name = '路某' OR name = '张三'

多表查询

# 连接查询
# 内连接
# 相当于查询多个表的交集
# 显示内连接
# 使用 inner join关键字,条件使用on关键字
select grade_name,name from 表名1 inner join 表名2 on stus.gradeld =grade.id;
# 隐式连接
#内连接还有一种隐式的写法,即不需要显示的指定inner join关键字,需要注意,使用隐式内连接条件的关键字要使用where而不是on
select grade_name,name from grade.stus where stus.gradeId = grade.id;
# 外连接
# 左外连接
# 相当于查询A表所有数据的交集部分数据
# 左(外)连接,在表的记录将会全部表示出来,而右表只会显示符合搜索条件的记录,右表记录不足的地方均为NULL
# 语法:
# LEFT JOIN ON
# LEFT OUTER JOIN ON
# 注意:left join是left outer join的简写
select name,grade_name from stus s left outer join grade g on s.id = g.id;
select name,grade_neme from stus s left join grade g on s.id = gid;
# 右外连接
# 相当于查询B表所有数据的交集部分数据
# 右(外)连接,右表的记录将会全部显示出来,而左表只会显示符合搜索条件的记录。左表记录不足的地方均为NULL
select name,grade_neme from stus s right join grade g on s.id = gid;
# 子查询
# 查询嵌套查询页也称为子查询
# 单行单列
# 作为条件值,使用 = != < >等进行条件判断
# 语法:
# select 字段列表 from 表 where 字段名 = (子查询);
# 例如:查询stus表名叫路某的在几班
# 1.首先,要在stus表中查询名字为路某的gradeId是多少
# 2.根据查询到的gradeId再去grade查询相对应的grade_name
select grade _name from grade where id = (select gradeld from stus where name = "路某");
# 多行单列
# 作为条件值,用in等关键字进行条件判断
# 语法:
select 字段列表 fromwhere 字段名 in (子查询);
# 多行多列
# 作为虚拟表
select 字段列表 from (子查询) where t;

聚合函数

# AVG()返回某列的平均值
# 查看stus表学生平均英语成绩,并其一个别名作为显示平均成绩字段;
select avg(english) as avgEnglish from stus;
# COUNT()返回某列的行数
# 查看stus表一共多少行,并起一个别名作为显示的字段;
select count(*) as num from stus;
# MAX()返回某列的最大值
# 查看stus表中英语成绩最高分,并起一个别名作为显示最高分的字段;
select max(english) as score from stus;
# MIX()返回某列的最小值
# 查看stus表中英语成绩最低分,并起一个别名作为显示最低分的字段;
select mix(english) as score from stus;
# SUN()返回某列之和
# 查看stus表中英语成绩总分,并起一个别名作为显示总的字段;
select sum(english) as score from stus;

\