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表
admin表
注释
- 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表
-
列和表的基本操作
-- 修改表名
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表
-- 统计全部数据量
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;
-
删除表操作三种方式比较
- DROP、TRUNCATE、DELETE。
- DROP (删除表):删除内容和定义,释放空间。相当于执行操作后这个表消失。
- TRUNCATE (清空表中数据):删除内容、释放空间但不删除定义(保留表的数据结构)。一次将所有数据删除,不能单独删除一行数据。
- DELETE (删除表中的数据):用于删除表中的行数据。每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存 ,以便进行进行回滚操作。
- 从功能上看:TRUNCATE TABLE 与不带 WHERE 子句的 DELETE 语句相同:都是删除表中的全部行。但TRUNCATE速度快,而且效率高、使用的系统和事务日志资源少。
- 使用DELETE语句执行操作时,每次删除一行,都要在事务日志中为所删除的每行记录一项。
- 使用TRUNCATE通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。
- TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。并且将新行标识所用的计数值重置。如果需要保留标识计数值,使用 DELETE。如果要删除表定义及其数据,请使用DROP。
MySQL系列的各类知识点总结,用于回顾;其中知识点来源于网络、视频、书籍等各个途径,如有引用但没标注出,在此致歉!
原创不易,欢迎转载,转载时请注明出处,谢谢!
作者:潇~萧下
原文链接:[https://www.cnblogs.com/manongxiao/p/11644050.html]