MySQL

启动和连接MySQL服务

服务端启动

1、查看MySQL状态
  sudo /etc/init.d/mysql status
  sudo /etc/init.d/mysql start | stop | restart

客户端连接

1、命令格式
  mysql -h主机地址 -u用户名 -p密码
  mysql -hlocalhost -uroot -p
2、本地连接可省略 -h 选项
  mysql -uroot -p

基本SQL命令

库的管理

查看已有库

    show databases;

创建库(指定字符集)

    create database 库名 [character set utf8];

查看创建库的语句(字符集)

    show create database 库名;

查看当前所在库

    select database();

切换库

    use 库名;

查看库中已有表

    show tables;

删除库

    drop database 库名;

表的管理

创建表(指定字符集)

    create table 表名(
字段名 数据类型,
字段名 数据类型,
...
字段名 数据类型
);

查看已有表的字符集

    show create table 表名;

查看表结构

    desc 表名;

删除表

    drop table 表名;

表的复制

1、语法
create table 表名 select .. from 表名 where 条件;
2、示例
	1、复制test表的全部记录和字段,test2
  	create table test2
 	 select * from test;
	2、复制test表的前3条记录,test3
  	create table test3 
  	select * from test limit 3;
	3、复制test表的id,name,country三个字段的前5条记录,test4
  	create table test4
 	select id,name,country from test limit 5;
3、复制表结构
create table 表名 select * from 表名 where false;

4、注意
复制表的时候不会把原表的 键(key) 属性复制过来

表记录管理

插入(insert)

  1、insert into 表名 values(值1),(值2),...;
  2、insert into 表名(字段1,...) values(值1),...;

查询(select)

  1、select * from 表名 [where 条件];
  2、select 字段1,字段名2 from 表名 [where 条件];

查看tab中所有记录

    select * from tab;

查看tab表中所有人的姓名和年龄

    select name,age from tab;

查看tab表中年龄大于20的信息

    select * from tab where age>20;

删除表记录

1、delete from 表名 where 条件;
2、注意
  delete语句后如果不加where条件,所有记录全部清空

更新表记录

1、update 表名 set 字段1=值1,字段2=值2,... where 条件;
2、注意
  必须加where条件

表字段的操作

语法

alter table 表名 执行动作;

添加字段(add)

alter table 表名 add 字段名 数据类型;
alter table 表名 add 字段名 数据类型 first;
alter table 表名 add 字段名 数据类型 after 字段名;

删除字段(drop)

alter table 表名 drop 字段名;

修改数据类型(modify)

alter table 表名 modify 字段名 新数据类型;

表重命名(rename)

alter table 表名 rename 新表名;

运算符操作

数值比较/字符比较
1、数值比较 := != > >= < <=
2、字符比较 := !=

逻辑比较

1、and (两个或多个条件同时成立)
2、or (任意一个条件成立即可)

范围内比较

1、between 值1 and 值2
2、where 字段名 in(值1,值2,...)
3、where 字段名 not in(值1,值2,...)

匹配空、非空

1、空 :where name is null
2、非空:where name is not null
3、注意
  1、NULL :空值,只能用 is 或者 is not 去匹配
  2、""   :空字符串,用 = 或者 != 去匹配

模糊比较

1、where 字段名 like 表达式
2、表达式 
  1、_ : 匹配单个字符
  2、% : 匹配0到多个字符

数据类型

数值类型

整型

  1、int 大整型(4个字节)
    取值范围 :2**32 - 1(42亿多)
  2、tinyint 微小整型(1个字节)
    1、有符号(signed默认) : -128 ~ 127
    2、无符号(unsigned) : 0 ~ 255
      age tinyint unsigned,
  3、smallint 小整型(2个字节)
  4、bigint 极大整型(8个字节)

浮点型

  1、float(4个字节,最多显示7个有效位)
    1、用法
  字段名 float(m,n)  m->总位数 n->小数位位数
  float(5,2)取值范围? -999.99 ~ 999.99
  2、decimal(最多显示28个有效位)
    1、decimal(m,n)
