select * from t_student,t_class;
笛卡尔积,出现的数据条数是两张表条数乘积(这种结果没有意义)
数据库中 . 点翻译成 的
表别名
select t.c_id as id,t.c_name name,t.c_address address,c.c_id class_id,c.c_name class_name from t_student as t,t_class c;
修改后,不能出现笛卡尔积
select t.c_id as id,t.c_name name,t.c_address address,c.c_id class_id,c.c_name class_name from t_student as t,t_class c where t.c_class_id = c.c_id;
where 是筛选条件,先从from后数据源中作出笛卡尔积,再从里面挑选满足条件的结果。并不是在连接的时候就查出来了。
select * from 表1 inner join 表2 on 表1.列 运算符 表2.列
select t.c_id,t.c_name,c.c_name from t_student t inner join t_class c on t.c_class_id = c.c_id;
与之前的不一样,内连接先判断查询条件再进行连接,如果没有符合条件的,那么就不连接,就不显示结果。连接显示的是两张表的交集。
where是筛选条件 先确定好笛卡尔积,再进行筛选
on是连接条件 基于on后的条件进行连接
select t.c_id,t.c_name,c.c_name from t_student t inner join t_class c on t.c_class_id = c.c_id where t.c_gender = 2;
左连接查询的关键字是 left join
作用:查询的结果为根据左表中的数据进行连接,如果右表中没有满足条件的记录,则连接空值。
select t.c_id,t.c_name,c.c_name from t_student t left join t_class c on t.c_class_id = c.c_id;
select t.c_id,t.c_name,c.c_name from t_student t left join t_class c on t.c_class_id = c.c_id where c.c_name = '网络工程18级一班';
select t.c_id,t.c_name,c.c_name from t_student t left join t_class c on t.c_class_id = c.c_id where c.c_name = '网络工程18级一班'order by t.c_id desc;
select t.c_id,t.c_name,c.c_name from t_student t left join t_class c on t.c_class_id = c.c_id where c.c_name = '网络工程18级一班'order by t.c_id desc limit 3;
看SQL语句的时候找关键字顺序: from , left join , on, where ,order by,select
表名t_
点 . 用在成员上,哪张表中的
查询结果是以右表为基准,连接左表中的数据,如果没有符合条件的数据,在右表数据后,连接NULL
右连接作为了解,因为右连接完全可以使用右链接替代
select c.c_name 班级,t.c_name 姓名 from t_student t right join t_class c on c.c_id = t.c_class_id;
select c.c_name 班级,t.c_name 姓名 from t_class c left join t_student t on c.c_id = t.c_class_id;
上面结果一样。
作用:在一个 select 语句中,嵌入了另外一个 select 语句, 那么被嵌入的 select 语句称之为子查询语句。
标量子查询:子查询结果是一行一列
查询班级中年龄大于平均年龄的学生信息
select * from t_student where c_age > (select avg(c_age) from t_student);
列级子查询:
查询所有学生所在班级的名称
select c_id,c_name from t_class where c_id in (select distinct c_class_id from t_student);
行级子查询:
查找班级中年龄最大,所在班号最小的学生
select * from t_student where (c_age,c_class_id) = (select max(c_age),min(c_class_id) from t_student);
元组
将后面的一行多列结果与前面括号里的内容依次进行比较。
select * from t_student where c_age = (select max(c_age) from t_student) and c_class_id = (select min(c_class_id) from t_student);
作用:在查询数据时,只有一张表,查询时使用自己连接自己。
语法:select * from 表 as 表别名1 inner join 表 表别名2 on 表别名1.列 运算符 表别名2.列 where 条件
select city.* from areas as city inner join areas as province on city.pid = province.aid where province.atitle = '山西省';
select dis.* from areas as dis inner join areas as city on city.aid = dis.pid where city.atitle = '广州市';
自连接查询没有自己的方式,可以使用之前的语句进行连接。
重点:内连接、左连接、子查询
30条军规:
特性:
操作:
select goods.id id,goods.name name ,goods.price price,cates.name cname,brands.name bname from goods inner join goods_cates cates on goods.cate_id = cates.id inner join goods_brands brands on goods.brand_id = brands.id;
创建一张虚拟表出来 视图
create view v_goods_info as select goods.id id,goods.name name ,goods.price price,cates.name cname,brands.name bname from goods inner join goods_cates cates on goods.cate_id = cates.id inner join goods_brands brands on goods.brand_id = brands.id;
查看视图:
show tables
使用视图;
select * from v_goods_info;
select * from v_goods_info where cname = '笔记本';
select * from v_goods_info where cname = '笔记本' order by price desc limit 2;
删除视图;
drop view v_good_info;
概念:
能够快速查询数据的线索就称之为索引。
索引原理
索引的原理就是为无序存放的数据建立一个有序的对应关系,通过这个关系可以快速查找数据。
索引的目的在于提高查询效率。
索引使用:
show index from 表名
create index 索引名称 on 表名(字段名称(长度))
drop index 索引名称 on 表名;
查询验证
set profiling=1;
select * from test_index where title='ha-99999;
create index title_index on test_index(title(10));
select * from test_index where title='ha-99999;
show profiles;
desc select * from test_index where title='ha-99999';
索引小结:
InnoDB存储引擎支持事务
事务 Transaction 是指作为一个基本工作单元执行的一系列SQL语句的操作,要么完全地执行,要么完全地都不执行。
begin;
或 start transaction;
start不可以,但是begin可以单独使用;commit;
rollback;
事务的存在是解决数据在操作过程中的 ACID 问题。
事务要么提交,全部成功,要么回滚,一条都不进行。
修改更新密码后,需要刷新一下
flush privilege;
读写分离
负载均衡