MySQL常用操作笔记

2019-07-25  本文已影响0人  华尔街的主导曲

1.创建root用户的密码

mysqladmin -u root password "new_password";

2.连接到Mysql服务器

mysql -u root -p 123;

3.登录 MySQL

mysql -h 主机名 -P 端口号 -u 用户名 -p;

4.输入 exit 或 quit 退出登录

5.sql规范:语句以“ ; ”号结尾,sql命令是以大写书写,单行注释:-- ,多行注释:/*....*/,sql语句可以折行操作

----------------------------------------------

数据库操作(DDL)

-------

6.查看 show 操作

show databases; (查看数据库)

show warnings; (查看警告信息) errors (错误信息)

show create database 名字; (查看数据库创建信息)

---------------------------

7.创建 create 操作

create database 名字; (创建数据库)

create database if not exists 名字; (判断不存在时在创建,如果有不操作)

create database if not exists 名字 character set utf8; (创建数据库及设置编码方式)

----------------------------

8.删除数据库

drop database 名字;

9.修改数据库信息

alter database 名字 character set utf8

10.进入或切换数据库

use 名字

11.查看当前数据库信息

select version(); # 服务器版本信息

select database() # 当前数据库名 (或者返回空)

select user() # 当前用户名

show status; # 服务器状态

show variables; # 服务器配置变量

------------------------

表操作

-------

#主键:非空且唯一 not null unique

12.创建表 create 操作

CREATE TABLE tab_name(

    id INT PRIMARY KEY auto_increment, #主键唯一(PRIMARY KEY),自增(auto_increment) 注:自增id如果突然加个10会以10开始加

    name VARCHAR(25), #字符

    gender BOOLEAN DEFAULT True, #boolean 设置默认值 (DEFAULT)

    salary DOUBLE(7,2), #双精度浮点数

    num FLASE, #浮点数

    startTime DATETIME, #日期时间

    INDEX index_name, #创建普通索引

    out_id INT,

    FOREIGN KEY (out_id 外键关联库名) REFERENCES 表名(id) #外键 用于约束(注意:外键一定要和绑定字段类型保持一致,有外键的是子表,绑定的是父表)

)

CREATE TABLE 库名.tab_name(XXX) ENGINE=INNODB; #没进入库时指定库名创建, ENGINE 指定搜索引擎默认INNODB

# 动态添加外键

ALTER TABLE students ADD CONSTRAINT fk_class_id FOREIGN KEY (class_id) REFERENCES classes(id);

---------------

# 外键三种模式(外键约束默认,级联操作,set null)

1.外键约束 restrict (默认):

  子表更新添加时必须是父表里有的主键,主表删除时子表必须没有与之绑定的外键。

2.级联执行 cascade:

  如果想父表删除关联的子表也删除加: ON DELETE CASCADE;

  如果想父表主键跟新子表外键也更新后加:ON UPDATE CASCADE;

  级联更新删除:ON UPDATE CASCADE ON DELETE CASCADE;

3.set null

  如果不想删除子表数据可以用:ON DELETE SET NULL;(给绑定子表设个null值)

---------------

# 删除一个外键约束

ALTER TABLE students DROP FOREIGN KEY fk_class_id;

13.查看表 show

show tables; (查看当前数据库中的所有表)

show create table tab_name; (查看表创建信息)

14.查看表信息

desc 表名

15.改变字段 alter

alter table 表名 add 字段名 INT,add 字段名 VARCHAR(10); (添加字段“,”号可以加多字段)

alter table 表名 drop 字段名; (删除字段)

alter table 表名 modify 字段名 INT; (修改字段) (后加 (first | after 字段名)是放到哪个字段前后的意思 )

alter table 表名 change 原字段名 新字段名 INT; (改字段名)

alter table 表名 alter 字段名 drop DEFAULT; 删除字段的默认值

alter table 表名 rename TO 新表名; 修改表名

16.改表名

rename table 表名 to 新表名;

17.删除表

drop table if exists 表名; #if exists 存在就删除

-----------

# 表(增删改查)操作

-------

18.插入数据(增)

insert into 表名 (id,name,age) values (1,'小明',10),(2,'小红',11); (“,”号插入多条数据)

insert into 表名 set id=11,name="小刚"; #名字插入

19.删除数据(删)

delete from 表名 where gender=1 AND age=11;

delete from 表名 #删除所有表数据

truncate table 表名 #删除表数据(性能最好的删除,原理是删除表在建一张空的表)

20.更改数据(改)

update 表名 set name="小刚",age=12 where id=11; (不加 where 条件是更新所有)

21.查询数据(查)

select * from 表名1,表名2; ( * 所有字段 可以指定查看单一字段如:id,name ,查询多表:表名1,表名2 )

