多表查询
1.多表连接查询 语法 select 字节 from 表1 inner join 表2 on 条件 inner join 表3 on 条件…
2.多表嵌套查询 语法 select 字节…from 表1 where 条件 in(select 字节 from 表2 where in(select 字节 from 表3 where 条件…))
一些常用的函数:
一:日期函数
1,获得当前日期+时间(date + time)函数:now()
select now();
2, 获得当前时间戳函数:current_timestamp, current_timestamp()
select current_timestamp, current_timestamp();
select CURDATE() from dual;
select CURTIME() FROM DUAL;
SELECT NOW() FROM DUAL;
注: dual 是虚拟表,为了凑sql语句的格式;
二,数值函数
SELECT ABS(-23) FROM DUAL;
SELECT CEIL(3.13) FROM DUAL;
SELECT FLOOR(4.87) FROM DUAL;
三,字符串函数
`SELECT CONCAT('hello','world') FROM dual;
select INSERT('helloworld',2,3,'xxxxxx') from dual;
select LOWER('HELLO MYSQL') FROM dual
`
四,其他函数
select DATABASE() from dual;
select VERSION() from dual;
select USER() from dual;
select PASSWORD('admin') from dual;
MySql中的事务
1、什么是事务
事务是由一组DML语句组成,完成一个相对完整的功能,这一组DML语句要么全部执行,要么全部放弃执行。
2、数据库开启事务命令
start transaction 或者 begin 开启事务
commit 提交事务,提交未存储的事务
rollback 回滚事务,即撤销指定的sql语句(只能回退insert delete update语句)
savepoint 保留点 ,事务处理中设置的临时占位符 你可以对它发布回退。
例如:a 给b 转账 100块钱。
start TRANSACTION;
update account set money=money-100 where name ='a';
update account set money = money+100 where name = 'b';
COMMIT;
设置回滚点
start TRANSACTION;
insert into t5(name,gender) values('张飞','man');
SAVEPOINT s1;
insert into t5(name,gender) values('关羽','man');
SAVEPOINT s2;
insert into t5(name,gender) values('刘备','man');
SAVEPOINT s3;
insert into t5(name,gender) values('赵云','man');
select * from t5;
ROLLBACK to s2;
select * from t5;
注意:如果不设置回滚点,则默认回滚到开启事务位置。
3、事务的特性(重要!!! 面试会考!!!)
事务具有四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持续性(Durability)。这四个特性也简称ACID性。
(1)原子性:是指事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生。就如原子是自然界最小颗粒,具有不可再分的特征一样。
(2)一致性:事务执行的结果,必须使数据库从一个一致性状态,变到另一个一致性状态。当数据库中只包含事务成功提交的结果时,数据库处于一致性状态。一致性是通过原子性来保证的。(双方账户的总和不能少也不能多)
(3)隔离性:各个事务的执行互不干扰,任意一个事务的内部操作对其他并发的事务,都是隔离的。(说白了,就是你做你的,我做我的!)
(4)持续性:持续性也称为持久性,指事务一旦提交,对数据所做的任何改变,都要记录到永久存储器中,通常是保存进物理数据库。(转账记录成功了,不能过一会变成了出错了)
隔离性:拿转账举例来说 操作转账和收到转账是相互独立的 在提交事务前不会相互影响。
索引
索引在Mysql中是存储引擎用于快速找到记录的一种数据结构(BTree,平衡树),索引对于数据库的良好性能是非常关键的,尤其是当表中的数据量越来越大的时候,索引对于性能的影响愈发重要。
索引相当于字典的目录,如果查找某个字的时候可以通过目录,提高查询速度,否则需要翻阅字典的每一页。
使用索引的目的:提高查询速度。
索引特点:创建和维护索引会消耗很多时间与磁盘空间,但是查询速度大大提高。
(创建字典目录需要时间,字典目录需要占字典大小)
创建索引的语法有两种:
1,表内创建 ,创建表时,添加索引。
create table 表名(
字段名1 数据类型,
字段名2 数据类型,
…,
Index | key [索引名称] (字段名)
);
2,表外创建,创建完表后,添加索引。
create table 表名(
字段名1 数据类型,
字段名2 数据类型,
…,
);
Alter table 表名 add {unique | primay key| index…索引类型} 索引名(字段名)
索引分类
1.普通索引 就是一个普通的索引,可以为空,可以重复
2.唯一索引 可以为空,不可以重复。
ALTER TABLE teacher ADD UNIQUE(column); # 添加唯一索引
ALTER TABLE teacher ADD column type UNIQUE; # 添加列并且添加索引。
alter table t2 add UNIQUE phone_index(phone);
show create table t2;
/**
CREATE TABLE `t2` (
`id` int(11) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
`phone` varchar(20) DEFAULT NULL,
UNIQUE KEY `phone_index` (`phone`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
**/
3.主键索引 不可以为空,不可以重复。
ALTER TABLE teacher ADD PRIMARY KEY(column);
只要是主键,就是索引。
alter table t2 add PRIMARY key(id);
/**
CREATE TABLE `t2` (
`id` int(11) NOT NULL DEFAULT '0',
`name` varchar(20) DEFAULT NULL,
`phone` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `phone_index` (`phone`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
**/
4.多列索引。
ALTER TABLE teacher ADD INDEX(column1,column2,column3);
/**
CREATE TABLE `t2` (
`id` int(11) NOT NULL DEFAULT '0',
`name` varchar(20) DEFAULT NULL,
`phone` varchar(20) DEFAULT NULL,
`chinese` int(11) DEFAULT NULL,
`math` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `phone_index` (`phone`),
KEY `chinese` (`chinese`,`math`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
**/
删除索引
Drop index 索引名 on 表名;
drop index phone_index on t2;
show create table t2;
使用索引:
1、少量数据不使用数据
2、查询次数少不使用索引
3、查询要携带索引字段,通常放在select之后第一个
4、索引提高了查询的效率,占有跟多的资源。
注意:
1、索引不是越多越好。(一本书,半本书是目录不可以)。