zoukankan      html  css  js  c++  java
  • MySQL基本命令总结及深入

    MySQL基本命令

    进入mysql:

    -- 下载mysql数据库网址:(MySQL Community Server)
    https://dev.mysql.com/downloads/mysql/
    -- 进入到安装MySQL目录下的bin目录 使用命令:
    mysql -uroot -p ⏎;
    -- 输入密码
    -- 显示数据库列表
    show databases; 
    -- 使用数据库并显示其中所有表
    use 数据库名; show tables;
    
    • Navicat工具可以使用命令行模式来进行操作

    准备工作

    本次SQL语句的学习,将使用数据库:“wmjMysql”,数据表:"user"、"admin",以及创建出基本的测试数据来进行学习。

    基本sql语句的记录;

    -- 删除数据库
    DROP DATABASE wmjMysql;
    -- 创建数据库
    CREATE DATABASE ;
    -- 使用数据库
    USE wmjMysql;
    -- 删除数据表
    DROP TABLE user;
    DROP TABLE admin;
    -- 查看表结构
    DESC user;
    -- 查看表的详细定义
    SHOW CREATE TABLE user;
    -- 创建数据表	
    -- 创建用户表  关联admin表
    CREATE TABLE user(
    	uid    INT  AUTO_INCREMENT,
    	name	VARCHAR(50),
    	birthday DATE,
    	sex		VARCHAR(10),
    	CONSTRAINT pk_uid  PRIMARY KEY(aid)
    );
    CREATE TABLE admin(
    	aid    INT  AUTO_INCREMENT,
    	name	VARCHAR(50),
    	CONSTRAINT pk_aid  PRIMARY KEY(uid)
    );
    -- 增加测试数据
    INSERT INTO user(name,birthday,sex)  VALUES ('张三','1995-11-11','男');
    INSERT INTO user(name,birthday,sex)  VALUES ('李四','1995-12-12','女');
    INSERT INTO user(name,birthday,sex)  VALUES ('王五','1996-10-15','男');
    INSERT INTO user(name,birthday,sex)  VALUES ('赵六','1997-05-27','女');
    INSERT INTO user(name,birthday,sex)  VALUES ('韩七','1998-12-19','男');
    INSERT INTO user(name,birthday,sex)  VALUES ('彭八','1998-11-24','女');
    INSERT INTO user(name,birthday,sex)  VALUES ('wmj','1995-12-19','男');
    INSERT INTO user(name,birthday,sex)  VALUES ('ZHANGSAN','1995-12-19','男');
    INSERT INTO user(name,birthday,sex)  VALUES ('aaa','1998-11-24','女');
    
    INSERT INTO admin(name)  VALUES ('张三');
    INSERT INTO admin(name)  VALUES ('李四');
    INSERT INTO admin(name)  VALUES ('王五');
    INSERT INTO admin(name)  VALUES ('赵六');
    INSERT INTO admin(name)  VALUES ('韩七');
    INSERT INTO admin(name)  VALUES ('彭八');
    -- 事务提交
    COMMIT;
    -- 查询所有
    SELECT * FROM user;
    SELECT * FROM admin;
    

    user表

    image-20191009135109747

    admin表

    image-20191009135027559

    注释

    • mysql的注释为:“-- ...” or "#..." or "/.../" oracle的注释为:"--"
    • 缺省,可理解为“省略的值为默认值”,直译; 如果是意译的话则应该为:"默认值"

    sql语句

    列操作与表操作

    -- 创建学生表 用来测试列操作和表操作
    CREATE TABLE student(
    	sid    INT  AUTO_INCREMENT,
    	name	VARCHAR(50),
    	sex		VARCHAR(10),
    	birthday DATE,
    	createTime1 TIME,
    	createTime2 DATETIME,
    	createTime3 TIMESTAMP,
    	CONSTRAINT pk_sid  PRIMARY KEY(sid)
    );
    -- 增加测试数据
    INSERT INTO student(name,sex,birthday,createTime1,createTime2,createTime3)  VALUES ('1001','女','1998-11-24',CURTIME(),'2019-10-08',NOW());
    INSERT INTO student(name,sex,birthday,createTime1,createTime2,createTime3)  VALUES ('1001','女',CURDATE(),CURTIME(),NOW(),NOW());
    INSERT INTO student(name,sex,birthday,createTime1,createTime2,createTime3)  VALUES ('1003','男','1998-11-24','14:14:14','2019-10-08','2019-10-08');
    
    
    • student表

      image-20191009140120278

    • 列和表的基本操作

    -- 修改表名
    ALTER TABLE 表名 RENAME TO 新表
    ALTER TABLE student RENAME TO student1;
    -- 给表添加列
    ALTER TABLE 表名 ADD 列名 列的类型 [属性约束];
    ALTER TABLE 表名 ADD 列名 列的类型 [属性约束] FIRST; /*放在第一位*/
    ALTER TABLE 表名 ADD 列名 列的类型 AFTER 列名; /*放在某字段后面*/
    ALTER TABLE student ADD createTime0 DATE AFTER birthday;
    -- 修改已有列的数据类型,约束 
    -- 默认值,DATE,TIME不能使用函数默认值。DATETIME与TIMESTAMP可以使用NOW()函数默认值
    ALTER TABLE 表名 MODIFY 列名 列的类型 [属性约束]
    ALTER TABLE student MODIFY createTime2 DATE NOT NULL;
    ALTER TABLE student MODIFY createTime2 DATETIME NULL;
    ALTER TABLE student MODIFY createTime2 DATETIME NOT NULL DEFAULT NOW();
    -- 删除列
    ALTER TABLE 表名 DROP 列;
    ALTER TABLE student DROP createTime0;
    -- 修改列名和类型
    ALTER TABLE 表名 CHANGE 列名 新_列名 列的类型 [属性约束]; -- 列名不一定要新的
    ALTER TABLE student ADD createTime DATE AFTER birthday;
    ALTER TABLE student CHANGE createTime createTime0 DATE NULL;
    ALTER TABLE student CHANGE createTime createTime0 DATE DEFAULT '2019-10-08';
    -- 设置/删除 DEFAULT
    ALTER TABLE 表名 ALTER 列名 SET DEFAULT 默认值
    ALTER TABLE 表名 ALTER 列名 DROP DEFAUL
    ALTER TABLE student ALTER createTime0 SET DEFAULT '2019-10-07';
    ALTER TABLE student ALTER createTime0 DROP DEFAULT;
    -- 唯一约束
    CREATE TABLE student1(id INT UNIQUE, sex CHAR(2));
    CREATE TABLE student1(id INT, sex CHAR(2), UNIQUE(id)); -- 第二种写法
    

    基本的sql查询语句

     -- 查询所有
    SELECT * FROM user;
    -- 查询指定的字段
    SELECT name,birthday,sex FROM user;
    -- 查询指定的字段
    SELECT uid,name FROM user;
    -- 去重复
    SELECT DISTINCT sex FROM user;
    -- 使用限定查询  选用逻辑运算符
        -- 与(and),可以连接多条 ; 或(or),可以连接多个条件; 非(not)取反操作
        SELECT name,birthday,sex FROM user where uid=1 and sex = '男';
        SELECT name,birthday,sex FROM user where uid=1 or sex = '女';
        SELECT uid,name,birthday,sex FROM user where not sex = '女';
        
        -- 关系运算符   >, <, >=, <=, =, !=, <>(不等于),
        SELECT uid,name,birthday,sex FROM user where uid > 2;
        SELECT uid,name,birthday,sex FROM user where uid < 2;
        SELECT uid,name,birthday,sex FROM user where uid = 2;
        SELECT uid,name,birthday,sex FROM user where uid != 2;
        SELECT uid,name,birthday,sex FROM user where uid <> 2;
        
        -- 范围查询
        -- 两种实现方式  1、and  2、between  最小值  and 最大值   建议使用第二种  效率高点
        SELECT uid,name,birthday,sex FROM user where birthday >= '1996-10-15' and birthday <= '1998-12-19';
        SELECT uid,name,birthday,sex FROM user where birthday BETWEEN '1996-10-15' and  '1998-12-19';
        
        -- 列表范围以及模糊查询
            -- 列表范围查询  关键字 in 
            SELECT uid,name,birthday,sex FROM user where uid in(1,3,5);
            SELECT uid,name,birthday,sex FROM user where uid not in(1,3,5);
            -- 使用模糊查询  %表示匹配任意长度、任意类型  _表示匹配一个字符的位置
            SELECT uid,name,birthday,sex FROM user where name LIKE '%三%';
            SELECT uid,name,birthday,sex FROM user where name LIKE '_三%';
            SELECT uid,name,birthday,sex FROM user where name NOT LIKE '_三%';
        -- 排序操作 使用order by 进行排序 默认的排序方式ASC 升序操作   DESC 降序(由大到小)
        SELECT uid,name,birthday,sex FROM user  ORDER BY  birthday;
        SELECT uid,name,birthday,sex FROM user  ORDER BY  birthday  DESC;
    -- mysql中函数的使用
        -- 字符函数  接受数据返回具体的字符信息
        -- 实现大小写转换
        INSERT INTO user(name,birthday,sex)  VALUES ('wmj','1995-12-19','男');
        INSERT INTO user(name,birthday,sex)  VALUES ('ZHANGSAN','1995-12-19','男');
        SELECT name,UPPER(name) FROM user;
        SELECT name,LOWER(name) FROM user;
        -- 取得字符串中的长度
        SELECT name,LENGTH(name) FROM user;
        -- 字符串截取操作
        SELECT name,SUBSTR(name,1,2) FROM user; -- mysql中的角标从1开始
        -- 数字函数 对日期进行处理  ROUND(数字,[保留小数位])
        -- 将uid改变 用来测试
        SELECT ROUND(uid+999.1234) uidafter FROM user; -- 不保留小数位,
        SELECT ROUND(uid+999.1234,1) uidafter FROM user; -- 保留小数位,
        SELECT ROUND(uid+999.666333,3) uidafter FROM user; -- 四舍五入
        SELECT ROUND(uid+999.55255,3) uidafter FROM user;
        -- 日期函数 对日起进行格式转换操作
        -- 取得当前日期    
        -- 日期 - 数字 = 日期    日期 + 数字 = 日期   日期 - 日期 = 数字(天数)
        SELECT NOW();
        SELECT SYSDATE();
        SELECT SYSDATE()+3;
        SELECT DATE_FORMAT(SYSDATE()+3,'%Y-%m-%d');
        -- 转换函数 日期、字符、数字进行相互转换
        SELECT CURRENT_TIME;
        SELECT CURRENT_DATE;
        SELECT CURRENT_TIMESTAMP;
        -- 日期字符串转换为日期
        SELECT DATE('1995-12-19');
        -- 日期字符串转换为字符串
        SELECT CHAR('1995-12-19');
        SELECT CHAR(curdate());
    

    sql高级查询

    • teacher表

      image-20191009135235144

    -- 统计全部数据量
    SELECT COUNT(*) FROM teacher;
    -- 求平均值、和、最大值、最小值
    SELECT COUNT(*) FROM teacher;
    SELECT SUM(salary) FROM teacher;
    SELECT AVG(salary) FROM teacher;
    SELECT ROUND(AVG(salary),2) FROM teacher; -- 保留两位小数
    SELECT MAX(salary) FROM teacher;
    SELECT MIN(salary) FROM teacher;
    
    -- 单字段分组统计  定义分组时需要找到字段中共同的属性,便可实现分组操作
    -- 根据性别统计人数
    SELECT sex,COUNT(*) FROM teacher GROUP BY sex;
    -- 根据性别判断平均工资
    SELECT sex,AVG(salary) FROM teacher GROUP BY sex;
    -- 求男女工资总和
    SELECT sex,SUM(salary) FROM teacher GROUP BY sex;
    -- 总和、平均工资、最高工资、最低工资
    SELECT sex,SUM(salary),AVG(salary),MAX(salary),MIN(salary) FROM teacher GROUP BY sex;
    -- HAVING子句的使用 一般在group by语句之后对数据再次进行过滤
    -- 查询平均工资大于2500的信息
    SELECT sex,AVG(salary) FROM teacher GROUP BY sex HAVING AVG(salary)>'2500';
    -- 子查询指的就是在一个查询之中嵌套了其他的若干查询。
    -- 查询工资最低的人员信息
    SELECT * FROM teacher WHERE salary = (SELECT MIN(salary) FROM teacher); 
    -- 分页查询和模糊查询混合使用
    SELECT * FROM teacher WHERE name LIKE '王%' LIMIT 0,2;
    

    多表查询

    -- 认识多表查询
    SELECT * FROM admin,user; -- 54条数据 笛卡尔积
    SELECT * FROM admin; -- 6条数据
    SELECT * FROM user; -- 9条数据
    SELECT * FROM admin,user WHERE admin.`name` = `user`.`name`; -- 6条数据
    SELECT count(*) FROM admin; -- 6条数据
    -- 外连接
    -- 左外连接
    SELECT * FROM user u LEFT OUTER JOIN admin a ON (u.`name` = a.`name`);
    -- 右外连接
    SELECT * FROM user u RIGHT OUTER JOIN admin a ON (u.`name` = a.`name`);
    

    聚合函数

    函数 作用
    COUNT();AVG();SUM();MAX();MIN() 统计;平均值;求和;最大值;最小值

    日期类型函数

    • 查看函数效果时可以使用:select func(); 可以来查看函数效果。
    相关日期函数 功能
    NOW 当前时间 2017-08-06 22:33:39
    YEAR、MONTH、 DAY、HOUR、MINUTE、SECOND 年、月、日、时、分、秒
    CURRENT_DATE 年-月-日 2019-10-07
    CURRENT_TIME 时:分:秒 16:29:41
    DATE_ADD/DATE_SUB 增加/相减
    DATEDIFF 日期差
    • 日期SQL

      -- 2019-10-07 16:27:44
      SELECT NOW(); 
      -- 2019
      SELECT YEAR(NOW()); 
      -- 10
      SELECT MONTH(NOW()); 
      -- 7
      SELECT DAY(NOW()); 
      -- HOUT MINUTE SECOND 用法同上
      -- 2019-10-07 简写CURDATE()
      SELECT CURRENT_DATE(); 
      -- 16:29:41 简写CURTIME()
      SELECT CURRENT_TIME();
      -- 2019-10-07 16:30:01
      SELECT CURRENT_TIMESTAMP();
      -- 2019-10-31
      SELECT LAST_DAY(NOW()); 
      -- 2019-10-31
      SELECT LAST_DAY(str_to_date('2019-12-01 00:00:00','%Y-%m-%d %H:%i:%s'));
      -- 2019-10-09 16:32:28
      SELECT DATE_ADD(NOW(),INTERVAL 2 DAY); 
      -- 2019-10-07 13:33:03
      SELECT DATE_SUB(NOW(),INTERVAL 3 HOUR);
      -- 24   (7号-->31号)
      SELECT DATEDIFF(LAST_DAY(NOW()),NOW());
      

    转换函数

    转换函数 函数作用
    FORMAT 数字到字符串的转化
    DATE_FORMAT 时间到字符串
    STR_TO_DATE 字符串到时间
    • 相关sql
    -- 673,646,728.31
    SELECT FORMAT(673646728.314177926,2);
    -- 2019-10-07 17:39:10
    SELECT SYSDATE();
    -- 20191007173913  加上数字后相当于在秒的后面添加数字
    SELECT SYSDATE()+3;
    -- Oct 07 2019 05:32 PM
    SELECT DATE_FORMAT(NOW(),'%b %d %Y %h:%i %p');
    -- 10-07-2019
    SELECT DATE_FORMAT(NOW(),'%m-%d-%Y');
    -- 2019-12-01 00:00:00
    SELECT STR_TO_DATE('2019-12-01 00:00:00','%Y-%m-%d %H:%i:%s');
    
    
    • DATE_FORMAT 转换函数的各项含义
    %S, %s 两位数字形式的秒( 00,01, . . ., 59) 
    %i 两位数字形式的分( 00,01, . . ., 59) 
    %H 两位数字形式的小时,24 小时(00,01, . . ., 23) 
    %h, %I 两位数字形式的小时,12 小时(01,02, . . ., 12) 
    %k 数字形式的小时,24 小时(0,1, . . ., 23) 
    %l 数字形式的小时,12 小时(1, 2, . . ., 12) 
    %T 24 小时的时间形式(hh : mm : s s) 
    %r 12 小时的时间形式(hh:mm:ss AM 或hh:mm:ss PM) 
    %p AM 或P M 
    %W 一周中每一天的名称( Sunday, Monday, . . ., Saturday) 
    %a 一周中每一天名称的缩写( Sun, Mon, . . ., Sat) 
    %d 两位数字表示月中的天数( 00, 01, . . ., 31) 
    %e 数字形式表示月中的天数( 1, 2, . . ., 31) 
    %D 英文后缀表示月中的天数( 1st, 2nd, 3rd, . . .) 
    %w 以数字形式表示周中的天数( 0 = Sunday, 1=Monday, . . ., 6=Saturday) 
    %j 以三位数字表示年中的天数( 001, 002, . . ., 366) 
    %U 周(0, 1, 52),其中Sunday 为周中的第一天 
    %u 周(0, 1, 52),其中Monday 为周中的第一天 
    %M 月名(January, February, . . ., December) 
    %b 缩写的月名( January, February, . . ., December) 
    %m 两位数字表示的月份( 01, 02, . . ., 12) 
    %c 数字表示的月份( 1, 2, . . ., 12) 
    %Y 四位数字表示的年份 
    %y 两位数字表示的年份 
    %% 直接值“%”
    

    空值判断

    • 在空值判断中注意以下几点:

      • 空值不等于零或空格
      • 空值是指不可用、未分配的值,空值相当于没有值。
      • 空字符串和字符串为null的区别
      • 任何类型的字段都可以允许空值作为值的存在
      • 包括空值的任何算术表达式都等于空,使用IFNULL(expr1,expr2)来处理, expr1为NULL就用expr2替代。
      -- 查询teacher表中所有name字段不为空的所有信息
      SELECT * FROM teacher WHERE name IS NOT NULL;
      -- 计算 薪水salary的所占百分比 = salary/SUM(salary),薪水为NULL的按0算
      SELECT IFNULL(salary,0)/(SELECT SUM(salary) FROM teacher) per FROM teacher;
      

    DML和DDL的区别

    • DDL(data definition language):

      • 数据定义语言,用于定义和管理 SQL 数据库中的所有对象的语言;
      CREATE(创建);ALTER(修改);DROP(删除);TRUNCATE();COMMENT(注释);
      
    • DML(data manipulation language):

      • 数据操作语言,SQL中处理数据等操作统称为数据操纵语言;
      SELECT(查询);UPDATE(更新);INSERT(插入);DELETE(删除)
      
    • DCL

      • 数据控制语言DCL用来授予或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果,对数据库实行监视等。
      GRANT(授权);REVOKE(撤销授权);ROLLBACK(回滚);COMMIT(提交);
      

    提交数据的类型

    • 显式提交、隐式提交及自动提交

      • 显式提交:使用COMMIT命令提交。 在数据库的UPDATE(更新);INSERT(插入);DELETE(删除)操作时,只有当事务在提交到数据库时才算完成。

        mysql>COMMIT;
        
      • 隐式提交:用SQL命令间接完成的提交

        ALTER;AUDIT;COMMENT;CONNECT;CREATE;DISCONNECT;
        DROP;EXIT;GRANT;NOAUDIT;QUIT;REVOKE;RENAME。
        
      • 自动提交:把AUTOCOMMIT设置为ON,则在插入、修改、删除语句执行后,系统将自动进行提交,这就是自动提交。

        mysql>SET AUTOCOMMIT ON;
        

    删除表操作三种方式比较

    • DROPTRUNCATEDELETE
      • DROP (删除表):删除内容和定义,释放空间。相当于执行操作后这个表消失。
      • TRUNCATE (清空表中数据):删除内容、释放空间但不删除定义(保留表的数据结构)。一次将所有数据删除,不能单独删除一行数据。
      • DELETE (删除表中的数据):用于删除表中的行数据。每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存 ,以便进行进行回滚操作。
      • 从功能上看:TRUNCATE TABLE 与不带 WHERE 子句的 DELETE 语句相同:都是删除表中的全部行。但TRUNCATE速度快,而且效率高、使用的系统和事务日志资源少。
        • 使用DELETE语句执行操作时,每次删除一行,都要在事务日志中为所删除的每行记录一项。
        • 使用TRUNCATE通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。
        • TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。并且将新行标识所用的计数值重置。如果需要保留标识计数值,使用 DELETE。如果要删除表定义及其数据,请使用DROP。

    MySQL系列的各类知识点总结,用于回顾;其中知识点来源于网络、视频、书籍等各个途径,如有引用但没标注出,在此致歉!
    原创不易,欢迎转载,转载时请注明出处,谢谢!
    作者:潇~萧下
    原文链接:[https://www.cnblogs.com/manongxiao/p/11644050.html]

  • 相关阅读:
    再起航,我的学习笔记之JavaScript设计模式13(装饰者模式)
    在 ASP.NET Core 中执行租户服务
    再起航,我的学习笔记之JavaScript设计模式12(适配器模式)
    再起航,我的学习笔记之JavaScript设计模式11(外观模式)
    再起航,我的学习笔记之JavaScript设计模式10(单例模式)
    Entity Framework Core 2.0 全局查询过滤器
    再起航,我的学习笔记之JavaScript设计模式09(原型模式)
    APScheduler
    Gvim打造python编辑器,附自己的配置文件
    Python通过logging记录日志并应用coloredlogs在控制台输出有色字体
  • 原文地址:https://www.cnblogs.com/manongxiao/p/11644050.html
Copyright © 2011-2022 走看看