对于一个初学数据库的人来说,最主要的还是要掌握DQL数据库查询语言和DML数据操作语言。
这里主要对DQL进行简单的总结,实质就是学习的笔记。
数据查询语言基本的语句结构为select * from table_name;
1. 条件语句where关建字,支持多种运算符
- 比较运算符
- > < = >= <= (!= <>)其中<> 与!= 均是不等于的意思
- 逻辑运算符
- and 与
- or 或
- not 非
- 模糊查询
- like
- _匹配任意一个字符
- select * from table_name where name like '周_' #查找table_name表中name字段为两个字,且第一个字为周的信息
- %匹配任意多个字符
- select * from table_name where name like '周%' # 查找table_name表中name字段为多个字,且第一个字为周的信息
- _匹配任意一个字符
- like
- 范围查询
- in 表示在一个非连续的范围内 与 not in 不非连续的范围内
- select * from table_name where age in (18,22,24,26) #查找table_name表中age字段是18或22或24或26的信息
- between and 表示在一个连续的范围内(等价于18<=age<=38)与 not between and
- select * from table_name where age between 18 and 38 #查找table_name表中age字段是在18到38之间的所有信息
- in 表示在一个非连续的范围内 与 not in 不非连续的范围内
- 空判断
- is null 查询为空的内容(where语句中)
- select * from student where height is null; # 判断身高字段为空的内容
- is not null 查询不为空的内容(where语句中)
- select * from student where height is not null;
- is null 查询为空的内容(where语句中)
注:
优先级由高到低的顺序为:
小括号,not,比较运算符,逻辑运算符
and比or先运算,如果同时出现并希望先算or,需要结合()使用
2. 分页查询(limit)
select * from 表名 limit start=0,count
1. limit 3 :从第一条开始取3条
注:start默认为0,即第一条开始
2. limit 1,3: 从第2条后边开始取3条
n个页面,每个页面显示m条数据
select * from 表名 limit (n-1)*m,m
3. 聚合函数:不包含字段为空的行数
概念:
聚合函数又称组函数,操作的对象就是一组数据,默认情况下聚合函数会对当前所在表当作一个组进行统计。
聚合函数有以下几个特点:
* 每个组函数接收一个参数(字段名或者表达式)
* 统计结果中默认忽略字段为NULL的记录 要想列值为NULL的行也参与组函数的计算,必须使用IFNULL函数对NULL值做转换。
* 不允许出现嵌套 比如sum(max(xx))
1. count(*) 表示计算总行数,括号中写星与列名,结果是相同的
注:count计算的是内容不为空的行数
2. max(列) 表示求此列的最大值
select max(age) from students;
3. min(列) 表示求此列的最小值
select min(height) from students;
4. sum(列) 表示求此列的和
select sum(age)/count(age) from students;
5. avg(列) 表示求此列的平均值
select avg(age) from students;
6. round默认保留0位小数 round(数值,保留的位数)
select round(avg(age),1) from students;
注: round不是组函数
注:聚合函数操作的对象是一组数据,可以是某个表数据,也可以是表的分组数据(group by),但不能是拼接的数据(join).
4. 分组函数,对于空的字段也会进行分组
一旦对表中数据进行分组,那么分组的结果将不再是之前的二维表结构,而是多维结构,就不能直接使用SQL语句显示全部数据,即不能直接使用select *。
使用特点:
1. group by的含义:将查询结果按照1个或多个字段进行分组,字段值相同的为一组
2. group by可用于单个字段分组,也可用于多个字段分组
group 对照看看正则
1. select gender(这里只能写被分组的字段) from students group gender;
2. select gender,group_concat(name) from students group by gender
注:因为分组之后的结果不再是普通的二维结构了,不能直接显示全部,如果需要查看每个分组中每个成员的某一个字段group_concat()可以将同组成员的某一个字段进行拼接在一个???显示
3. select gender,group_concat(name),count(*) from students group by gender
注:在没有分组之前,聚合函数是整个表,如果结合了group by之后,统计的就是每一个小的分组
按照性别gender分组,前面可以不写gender,写其他的字段需要加group_concat(字段名)
4. having 判断,筛选:对分组的结果进行条件筛选
select gender,group_concat(name),count(*) from students group by gender having count(*) <3;
例如:通过身高和年龄进行分组,然后筛选性别为男的字段,注意gender也需要加group_concat(gender)
select height,age,group_concat(name) from students group by height,age having group_concat(gender) ="男";
注:1. where对表中记录进行条件的筛选
having 对分组的结果进行条件筛选
2. 多个字段的分组,要同时满足多个字段才会分为一组
select height,age,group_concat(name) from students group by height,age;
5. 在最后一行加一个汇总的结果group by 后加 with rollup
1. select gender,group_concat(name),count(*) from students group by gender with rollup;
5. 连接查询
内连接:只取两个表有关联的数据
外连接;内连接+外部数据
右(外)连接: 内连接 + 外部数据来自于左表数据,右表于左表中不存在的数据使用null填充
左(外)连接: 内连接 + 外部数据来自于右表数据,左表于右表中不存在的数据使用null填充
笛卡尔积(交叉连接):左表每一行分别拼接右表每一行
on 条件:对笛卡尔积的结果中的数据进行过滤
内连接:
select * from hero jion gongfu on hero.kongfuid = gongfu.id;
左链接:
select * from hero left jion gongfu on hero.kongfuid = gongfu.id;