2、存储空间(整数、小数分开存储)
  规则:将9的倍数包装成4个字节
      
  余数    字节
    0       0
   1-2      1
   3-4      2
   5-6      3
   7-9      4

字符类型

1、定长 char(15) : 浪费存储空间,性能高
2、边长 varchar(20) : 节省存储空间,性能低

字符类型宽度和数值类型宽度的区别
1、数值类型宽度为显示宽度,只用于select查询显示,和占用存储无关,可用zerofill查看效果
2、字符类型的宽度超过之后则无法存储

枚举类型

1、单选(enum) :字段名 enum(值1,值2,...)
2、多选(set)  :字段名 set(值1,值2,...)

日期时间类型

1、date :"YYYY-MM-DD"
2、time :"HH:MM:SS"
3、datetime :"YYYY-MM-DD HH:MM:SS"
4、timestamp :"YYYY-MM-DD HH:MM:SS"
5、注意
  1、datetime :不给值默认返回NULL值
  2、timestamp :不给值默认返回系统当前时间

日期时间函数

1、now()  返回服务器当前时间
2、curdate() 返回当前日期
3、curtime() 返回当前时间
4、year(date) 返回指定时间的年份
5、date(date) 返回指定时间的日期
6、time(date) 返回指定时间的时间

日期时间运算

语法格式
select * from 表名
where 字段名 运算符 (时间-interval 时间间隔单位);
时间间隔单位:
1 day | 2 hour | 1 minute | 2 year | 3 month

SQL查询

总结

1、where ...
2、group by ...
3、select ...聚合函数 from 表名
4、having ...
5、order by ...
6、limit ...;

order by

1、给查询结果进行排序
2、... order by 字段名 ASC/DESC
3、升序:ASC(默认)
   降序:DESC

limit (永远放在SQL语句的最后写)

1、作用 :限制显示查询记录的个数
2、用法
  1、limit n  -> 显示 n 条记录
  2、limit m,n 
    m 表示 从第m+1条记录开始显示,显示 n 条
    limit 2,3  : 第 3、4、5 三条记录

分页

  每页显示5条记录,显示第4页的内容
  
  第1页 :limit 0,5        # 1 2 3 4 5 
  第2页 :limit (2-1)*5,5  # 6 7 8 9 10
  第3页 :limit (3-1)*5,5  # 11 12 13 14 15
  第4页 :limit (4-1)*5,5  # 16 17 18 19 20

  每页显示n条记录,显示第m页 :limit (m-1)*n,n

聚合函数

分类:
  avg(字段名) : 求该字段平均值
  sum(字段名) : 求和
  max(字段名) : 最大值
  min(字段名) : 最小值
  count(字段名) : 统计该字段记录的个数

执行顺序

3、select ...聚合函数 from 表名
1、where ...
2、group by ...
4、having ...
5、order by ...
6、limit ...

group by

1、作用 :给查询结果进行分组
2、示例
  计算每个人的平均分
    select class,avg(score) from chenjibiao
    group by class;
3、注意
  1、group by之后的字段名必须要为select之后的字段名
  2、如果select之后的字段名和group by之后的字段不一致,则必须对该字段进行聚合处理(聚合函数)

having语句

1、作用
  对查询的结果进行进一步筛选
2、注意
  1、having语句通常和group by语句联合使用,过滤由group by语句返回的记录集
  2、where只能操作表中实际存在字段,having可操作由聚合函数生成的显示列

distinct

1、作用 :不显示字段重复值
2、注意
  1、distinct和from之间所有字段都相同才会去重
  2、distinct不能对任何字段做聚合处理

查询表记录时做数学运算

1、运算符
  +  -  *  /  % 

约束

1、作用 :保证数据的完整性、一致性、有效性
2、约束分类
1、默认约束(default)
1、插入记录,不给该字段赋值,则使用默认值
2、非空约束(not NULL)
1、不允许该字段的值有NULL记录
sex enum(“M”,“F”,“S”) not null defalut “S”

索引

定义

对数据库表的一列或多列的值进行排序的一种结构(Btree方式)

优点

加快数据检索速度

缺点

1、占用物理存储空间
2、当对表中数据更新时,索引需要动态维护,降低数据维护速度

索引示例

