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 dy,asc升序(默认) 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(去重),尽量用索引来代替