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]

posted @ 2019-10-09 22:00  潇~萧下  阅读(782)  评论(0编辑  收藏  举报