MySQL复杂查询

engine引擎InnoDB :

mysql中show engines\G(或者show engines;) 查看MySQL支持的引擎,5.5.5之后默认引擎改为InnoDB,不过我的5.5.32也是默认InnoDB引擎
alter table test_InnoDB engine = MyISAM; //修改数据表的引擎 , 修改后show create table test_InnoDB; 查处的引擎是修改后的

MySQL中InnoDB引擎的特点:
支持事务;行级锁定;支持外键约束,不支持全文索引,5.5之前支持,后面不再支持;具有非常高效的缓存特性;支持分区,表空间;和MyISAM相比,InnoDB对于硬件资源要求比较高
Innodb 支持事务,支持行级锁,更好的恢复性,高并发下性能更好(因为行级锁,锁定当前行)
使用场景:支持事务的业务;高并发;数据读写及更新比较频繁(微博);数据一致性要求高的业务(转账,充值)

auto_primary自增字段 :

mysql中不必将自增列设置为主键,只是自增列必须为key,添加unique属性即可(不添加会创建表失败),像下面这样就可以。
create table test_auto2 (id int auto_increment unique, name varchar(32) primary key , aaa int);

AUTO_INCREMENT类型主键不用手动维护,默认从1开始
insert into test_ip2 (name,ip) values (‘ccc’ ,789 );
Query OK, 1 row affected (0.01 sec)

mysql> select * from test_ip2;
+—-+——+—–+
| id | name | ip |
+—-+——+—–+
| 1 | ccc | 789 |
+—-+——+—–+
1 row in set (0.00 sec)

ip转换int函数inet_aton :

mysql中储存Ip:
CREATE TABLE test_ip (
id int AUTO_INCREMENT,
name varchar(32) NOT NULL,
ip int(10) unsigned NOT NULL,
PRIMARY KEY (id)
) engine = innodb ;

insert into test_ip values (1, ‘aaa’ , 123 );
insert into test_ip values (2, ‘bbb’ ,456 );
insert into test_ip (name,ip) values (‘ccc’ ,789 );

insert into test_ip (name,ip) values ( ‘ddd’ , inet_aton(‘127.0.0.1’)); // 必须严格是inet_aton(‘a.b.c.d’)一个空格也不能多,单引号也不能少

select id , name , inet_ntoa(ip) as ip from test_ip;

修改字段属性
alter table test_varcharN modify name varchar(12);

分页:

int cur = 2 ;//当前页
int pagesize = 10 ;//页面大小
select from test_data limit (cur-1)pagesize,pagesize ;

连接(联合)查询

create table tab_cates(
    id int auto_increment primary key,
    cate_name varchar(20) not null,
    parent_id int not null);


insert into tab_cates(cate_name, parent_id) values('数码产品', 0);
insert into tab_cates(cate_name, parent_id) values('家用产品', 0);
insert into tab_cates(cate_name, parent_id) values('笔记本', 1);
insert into tab_cates(cate_name, parent_id) values('智能手机', 1);
insert into tab_cates(cate_name, parent_id) values('电器', 2);
insert into tab_cates(cate_name, parent_id) values('家具', 2);
insert into tab_cates(cate_name, parent_id) values('冰箱', 5);
insert into tab_cates(cate_name, parent_id) values('洗衣机', 5);
insert into tab_cates(cate_name, parent_id) values('汽车品牌', 0);
insert into tab_cates(cate_name, parent_id) values('别克', 9);
insert into tab_cates(cate_name, parent_id) values('宝马', 9);
insert into tab_cates(cate_name, parent_id) values('雪佛兰', 9);
insert into tab_cates(cate_name, parent_id) values('家纺', 0);

select * from tab_cates;

ZCbop6.png

内连接

inner join

select c.id , c.cate_name , p.cate_name from tab_cates c inner join tab_cates p on c.parent_id = p.id;

ZPwFsg.md.png

外连接

左外连接

left join

右外连接

right join

全连接

full join

insert into select

insert into test_copy (name,cate) select c.cate_name , p.cate_name from tab_cates c inner join tab_cates p on c.parent_id = p.id;

视图view

create view view_test_copy as select a.id , a.cate_name , b.cate from tab_cates a , test_copy b where a.cate_name = b.name ;

https://www.cnblogs.com/sustudy/p/4166714.html

sql优化

1)应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。

2)应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,
如:
select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
select id from t where num=0

3)很多时候用 exists 代替 in 是一个好的选择

4)用Where子句替换HAVING 子句 因为HAVING 只会在检索出所有记录之后才对结果集进行过滤

insist,on the road
-------------本文结束感谢您的阅读-------------