【MYSQL】MYSQL数据库命令大全

🌷 1. root 用户登录

  • root 用户登录
mysql -u root -p
  • 使用mysql数据库
use mysql;
  • 更新用户表的root账户,设置为任意ip都可以访问,密码修改为123456
update user set host="%",authentication_string=password('root') where user="root";
  • 刷新权限
flush privileges;
  • 退出
quit;

🌷 2. 数据库的操作

  • 显示当前的数据库
SHOW DATABASES;
  • 创建数据库
CREATE DATABASE [IF NOT EXISTS] db_name CHARACTER SET utf8mb4;

MYSQL中允许用户使用关键字做为数据库名,但是需要用反引号把关键字引起来

  • 查看数据库字符集
show variables like '%character%';
  • 使用数据库
use 数据库名;
  • 查看下当前使用的是哪个数据库:
select database();
  • 删除数据库
DROP DATABASE [IF EXISTS] db_name;

🌷 3. 常用数据类型

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

🌷 4. 表的操作

  • 查看表结构
desc 表名;

⭐ 4.1 创建表

CREATE TABLE table_name (`
`field1 datatype,`
`field2 datatype,`
`field3 datatype);`
-- 可以使用comment增加字段说明

🍁 约束类型

NOT NULL -- 指示某列不能存储 NULL 值。
UNIQUE -- 保证某列的每行必须有唯一的值。
DEFAULT -- 规定没有给列赋值时的默认值。
PRIMARY KEY -- NOT NULL 和 UNIQUE的结合。确保某列(或两个列多个列的结合)有唯一标识,
auto_increment--对于整数类型的主键,常配搭自增长auto_increment来使用。插入数据对应字段不给值时,使用最大值+1。
FOREIGN KEY -- 保证一个表中的数据匹配另一个表中的值的参照完整性。
CHECK -- 保证列中的值符合指定的条件。对于MySQL数据库,对CHECK子句进行分析,但是忽略CHECK子句。
  • 外键使用语法:
foreign key (字段名) references 主表() 

案例:

-- 设置学生表结构
create table student (
	id int primary key auto_increment,
    sn int unique comment '学号',
    sex varchar(1),
    check (sex ='男' or sex='女'),
    name varchar(255) default 'unkown', 
    qq_mail VARCHAR(20),
	classes_id int not null,
	FOREIGN KEY (classes_id) REFERENCES classes(id)
);

⭐ 4.2 插入

INSERT [INTO] table_name [(column [, column] ...)]
VALUES(value_list) [, (value_list)] ...

案例:

-- 插入两条记录,value_list 数量必须和定义表的列的数量及顺序一致
INSERT INTO student VALUES (100, 10000, '唐三藏', NULL);
INSERT INTO student VALUES (101, 10001, '孙悟空', '11111');
-- 插入两条记录,value_list 数量必须和指定列数量及顺序一致
INSERT INTO student (id, sn, name) VALUES
 (102, 20001, '曹孟德'),
 (103, 20002, '孙仲谋');

从另一张表中复制:

-- 将学生表中的所有数据复制到用户表
insert test_user(name,email) select name,qq_mail from student; 

⭐ 4.3 查询

MYSQL语句的执行顺序:from -> where -> select -> group by

SELECT
[DISTINCT] {* | {column [, column] ...}
[FROM table_name]
[WHERE ...]
[ORDER BY column [ASC | DESC], ...]
LIMIT ...

案例:

-- 通常情况下不建议使用 * 进行全列查询
-- 1. 查询的列越多,意味着需要传输的数据量越大;
-- 2. 可能会影响到索引的使用。
SELECT * FROM exam;
-- 指定列的顺序不需要按定义表的顺序来
SELECT id, name, english FROM exam;
-- 表达式不包含字段
SELECT id, name, 10 FROM exam;
-- 表达式包含一个字段
SELECT id, name, english + 10 FROM exam;
-- 表达式包含多个字段
SELECT id, name, chinese + math + english FROM exam;
-- 结果集中,表头的列名=别名
SELECT id, name, chinese + math + english 总分 FROM exam;

🍁 去重:DISTINCT

-- 去重结果
SELECT DISTINCT math FROM exam;

🍁 排序:ORDER BY

– ASC 为升序(从小到大)
– DESC 为降序(从大到小)
默认为 ASC

 --查询同学姓名和 qq_mail,按 qq_mail 排序显示
SELECT name, qq_mail FROM student ORDER BY qq_mail;
SELECT name, qq_mail FROM student  ORDER BY qq_mail DESC;

🍁 条件查询:WHERE

在这里插入图片描述

在这里插入图片描述

案例:

-- 查询语文成绩在 [80, 90] 分的同学及语文成绩
SELECT name, chinese FROM exam_result WHERE chinese BETWEEN 80 AND 90;
-- 查询数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩
SELECT name, math FROM exam_result WHERE math IN (58, 59, 98, 99);
-- % 匹配任意多个(包括 0 个)字符
SELECT name FROM exam_result WHERE name LIKE '孙%';-- 匹配到孙悟空、孙权
-- _ 匹配严格的一个任意字符
SELECT name FROM exam_result WHERE name LIKE '孙_';-- 匹配到孙权
 查询 qq_mail 已知的同学姓名
SELECT name, qq_mail FROM student WHERE qq_mail IS NOT NULL;

🍁 分页查询:LIMIT

– 起始下标为 0
– 从 0 开始,筛选 n 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n;
– 从 s 开始,筛选 n 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s, n;
– 从 s 开始,筛选 n 条结果,比第二种用法更明确,建议使用
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s;

案例:

-- 第 1 页
SELECT id, name, math, english, chinese FROM exam_result ORDER BY id LIMIT 3 OFFSET 0;
-- 第 2 页
SELECT id, name, math, english, chinese FROM exam_result ORDER BY id LIMIT 3 OFFSET 3;
-- 第 3 页,如果结果不足 3 个,不会有影响
SELECT id, name, math, english, chinese FROM exam_result ORDER BY id LIMIT 3 OFFSET 6;

🍁 聚合函数

在这里插入图片描述

案例:

-- 统计班级共有多少同学
select count(*)from student;
-- 统计班级收集的 qq_mail 有多少个,qq_mail 为 NULL 的数据不会计入结果
select count(qq_mail) from student where qq_mail != null;
-- 统计数学成绩总分
select sum(math) from exam;
-- 不及格同学的数学成绩,没有结果,返回 NULL
select sum(math) from exam where math < 60;
-- 统计平均总分
select avg(chinese + math + english) from exam;
-- 返回英语最高分
select max(english) from exam;
-- 返回 > 70 分以上的数学最低分
select min(math) from exam where math > 70;

🍁 GROUP BY子句

select column1, sum(column2), .. from table group by column1;
按group by 中的字段分组查询

-- 查询每个角色的最高工资、最低工资和平均工资:
select role,max(salary),min(salary),avg(salary) from emp group by role;

🍁 HAVING

--显示平均工资低于1500的角色和它的平均工资
select role,max(salary),min(salary),avg(salary) from emp group by role having avg(salary) < 1500;
select role,avg(salary) from emp where salary < 1500 group by role;

🍁 内连接

select 字段 from1 别名1 [inner] join2 别名2 on 连接条件 and 其他条件;
select 字段 from1 别名1,2 别名2 where 连接条件 and 其他条件;

案例:

select sco.score from student stu inner join score sco on stu.id=sco.student_id
and stu.name='许仙';
-- 或者
select sco.score from student stu, score sco where stu.id=sco.student_id and
stu.name='许仙';

🍁 外连接

– 左外连接,表1完全显示
select 字段名 from 表名1 left join 表名2 on 连接条件;
– 右外连接,表2完全显示
select 字段 from 表名1 right join 表名2 on 连接条件;
-- “老外学中文”同学 没有考试成绩,也显示出来了
select * from student stu left join score sco on stu.id=sco.student_id;
-- 对应的右外连接为:
select * from score sco right join student stu on stu.id=sco.student_id;

🍁 自连接

自连接是指在同一张表连接自身进行查询。

案例:

-- 显示所有“计算机原理”成绩比“Java”成绩高的成绩信息
SELECT s1.* FROM score s1,score s2 
WHERE
 s1.student_id = s2.student_id
 AND s1.score < s2.score
 AND s1.course_id = 1
 AND s2.course_id = 3;

🍁 子查询

子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询

案例:查询“语文”或“英文”课程的成绩信息

  1. [NOT] IN关键字
-- 使用IN
select * from score where course_id in (select id from course where
name='语文' or name='英文');
-- 使用 NOT IN
select * from score where course_id not in (select id from course where
name!='语文' and name!='英文');

  1. [NOT] EXISTS关键字
-- 使用 EXISTS
select * from score sco where exists (select sco.id from course cou 
where (name='语文' or name='英文') and cou.id = sco.course_id);
-- 使用 NOT EXISTS
select * from score sco where not exists (select sco.id from course cou 
where (name!='语文' and name!='英文') and cou.id = sco.course_id);

🍁 合并查询

union
该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。

案例:查询id小于3,或者名字为“英文”的课程:

select * from course where id < 3
union
select * from course where name='英文';

union all
该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行。

案例:查询id小于3,或者名字为“Java”的课程

- 可以看到结果集中出现重复数据Java
select * from course where id<3
union all
select * from course where name='英文';

⭐ 4.4 修改

UPDATE table_name SET column = expr [, column = expr ...] [WHERE ...]
[ORDER BY ...] [LIMIT ...]

案例:

-- 将曹孟德同学的数学成绩变更为 60 分,语文成绩变更为 70 分
UPDATE exam_result SET math = 60, chinese = 70 WHERE name = '曹孟德';
-- 将总成绩倒数前三的 3 位同学的数学成绩加上 30 分
UPDATE exam_result SET math = math + 30 ORDER BY chinese + math + english LIMIT 3;
-- 将所有同学的语文成绩更新为原来的 2 倍
UPDATE exam_result SET chinese = chinese * 2;

⭐ 4.5 删除

DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]
-- 删除孙悟空同学的考试成绩
DELETE FROM exam_result WHERE name = '孙悟空';
-- 删除整表数据
DELETE FROM for_delete;

🌷 5. 索引

  • 查看索引
show index from 表名;
  • 创建索引
create index 索引名 on 表名(字段名);
create index 索引名 on 表名(字段名1,字段名2...);
  • 删除索引
drop index 索引名 on 表名;

🌷 6. 事务

  • 使用
1)开启事务:start transaction;2)执行多条SQL语句
(3)回滚或提交:rollback/commit;
说明:rollback即是全部失败,commit即是全部成功。
  • 查看当前事务的隔离级别
show variables like '%tx_isolation'; 
  • 修改事务的隔离级别
set @@global.tx_isolation = 'READ-UNCOMMITTED'; //全局
set @@session.tx_isolation = 'READ-UNCOMMITTED'; //当前session
set @@tx_isolation = 'READ-UNCOMMITTED'; //仅对下⼀个事务⽣效

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码

)">
< <上一篇
下一篇>>