select distinct name from 表名; ( 去除重复字段:distinct )

select name,age+10 from 表名; ( 数据加值显示,不影响原数据 )

select name as 姓名,age 年龄 from 表名; ( 字段取别名显示,不影响原数据,加不加as都可以 )

where 条件语句

-----

运算符:

--------

1.算术运算符:

+  -  * (乘法)  / (除法)  % 或 MOD (取余)

2.比较语句:

=  !=  >  <  <=  >=

BETWEEN (在两值之间) NOT BETWEEN (不在两值之间) REGEXP 或 RLIKE (正则式匹配)

IN (在集合中) NOT IN (不在集合中) <=> (严格比较两个NULL值是否相等)

IS NULL (为空) IS NOT NULL (不为空) LIKE (模糊匹配)

3.逻辑语句:

NOT 或 ! (非) AND (与) OR (或) XOR(异或)

4.位运算符:

& (按位与) | (按位或) ^ (按位异或) << (左移) >> (右移)

--------

参考 https://www.runoob.com/mysql/mysql-operator.html

加 BINARY 关键字表示区分大小写

where age between 1 and 11; #age字段的(between 两值之间 1~11)

# not between 不在两值之间 # name is null (name值为null的数据)

# in(10,11) 在集合中 , not in(10,11) 不在集合中

# name like "小%"; name字段模糊匹配以小开头任意位“ % ”任意字符, "小_"匹配小后一位 “_” 符号代表几位

# name regexp '小\d'; (name正则查询: regexp 'xxx' )

# order by age (默认按age字段升序排序,后加desc降序排序) order by age,id desc,name 多列排序,desc只对前字段生效

# group by age (按age字段分组,相同的内容合成一组)

# select gender,sum(age) from name group by gender; (聚合函数 sum(age) 求age组的和)

# select gender,sum(age) from name group by gender having sum(age)>20; ( having 对分组进行过滤,age组的和大于20)

注:where 在分组前过滤 having 在分组后过滤

# 聚合函数

1.求和:sum(age) 2.求个数:count(age) 3.求平均值:AVG(age) 4.遇到null转为0:ifnull(age,0)

5.取最大和4结合用:max(ifnull(age,0)) 6.最小:min(age)

参考 https://www.runoob.com/mysql/mysql-functions.html

-----

# limit 限制显示几条 (参数 1 位是从0开始显示几条,两位是从第几条往后几条)

select name from 表名 limit 5; # 显示五条数据

# limit 分页查询

LIMIT 10, 15; # 偏移量,显示条数(查询第11条到第25条)

例:

SELECT * FROM message ORDER BY id DESC LIMIT 10000, 20

对上面的mysql语句说明:limit 10000,20的意思扫描满足条件的10020行,扔掉前面的10000行,返回最后的20行,问题就在这里,如果是limit 100000,100,需要扫描100100行,在一个高并发的应用里,每次查询需要扫描超过10W行,性能肯定大打折扣。文中还提到limit n性能是没问题的,因为只扫描n行。

优化:

----

如还是SELECT * FROM message ORDER BY id DESC,按id降序分页,每页20条,当前是第10页,当前页条目id最大的是1020,最小的是1000,如果我们只提供上一页、下一页这样的跳转(不提供到第N页的跳转),那么在处理上一页的时候SQL语句可以是:

SELECT * FROM tb_goods_info WHERE auto_id >=2500 ORDER BY auto_id ASC LIMIT 0,20

比如要跳到第9页,SQL语句可以这样写:

SELECT * FROM tb_goods_info WHERE auto_id <2500 ORDER BY auto_id desc LIMIT 0,20

比如要跳到第8页,SQL语句可以这样写:

SELECT * FROM tb_goods_info WHERE auto_id <2500 ORDER BY auto_id desc LIMIT 20,20

比如要跳到第7页,SQL语句可以这样写:

SELECT * FROM tb_goods_info WHERE auto_id <2500 ORDER BY auto_id desc LIMIT 40,20

跳转到第11页:

SELECT * FROM tb_goods_info WHERE auto_id >2519 ORDER BY auto_id asc LIMIT 0,20

跳转到第12页:

SELECT * FROM tb_goods_info WHERE auto_id >2519 ORDER BY auto_id asc LIMIT 20,20

跳转到第13页:

SELECT * FROM tb_goods_info WHERE auto_id >2519 ORDER BY auto_id asc LIMIT 40,20

原理还是一样,记录住当前页id的最大值和最小值,计算跳转页面和当前页相对偏移,由于页面相近,这个偏移量不会很大,这样的话m值相对较小,大大减少扫描的行数。其实传统的limit m,n,相对的偏移一直是第一页,这样的话越翻到后面,效率越差,而上面给出的方法就没有这样的问题。

