美文网首页
MySQL常用操作笔记

MySQL常用操作笔记

作者: 华尔街的主导曲 | 来源:发表于2019-07-25 10:07 被阅读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;

    相关文章

      网友评论

          本文标题:MySQL常用操作笔记

          本文链接:https://www.haomeiwen.com/subject/ylscrctx.html