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]

  • 相关阅读:
    1144 The Missing Number (20分)
    1145 Hashing
    1146 Topological Order (25分)
    1147 Heaps (30分)
    1148 Werewolf
    1149 Dangerous Goods Packaging (25分)
    TypeReference
    Supervisor安装与配置()二
    谷粒商城ES调用(十九)
    Found interface org.elasticsearch.common.bytes.BytesReference, but class was expected
  • 原文地址:https://www.cnblogs.com/manongxiao/p/11644050.html
Copyright © 2011-2022 走看看