MySQL 常用操作

登录数据库
mysql -h 127.0.0.1 -p 3306 -u root -pxxx
查看当前数据库的连接
show processlist
导出数据库
mysqldump -h 127.0.0.1 -p 3306 -u root -pxxx 数据库名 > dbname.sql

还可以进一步导出表

mysqldump -h 127.0.0.1 -p 3306 -u root -pxxx 数据库名 表名 > dbname-tablename.sql
导入数据库
mysql -h 127.0.0.1 -p 3306 -uxxx -pxxx < dbname.sql
shell 中执行sql语句
mysql -uxxx -pxxx -e "show databases;"
DDL语句 和 DML语句
  • DDL(Data Definition Languages)语句
    数据定义语言,这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象的定义。常用的语句关键字主要包括 create、drop、alter等
  • DML(Data Manipulation Language)语句
    数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性,常用的语句关键字主要包括 insert、delete、udpate 和select 等。(增添改查)
查看当前服务器支持的存储引擎
mysql > SHOW ENGINES;
创建数据库
CREATE DATABASE xxx
CREATE DATABASE IF NOT EXISTS xxx
删除数据库
DROP DATABASE xxx
DROP DATABASE IS EXISTS xxx
创建表
CREATE TABLE IF NOT EXISTS t_course (
    course_id int AUTO_INCREMENT,
    course_name varchar(255) NOT NULL,
    course_teachser_ID int NOT NULL,
    ... NOT NULL DEFAULT 1,
    ......
    primary key (course_id, course_name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • AUTO_INCREMENT
    自增ID,必须是被索引的列。

  • DEFAULT
    设置默认值,不能将函数作为默认值,必须是常量 。

  • 引擎类型

    • InnoDB:可靠的事务处理引擎,不支持全文本搜索。
    • MEMORY:数据存储在内存中,速度快,适用于临时表。
    • MyISAM:性能极高,支持全文本搜索,不支持事务。

    引擎可以混用,但外键不能跨引擎。

显示单表信息
show table status like 表名;

显示创建表的语句:

SHOW CREATE TABLE 表名;
  • 显示表中的所有列
    show full columns 表名;
    
修改表结构
  • 修改表的存储引擎

    ALTER TABLE 表名 ENGINE = 存储引擎名称
    
  • 新增列

    ALTER TABLE 表名 ADD 列名 varchar(255)
    
  • 修改列

  • 删除列

    ALTER TABLE 表名 DROP COLUMN 列名
    
  • 添加外键

    ALTER TABLE t_course 
    ADD CONSTRAINT fk_course_teacher
    FOREIGN KEY (course_teacher_ID) REFERENCES t_teacher (teadher_ID)
    
删除表
DROP TABLE t_course;
TRUNCATE TABLE t_course;
DELETE TABLE t_course;
  • DELETE
    DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作,不会减少表和索引所占用的空间,如果有相应的 tigger,执行的时候将被触发。

  • TRUNCATE
    执行后表和索引所占用的空间会恢复到初始大小,且不会激发触发器。

  • DROP
    删除整个表(结构和数据)包括约束(constrain),触发器(trigger)索引(index);依赖于该表的存储过程/函数将被保留,但其状态会变为:invalid。

  • 3者总结

    • delete 和 truncate 只删除表的数据不删除表的结构
    • 速度,一般来说: drop > truncate > delete
    • delete语句是DML,这个操作会放到rollback segement中,事务提交之后才生效。如果有相应的trigger,执行的时候将被触发
      truncate,drop是DDL,操作立即生效,原数据不放到rollback segment中,不能回滚,操作不触发trigger。
重命名表
RENAME TABLE course to t_course;
数据查询
  • IN
    WHERE column IN (value1,value2,...)
    WHERE column NOT IN (value1,value2,...)
    
  • 去重DISTINCT
    SELECT DISTINCT vend_id FROM products      //  去重
    SELECT prod_name FROM products LIMIT 5, 10  //  [5, 5+10]
    
  • 排序: ORDER BY
    SELECT prod_id, prod_price, prod_name 
    FROM products
    ORDER BY prod_price DESC, prod_name
    
    DESC降序,默认升序
  • %匹配任意(包括0)多个字符, _匹配单个字符
  • 分组
连接查询

TODO

数据插入
  • 插入一条
    INSERT INTO t_course VALUE(......);
    INSERT INTO t_course(cno, cname, tno) VALUE(......);
    
  • 一次插入多条
    这种方式插入多条语句比一次插入一条多次插入的快
    INSERT INTO t_course VALUES(......),(......),(......);
    INSERT INTO t_course(cno, cname, tno) VALUES(......),(......),(......);
    
  • 插入检索出的数据
    INSERT INTO 
    
数据更新
UPDATE t_course SET course_name = 'OS' WHERE course_ID = 123;
数据删除
DELETE FROM t_course WHERE course_ID = 123;
索引
  • 显示表中已建的索引

    show index from 表名;
    
  • 普通索引
    最基本索引,没有任何限制。

    create index 索引名称 on 表名(列名);
    
  • 唯一索引
    索引列的值必须唯一,可以有空值。主键是特殊的唯一索引(不能为空值)。

    create UNIQUE index 索引名称 on 表名(列名);
    
  • 组合索引
    就是在多个字段上联合建立一个索引。

    create index 索引名称 on 表名(列名1,列名2, 列名3...);
    

    比如create index index_union on index_table(name,age,phoneNum);
    这里一个组合索引,相当于在有如下三个索引:【name】【name,age】【name,age,phoneNum】

  • 删除索引

LIMIT

LIMIT 主要用于查询之后显示返回指定几条数据。

SELECT * FROM A LIMIT 3, 4  // 表示返回第3条为起点,往后4条数据
  • 一个经典的问题:LIMIT 0, 100LIMIT 100000, 100的执行效率是一样吗?
    不一样,LIMIT 100000, 100实际扫描的1000100行记录,然后只会返回100条记录。
    如何优化?
    【1】如果是有序的,则可以使用between,例如select * from A where id between 100000 and 1000100
    【2】或者用倒序,假设我们有120w记录,采取select * from A order by oid desc limit 100
日期和时间类型

MySQL 提供2种日期类型:DATETIMETIMESTAMP

  • DATETIME
    这个类型能保存大范围的值,从1001年到9999年,精度为秒,它把日期时间封装到格式为 YYYYMMDDHHMMSS 的整数中,与时区无关,使用8个字节的存储空间。
    默认情况下,MySQL以一种可排序的,无歧义的格式显示DATETIME值,例如 "2018-01-16 22:37:08",这是ANSI标准定义的日期和时间表示方法。

  • TIMESTAMP
    TIMESTAMP类型保存了从1970年1月1日午夜(格林尼治时间)以来的秒数,和UNIX时间戳相同,TIMESTAMP使用4个字节的存储空间。
    因此它的范围小的多,只能表示从1970 ~ 2038年,TIMESTAMP 显示的值依赖于时区,MySQL服务器,操作系统,以及客户端连接都有的时区设置。

    TIMESTAMP 也有 DATETIME 没有的特殊属性:

    • 当字段定义为timestamp,表示该字段在插入和更新时都不会自动设置为当前时间。
    • 当字段定义为timestamp DEFAULT CURRENT_TIMESTAMP,表示该字段仅在插入且未指定值时被赋予当前时间。
    • 当字段定义为timestamp ON UPDATE CURRENT_TIMESTAMP,表示该字段在插入且未指定值时被赋值为"0000-00-00 00:00:00",在更新且未指定值时更新为当前时间。
    • 当字段定义为timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,表示该字段在插入或更新时未指定值,则被赋值为当前时间。
  • 日期和时间的函数
    SELECT Now();        // 返回当前日期时间
    SELECT Date(Now());    // 返回一个日期时间的日期部分
    SELECT Time(Now());    // 返回一个日期时间的时间部分
    
    SELECT CurDate();    // 返回当前日期
    SELECT Year(CurDate())   // 返回一个日期或者日期时间的年
    SELECT Month(CurDate())  // 返回一个日期或者日期时间的月份
      
    SELECT CurTime();    // 返回当前时间
    SELECT Hour(CurTime());    // 返回一个时间或者日期时间的小时部分
    SELECT Minute(CurTime())   // 返回一个时间或者日期时间的分部分
    SELECT Second(CurTime())   // 返回一个时间或者日期时间的秒部分
      
    SELECT Date_Format(Now(), '%Y-%m-%d');         // 时间转字符串
    SELECT Str_To_Date('2017-08-02', '%Y-%m-%d');  // 字符串转时间
    
    SELECT Unix_Timestamp(Now());        // 时间转时间戳
    SELECT From_Unixtime(1451997924);    // 时间戳转时间 
    
常用函数
  • 字符串
  • 数值处理
事务
  • 开启事务
    使用start transaction;或者begin;开启一个新的事务;
  • 提交事务
    commit,提交当前事务,使其持久化;
  • 回滚事务
    rollback,回滚当前事务。
    下面举个例子:
begin;
  ......
commit;

通过 begin 或 start transaction 命令只是开启了一个事务,如果没有commit 的话,其实对数据是没有真正的修改的(可以使用Navicat工具,同时开启两个查询窗口来验证)。

视图
触发器
存储过程
安全管理

MySQL服务器的安全基础是:用户应该对他们需要的数据具有适当的访问权,既不能多,又不能少。

  • 管理用户
    MySQL用户账号和信息存储在名为mysql的数据库中(一般不需要直接访问mysql数据库和表)mysql的数据库中有一个名为user的表,它包含了用户账号。

    use mysql;
    SELECT user FROM user;
    +-------+
    
    
    • 创建用户
      创建用户,使用CREATE USER语句
      CREATE USER username BY password;
      
    • 用户账号重命名
      RENAME USER olduser To newuser;
      
    • 删除用户
      DROP USER user;
      
    • 修改密码
      SET PASSWORD FOR username = Password('password');  #  Password()是一个函数
      
  • 设置访问权限
    在创建用户账户后,必须接着分配访问权限,新创建的用户账号没有访问权限,它们只能登录MySQL,但不能看到数据,不能执行任何数据库操作。

    为了设置权限,使用GRANT语句,GRANT语句要求你至少给出以下信息:

    • 要授予的权限
    • 被授予访问权限的数据库或表
    • 用户名
    GRANT SELECT ON test.* to tiger  # 允许用户在test上的所有表使用SELECT
    flush privileges;  # 刷新权限
    
    • 查询某个用户的权限
    SHOW GRANTS FOR tiger;
    
  • 撤销访问权限
    GRANT的反操作为REVOKE,用它来撤销特定的权限。被撤销的权限一定要存在。

    REVOKE SELECT ON test.* to tiger 
    
  • 权限
    GRANT 和 REVOKE 可在几个层次上控制访问权限:

    • 整个服务器,使用 GRANT ALL 和 REVOKE ALL
    • 整个数据库,使用 ON database.*
    • 特定的表,使用 ON database.table
    • 特定的列
    • 特定的存储过程
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容