0%

MySQL查询

MySQL 数据库使用SQL SELECT语句来查询数据。你可以通过 mysql> 命令提示窗口中在数据库中查询数据,或者通过PHP脚本来查询数据。

MySQL查询

单表查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 全字段查询
select * from xb;

# 指定字段查询
select name,age from xb;

# where条件查询
select * from xb where age=18 and name="小白";

# like模糊查询 % 匹配任意多个字符 _ 匹配任意一个字符
select * from xb where name like '小%';

# as取别名
select co.c_id from course as co;

多表查询

内连接

无条件连接:第一张表的每一项都会和另一张表的每一项依次组合。

1
2
3
4
# 没有条件的连接查询,没有很大的意义
# 笛卡尔坐标轴 a表的每一项都和b表所有项匹配
select * from stu inner join college;
select * from stu,college;

有条件连接:+on子句,根据条件来进行连接

1
2
3
4
5
6
# 带条件多表查询 通过主外键关联然后去查询
select * from stu inner join college on stu.dept_id=college.d_id;
select * from stu as s inner join college as c on s.dept_id=c.d_id;

# 也可以where
select * from stu as s,college as c where s.dept_id=c.d_id;

外连接

左右连接,效率更优,选择优先小表为主表

左连接

A left join B 会以左边的A表为主,展式左边A表的所有数据,展式右边B表中符合ON子句中条件的数据,没有为空。

1
select * from stu as s left join college as c on s.dept_id=c.d_id;

右连接

A right join B右连接和左连接类似,只是作用相反

1
select * from stu as s right join college as c on s.dept_id=c.d_id;

全连接

union all左右连接的组合

1
2
3
mysql> select * from stu as s left join college as c on s.dept_id=c.d_id
-> union all
-> select * from stu as s right join college as c on s.dept_id=c.d_id;

union左右连接的组合+去重

1
2
3
mysql> select * from stu as s left join college as c on s.dept_id=c.d_id
-> union
-> select * from stu as s right join college as c on s.dept_id=c.d_id;

字表查询

在一个SQL语句中出现两个SQL语句,就是子表查询

1
2
3
4
5
6
7
8
# join on
mysql> select * from college c join
-> (select stu_id,s_name,sm_age,sm_sex,sm_phone,dept_id from stu s join stu_mes sm on sm.stu_id=s.s_id)
-> as e on e.dept_id=c.d_id;

# where
mysql> select * from stu s where s.dept_id=
-> (select d_id from college c where c.d_name='机电工程');

查询的其他操作

排序

order dyasc升序(默认) desc降序

1
2
3
# 以年龄进行排序
select * from stu_mes order by sm_age; # 默认升序
select * from stu_mes order by sm_age desc; # desc降序

limit

限制显示的行数

1
2
select * from stu_mes order by sm_age desc limit 3;  # 限制显示三行
select * from stu_mes order by sm_age desc limit 1,2; # 从下标为1开始显示两行

分组查询

GROUP BY,常用于分组统计

1
2
3
4
5
6
# 使用group by后,会按照group by后面的字段进行分组,且必须是明确的字段,不能是*,因此select后面也不能是*
select c.d_id,c.d_name,count(*) from college c join stu s on c.d_id=s.dept_id group by c.d_id,c.d_name; # 统计每个学院里面有多少学生个数。

# having对分组查询的结果进行二次筛选
# 注意:having后的字段必须是select后出现过的
select c.d_id,c.d_name,count(*) from college c join stu s on c.d_id=s.dept_id group by c.d_id,c.d_name having count(*)>1;

mysql函数(了解)

1
2
3
4
5
6
7
8
9
10
11
12
13
# 把null处理成自己指定的数据
select *,ifnull(stu.dept_id,420) from stu;

# 字符串长度截取
# left是从左边开始截取
select *,left(s_name,1) from stu;
# right是用右边开始截取
select *,right(s_name,1) from stu;
#substring也是字符串截取,但是可以指定起始位置
select *,substring(s_name,2,1) from stu; # 从位置2开始截取1个字符

# 字符串拼接
select *,concat(s_name,s_id) from stu;

优化

1.尽量避免整表扫描,如SELECT *
2.建立合适的索引

1
alter table stu add index(s_name);  #给stu表的字段s_name字段添加索引

3.使用合适的存储引擎
InnoDB:支持事务,mysql默认引擎,安全性高速度慢
4.在JOIN中,尽量用小表LEFT JOIN 大表
5.除非十分必要,尽量不要使用ORDER BY(排序),GROUP BY (分组)和 DISTINCT(去重),尽量用索引来代替

学习方向

基本操作(增删改查),整理清楚

1
2
3
4
如果对数据库感兴趣可以参考以下的学习路线:
1.先去理解数据库的索引,视图等功能
2.考虑分区分页等存储问题
3.考虑主从,分布式的实现方法和原理