1、开启运行时间检测 :set profiling=1;
2、执行查询语句
  select name from test where name="b222";
3、查看执行时间
  show profiles;
4、在name字段创建索引
  create index name on test(name);
5、再执行查询语句
  select name from test where name="b222";
6、查看执行时间
  show profiles;

索引

1、普通索引(index)
  1、使用规则
    1、可设置多个字段
2、字段值无约束
3、key标志 :MUL
  2、创建index
    1、创建表时
  create table 表名(...
  index(字段名),index(字段名));
    2、已有表
  create index 索引名 on 表名(字段名);
  create index name on test(name);
  3、查看索引
    1、desc 表名;  --> KEY标志为:MUL
2、show index from 表名\G;
  4、删除索引
    drop index 索引名 on 表名;
2、唯一索引(unique)
  1、使用规则
    1、可设置多个字段
2、约束 :字段值不允许重复,但可为 NULL
3、KEY标志 :UNI
  2、创建
    1、创建表时创建
  unique(字段名),
  unique(字段名)
2、已有表
  create unique index 索引名 on 表名(字段名);
    3、查看、删除 同 普通索引
3、主键索引(primary key)
   自增长属性(auto_increment,配合主键一起使用)
  1、使用规则
    1、只能有一个主键字段
2、约束 :不允许重复,且不能为NULL
3、KEY标志 :PRI
4、通常设置记录编号字段id,能唯一锁定一条记录
  2、创建
    1、创建表时
  (id int primary key auto_increment,
  )auto_increment=10000;##设置自增长起始值
  已有表添加自增长属性:
    alter table 表名 modify id int auto_increment;
  已有表重新指定起始值:
    alter table 表名 auto_increment=20000;
2、已有表
  alter table 表名 add primary key(id);
  3、删除
    1、删除自增长属性(modify)
      alter table 表名 modify id int;
2、删除主键索引
  alter table 表名 drop primary key;        
4、外键索引

嵌套查询(子查询)

1、定义 :把内层的查询结果作为外层的查询条件
2、语法格式
select … from 表名 where 条件(select …);

多表查询

1、两种方式
1、select 字段名列表 from 表名列表; (笛卡尔积)
t1 : name -> “A1” “A2” “A3”
t2 : name -> “B1” “B2”
select * from t1,t2;
±-----±------+
| name | name2 |
±-----±------+
| A1 | B1 |
| A1 | B2 |
| A2 | B1 |
| A2 | B2 |
| A3 | B1 |
| A3 | B2 |
±-----±------+
2、… where 条件;

连接查询

内连接

1、语法格式
  select 字段名 from 
  表1 inner join 表2 on 条件
  inner join 表3 on 条件;

外连接

左连接
  1、以 左表 为主显示查询结果
  2、select 字段名 from 
     表1 left join 表2 on 条件
 left join 表3 on 条件;
右连接
  用法同左连接,以右表为主显示查询结果

数据相关

数据导入

1、作用 :把文件系统的内容导入到数据库中
2、语法
load data infile "/var/lib/mysql-files/文件名"
into table 表名
fields terminated by "分隔符"
lines terminated by "\n";

数据导出

1、作用 
将数据库中表的记录导出到系统文件里
2、语法格式
select ... from 表名
into outfile "/var/lib/mysql-files/文件名"
fields terminated by "分隔符"
lines terminated by "\n";

数据备份(mysqldump,在Linux终端中操作)