注意SQL语句里面的ASC和DESC,如果是ASC取出来的结果,显示的时候记得倒置一下。

---

注:获取分页总数及数据

SELECT SQL_CALC_FOUND_ROWS * FROM my_info WHERE id<=100 LIMIT 1,20;

SELECT FOUND_ROWS() as total;

注:SQL_CALC_FOUND_ROWS 是 mysql 的内置关键字, 可以记录下当前 sql 的总行数(受 where 影响,但不受 limit 影响),虽然看起来是两条SQL语句,但是实际上只执行了一次数据库查询。

----

# 格式化时间

strftime('%Y-%m-%d %H:%M:%S',date); 2017-11-03 15:31:26

22.多表查询

---------

# 连接查询

内连接:inner join

1.select tableA.name,tableB.age from tableA,tableB where tableA.id=tableB.uid;

2.select * from tableA inner join tableB on tableA.id=tableB.uid;

外连接:left join  right join

1.select tableA.name,tableB.age from tableA left join tableB on tableA.id=tableB.uid;

注:left join 以左表为主(左表显示所有匹配,右只显示符合条件的)

2.select * from tableA right join tableB on tableA.id=tableB.uid;

注:right join 以右表为主(右表显示所有匹配,左只显示符合条件的)

全连接:full join (mysql 不支持)

# 子查询(查询嵌套,不限查询也可创建等等)

select * from tableA where age IN (select age from tableB);

注:意思是tableA表里的age能在tableB表里查到才显示

create table copy_data(select * from tableB)

注:创建嵌套实例

---------

23.创建索引

# 修改表结构(添加索引)

ALTER TABLE 表名 ADD INDEX 索引名 (name,id); # “,”添加多个字段

# 删除索引

DROP INDEX 索引名 ON 表名;

# 显示索引信息

show index from 表名;

参考 https://www.runoob.com/mysql/mysql-index.html

24.事务处理

1.用 BEGIN, ROLLBACK, COMMIT来实现

BEGIN 开始一个事务

ROLLBACK 事务回滚

COMMIT 事务确认提交

2.直接用 SET 来改变 MySQL 的自动提交模式:

SET AUTOCOMMIT=0 禁止自动提交

SET AUTOCOMMIT=1 开启自动提交

3.使用保留点操作

SAVEPOINT savepoint_name;    # 声明一个 savepoint

ROLLBACK TO savepoint_name;  # 回滚到savepoint

RELEASE SAVEPOINT savepoint_name;  # 删除指定保留点

----------

25.复制表

CREATE TABLE 表名 LIKE 复制表名; # 复制表信息

INSERT INTO 表名 SELECT * FROM 复制表名; # 复制表数据

26.同时修改两张表数据

 UPDATE table1 

    LEFT JOIN table2 ON table1.xx=table2.xx (关联的字段)

    SET table1.xx=value,table2.xx=value (update value)

WHERE table1.xx=xx (条件)

----------

27.用户权限

#创建用户不指定权限

create user '用户名'@'localhost' identified by '密码';

#创建用户,拥有对所有表查询和更新权限(*.*指:数据库.表 ,* 所有)

grant select,update on *.* to '用户名'@'localhost' identified by '密码';

#删除用户

drop user '用户名'@'localhost';

#修改用户密码(修改后需要输入 flush privileges 加载权限列表)

update mysql.user set Password=password('新密码') where User='root' and Host='localhost';

#自己登录的情况下修改自己的密码

set Password=password('新密码');

#取消用户权限

revoke update on *.* from '用户名'@'localhost'; #取消update权限

#查看权限

show grants for '用户名'@'localhost';

----------

28.数据备份/恢复

#备份数据库:test到test_2020310.sql

mysqldump -u root -p test > c:/test_2020310.sql

#备份多个数据库(test,excel_data)

mysqldump -u root -p --databases test excel_data > new_database.sql

#备份系统中所有数据库

mysqldump -u root -p --all-databases > all.sql

#备份表:test数据库my_name表到test_2020310.sql

mysqldump -u root -p test my_name > c:/my_name_2020310.sql

# 数据恢复

mysql -uroot -p test < c:/my_name_2020310.sql #指定数据库插入表

mysql -uroot -p < c:/test_2020310.sql #直接插入数据库

#不同主机之间迁移数据

mysqldump -h www.xx.com -uroot -pmi123456 test | mysql -h www.newxx.com -uroot -pmi123456

-----------

29.性能优化

#查看性能信息

explain select * from my_name;

上一篇下一篇

猜你喜欢

热点阅读