一、存储引擎
什么是存储引擎:
MYSQL服务自带的一个功能程序,处理表的处理器,用于管理存储的文件系统,能够将逻辑结构转换为物理结构,作为可插拔式的组件提供
show engines #查看引擎
Engine Support(是否能用) | Comment(描述)| Transactions(事务) | XA | Savepoints
常用InnoDB和MyISAM
设置mysql服务默认的存储引擎
在配置文件添加一行:default-storage-engine=myisam
myisam特点:支持表级锁,不支持事物/事物回滚/外键
.frm--->表结构 .MYD--->表数据 .MYI--->表索引
innodb特点:支持行级锁,支持事物/事物回滚/外键
.frm--->表结构 .ibd--->表数据+表索引(表空间文件)
锁:解决并发访问冲突问题(对同一个表进行写操作时会加锁)
锁类型:读锁(select),共享锁
写锁(insert update delete),排它锁或互斥锁
锁粒度:加锁时候的锁范围
表级锁:给一张表加锁
行级锁:仅给被访问的每一行分别加锁
页级锁:对整个页面进行加锁
查看当前锁状态:show status like 'Table_lock%'
事务:一次访问,从开始建立连接到断开连接的整个过程
事务特点:ACID
查看提交状态:show variables like "autocommit"
set autocommit=off #关闭自动提交功能 commit #手动提交
delete from t3 rollback #事务回滚
工作中如何决定表使用那种存储引擎?
查询访问多的表使用myisam,节省系统资源(select 共享锁,锁整张表)
写操作多的表使用innodb,并发访问量大
二、数据导入导出
导入:把系统文件内容存储到表里(禁用selinux)
load data infile "目录/文件名" into table 库.表 field terminated by "分隔符"(字段分隔符) lines terminated by "\n"(行的分隔符)
导出:把表记录保存到系统文件里(禁用selinux)
导出的是记录,不包括字段名
sql查询命令 into outfile "目录/文件名" field terminated by "分隔符"(字段分隔符) lines terminated by "\n"(每行的分隔符)
步骤:
建表(根据文件内容)--->把要导入的文件拷贝到/var/lib/mysql-files/(通过show variables like "%secure_file_priv"查看)--->
load data infile "/var/lib/mysql-files/passwd" into table db3.user fields terminated by ":" lines terminated by "\n"
导出表(默认以tab键分隔):select * from user where id<=5 into outfile "/var/lib/mysql-files/a.txt" fields terminated by "--->"
修改导入导出时服务默认检索目录:
mkdir /myload--->chown mysql /myload--->主配置文件添加secure_file_priv="/myload"
三、管理表记录
匹配条件:
基本匹配条件:
数值比较:= > != <
字符比较:= != IS NULL IS NOT NULL
逻辑匹配:
AND 逻辑与 OR 逻辑或
范围内匹配和去重显示
in (值列表) #在...里...
not in (值列表) #不在...里...
between 数字1 and 数字2 #在...之间...
distinct 字段名 #去重显示
select distinct shell from user where uid>100
高级匹配条件:
模糊查询: _匹配单个字符,%匹配0~N个字符
select name from user where name like "___" #三个字符
select name from user where name like '%a%' #包含a
正则表达式: where 字段名 regexp "正则表达式"
select name from user where name regexp '^a|t$' #a开头或者t结尾
select name from user where name regexp '^a.*t$' #a开头且以t结尾
select name from user where name regexp '^[a-c]'
四则运算:
select name,uid,gid,(uid+gid)/2 pjz from user where id<10 #求uid+gid的平均值
update user set uid=uid+1 where name="root" #让uid的值加1
操作查询结果
聚集函数:服务内置的对数据做统计的命令
select max(uid) from user #最大值
select avg(uid) from user #平均值
select sum(uid) from user #求和
select count(*) from user where id<10
查询结果排序
asc--->升序(默认) desc--->降序
select name,uid from user where id<20 order by uid desc;
查询结果分组
group by
select shell from user where id>20 group by shell
查询结果过滤:
having 条件
select name,shell from user where uid>100 having shell!="/bin/bash"
限制查询结果显示行数
limit N #显示前N行
select name,uid from user where uid<100 limit 5
limit N,M #N为起始位置(0),M为长度
select name,uid from user where id<10 limit 0,3
四、多表查询
复制表的作用:快速建表,备份表
命令格式:create table 库名.表名 SQL查询语句
键值不会被复制
create table user1 select * from db3.user
create table user3 select * from db3.user where false #只复制表字段
多表查询
格式1:多表查询
select t1.*,t2.homedir from t1,t2 where t1.name="root" and t2.name="root" #显示root的所有信息
select t1.*,t2.homedir from t1,t2 where t1.uid=t2.uid #查询两表uid相等的信息
笛卡尔集(不加查询条件,查询结果相乘)
格式2:where嵌套查询(把内层查询结果作为外层查询的查询条件)
select name,uid from user1 where uid > (select avg(uid) from user1) #uid值大于uid平均值的用户
select name from user1 where name in (select name from t1) #user1中有哪些用户在t1中
两个表里存储的数据信息相同,但有重复的,
格式3:左连接查询(以左边的表为主显示查询结果,显示重复和不重复的结果)
select * from t3 left join t4 on t3.uid=t4.uid #t4与t3重复的结果
格式4:右连接查询(显示重复的和不重复的)
select * from t3 right join t4 on t3.uid=t4.uid #t3与t4重复的结果