1、命令格式
mysqldump -u用户名 -p 源库名 > ~/***.sql
2、源库名的表示方式
--all-databases  备份所有库
库名             备份单个库
-B 库1 库2 库3   备份多个库
库名 表1 表2 表3 备份指定库的多张表

数据恢复

1、命令格式(Linux终端)
mysql -uroot -p 目标库名 < ***.sql
2、从所有库备份中恢复某一个库(--one-database)
mysql -uroot -p --one-database 目标库名 < all.sql
mysql -uroot -p --one-database db4 < all.sql
3、注意
	1、恢复库时如果恢复到原库会将表中数据覆盖,新增表不会删除
	2、数据恢复时如果恢复的库不存在,则必须先创建空库

外键(foreign key)

定义 :

让当前表字段的值在另一个表的范围内选择

语法

foreign key(参考字段名)
references 主表(被参考字段名)
on delete 级联动作
on update 级联动作

使用规则

1、主表、从表字段数据类型要一致
2、主表被参考字段 :主键

删除外键

alter table 表名 drop foreign key 外键名;
外键名 :show create table 表名;

级联动作

1、cascade 
  数据级联删除、更新(参考字段)
2、restrict(默认)
  从表有相关联记录,不允许主表操作
3、set null
  主表删除、更新,从表相关联记录字段值为NULL

已有表添加外键

alter table 表名 add 
foreign key(参考字段) references 主表(被参考字段)
on delete ...
on update ...

MySQL的用户账户管理

1、开启MySQL远程连接
1、sudo -i
2、cd /etc/mysql/mysql.conf.d/
3、subl mysqld.cnf
#bind-address = 127.0.0.1 ctrl + s保存
4、/etc/init.d/mysql restart 2、添加授权用户
1、用root用户登录mysql
mysql -uroot -p123456
2、授权
grant 权限列表 on 库.表 to “用户名”@"%"
identified by “密码” with grant option;

  权限列表:all privileges 、select 、insert
  库.表 : *.*  所有库的所有表

存储引擎(处理表的处理器)

基本操作

1、查看所有存储引擎
  mysql> show engines;
2、查看已有表的存储引擎
  mysql> show create table 表名;
3、创建表指定
  create table 表名(...)engine=myisam;
4、已有表
  alter table 表名 engine=innodb;

1、目的 :解决客户端并发访问的冲突问题
2、锁分类
	1、锁类型
  		1、读锁(共享锁)
    	select :加读锁之后别人不能更改表记录,但可以进行查询
  		2、写锁(互斥锁、排他锁)
    	insert、delete、update
		加写锁之后别人不能查、不能改
	2、锁粒度
  		1、表级锁 :myisam
  		2、行级锁 :innodb
3、常用存储引擎特点
	1、InnoDB特点
  		1、共享表空间
    		表名.frm :表结构和索引文件
			表名.ibd :表记录
  			2、支持行级锁
  			3、支持外键、事务操作
	 	2、MyISAM特点
  			1、独享表空间
    		表名.frm :表结构
			表名.myd :表记录 mydata
			表名.myi :索引文件 myindex
  2、支持表级锁
4、如何决定使用哪个存储引擎
1、执行查操作多的表用 MyISAM(使用InnoDB浪费资源)
2、执行写操作多的表用 InnoDB

MySQL调优

1、选择合适的存储引擎
	1、读操作多 :MyISAM
	2、写操作多 :InnoDB

2、创建索引
在 select、where、order by常涉及到的字段建立索引
3、SQL语句的优化
1、where子句中不使用 != ,否则放弃索引全表扫描
2、尽量避免 NULL 值判断,否则放弃索引全表扫描
  优化前 :
    select number from t1 where number is null;
  优化后 :
    在number列上设置默认值0,确保number列无NULL值
select number from t1 where number=0;
3、尽量避免 or 连接条件,否则放弃索引全表扫描
  优化前 :
    select id from t1 where id=10 or id=20 or id=30;
  优化后:
    select id from t1 where id=10
union all
select id from t1 where id=20
union all
select id from t1 where id=30;
4、模糊查询尽量避免使用前置 % ,否则全表扫描
  select name from t1 where name like "%c%";
5、尽量避免使用 in 和 not in,否则全表扫描
  select id from t1 where id in(1,2,3,4);
  select id from t1 where id between 1 and 4;
6、尽量避免使用 select * ...;用具体字段代替 * ,不要返回用不到的任何字段

事务和事务回滚

1、定义 :一件事从开始发生到结束的整个过程
2、作用 :确保数据一致性
3、事务和事务回滚应用
	1、MySQL中sql命令会自动commit到数据库
  	show variables like "autocommit";
	2、事务应用
  		1、开启事务
    	mysql> begin;
		mysql> ...一条或多条SQL语句
  		## 此时autocommit被禁用
 		2、终止事务
    	mysql> commit; | rollback;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值