Mysql数据库学习(3)DQL

恩 ,在数据库中一直都是认为查询是最难的。因为种类多,花样也太多了,要查哭。但还是学到了很多东西啊,在以后的开发中一定可以用上的,回想起我们实践周老师给讲的。

一个模块 增删改查 至少8个功能
    1.查询全部
    2.按条件查询
    3.按主键查询
    4.按分页查询
    5.增加一个
    6.批量增加
    8.按主键修改主要字段
    9.特殊修改(修改一个字段就需要一个页面,例如修改密码 找回密码 审核)
    10.按主键删除一个
    11.批量删除

查询中要用到的:

字句: where/having /limit(o,l) / ORDER BY(desc,asc) /  GROUP BY /

方式:精确查询、模糊查询

类型:联合查询 / 子查询 / 连接查询  针对多张表所做的查询
         联合查询: 数据容易造成冗余,影响查询速度。

0.基本查询

select sid,sname,sage,ssex,szhuanye from student
select * from student 这两句话的作用是等效的,你可以把所有的字段全部列出来,也可以写星星(*)代表所有的字段。在实际应用中这种查询是存在的,比如查看所用用户信息。

1. WHERE条件子句
# = !=(<>) > < >= <=  is   is not
# and or not
# between...and (包含边界)
# in(value,value,value)

只能说where是非常强大的,基本上要添加条件都能搭得上这个关键字。where一下就很舒服~如果是多个条件用and关键字连接
利用了where很容易见名知意,翻译起来比较顺畅我觉得。

select sid,sname,sage,ssex,szhuanye from student where sid=100012
select sid,sname,sage from student where sage=19

扫描二维码关注公众号,回复: 3957278 查看本文章

select sid,sname,sage,ssex,szhuanye from student where sage>=18 and  sage<=20
select * from student where sage not between 18 and 20
select * from student where sage=18 or sage=20 or sage=25
select * from student where sage in(18,20,25)


# 起别名: as
select sage as 新年龄 from student where sid=100000

# 把查询结果看做临时的虚拟表

select uid,username as '用户名' from users

查询结果只能看做"虚拟表" : 具有表的形式,但没有物理存在

#在查询中使用聚合函数 count sum avg min max

聚合函数
统计
select count(uid) as '用户总数' from users
select count(uid) from users where age>30

求和
select SUM(age) as '年龄之和' from users

求平均值
select avg(age) as '平均年龄'  from users

最大值和最小值
select min(age) as '最小年龄' from users;
select max(age) as '最大年龄' from users

# where中使用模糊查询 LIKE
# 通配符:  %表示任意数量的任意字符 _表示一个单位的任意字符,我觉得模糊查询是第二简单的,哈哈哈。只要按照语法匹配一下,他叫什么,姓什么,记清楚%和_的含义,就很容易写出满足条件的sql语句。

名字中带有"静"
select * from users where username LIKE '%静%'

姓张的人有谁
select * from users where username LIKE '张%'

名字是两个字的人有哪些
select * from users where username LIKE '__'

2.LIMIT 限定(用于实现分页)
limit offset,length
offset: 起始位置, 从0开始
length:长度
select * from users LIMIT 0,3
select * from users LIMIT 5,3

规定每页显示3条
第1页:
select * from users LIMIT 0,3
第2页:
select * from users LIMIT 3,3

页数: pageNumber
每页记录数: pageSize

 根据变量,任意页数/任意记录数
select * from users LIMIT (pageNumber-1)*pageSize,pageSize

3.order by 排序
asc 升序 默认
desc 降序
select * from users ORDER BY age asc
select * from users ORDER BY age desc

4.group by 分组
select count(uid) from users where address='桐梓林'
select count(uid) from users where address='九眼桥'

select count(uid),address from users GROUP BY address

5.having子句  
#group by带有条件:
# 如果和字段有关的条件使用where,且where放在group by前边
# 如果和查询结果有关的条件使用having,且having放在group by的后边

--------------------------------

6. 联合查询 多张表针对指定的字段全查询过程(数量:笛卡尔积)
A表  B表   通过A和B之间的字段的联系,建立对等关系

--------------------------------
7. 子查询,方式一,where型子查询
# 查询所有年龄比平均年龄小的同学信息

-- select sid,sname,sage,avg(sage) as a from student having sage<a

-- 把括号内部看做内查询, 括号外看做外查询
select *  from student where sage<(select avg(sage) from student)

# 本质上,把内查询的结果看成一个定值,供外查询作为查询条件
    注意: 内查询的结果必须是1个值

#子查询,方式二
# in / not in

select * from student where sid  in
(select sid from students where sex='男')

# 本质上,把内查询的结果看成一个虚拟表,供外查询作为查询条件

-- 子查询方式三: from型子查询
本质: 把子查询的结果看做一张表
select * from (select * from tableName)

-- 使用not in 改写分页操作
    每页显示10条记录
-- 第1页: 排除0页的内容之外的记录数
    select * from tableName limit 0,10
-- 第2页: 排除1页的内容之外的记录数
    select * from tablename where id
    not in(select * from(select id from tableName limit 0,10) as t) limit 0,10

-- 第3页: 排除1和2页的内容之外的记录数

注意: 子查询在执行效率上,常常会和连接查询做比较
    通常, 能使用连接查询的时候尽量不用子查询 ,但非绝对
    具体的使用方式,要通过执行速度的测试
--------------------------------

8. 连接查询: 左连接 右连接 内连接
-- 连接条件使用on(不使用where)

-- 左连接: left join
-- 表a left jion 表b , 数据将参照表a的完整性,表b去匹配表a的数据,如果没有匹配的数据就显示null

select * from students s
LEFT JOIN score sc
on s.sid = sc.sid
where s.age>18

-- 右连接: right join
-- 表a right jion 表b   等价于:   表b left jion 表a
select * from student s RIGHT JOIN score sc on s.sid = sc.sid

-- 内连接: inner join
-- 在保证连接的表之间都不存在null的情况下,进行数据的匹配
select * from student s INNER JOIN score sc on s.sid = sc.sid

猜你喜欢

转载自blog.csdn.net/formydream111/article/details/82753754