MySQL

本文围绕MySQL数据库展开,介绍了数据库基本概念、分类,详细讲解了MySQL的安装、卸载与配置。重点阐述了SQL的分类,包括DDL、DML、DQL等操作,如数据库和表的CRUD、数据增删改、查询等,还介绍了DQL的标准语法结构,涵盖排序、分页、子查询、常用函数及分组查询等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.数据库的基本概念

1.数据库的英文单词:Database 简称 DB
2.什么是数据库
用于存储和管理数据的仓库

3.数据库的特点
1.持久化存储数据的。其实数据库就是一个文件系统
2。方便存储和管理数据
3.使用了统一的方式操作数据库-- SQL

4.数据库的分类
1.RDB(Relational DataBase)关系型数据库
例如:在关系型数据库中 有一张存储了学生数据的表格 还有一张存储了学生年级的表格

学生姓名 性别 年级

石浩然 男 1

陈旭 男 2

年级编号 年级名称 年级…

1 大学一年级

2 大学二年级

性能方面 关系型数据库受限于技术实现,所以有瓶颈。

但是它在安全方面比较可靠。(事务支持好)

2.NoSQL(Not only SQL)不仅仅是SQL 非关系型数据库

文档型数据库

键值对数据库  key  value

	姓名    石浩然

图形数据库

.....

它这种概念正式兴起于web2.0时代 2006-2009… 它的性能非常优异 。

但是它的安全方面要比较差。(事务支持不太好)

RDB(主) + NoSQL(副)

5。常见的数据库软件

  **RDB:**

MySQL   Oracle   SQLServer PostgreSQL MariaDB SQLlite.....

NoSQL:

Redis   Memcached   MongoDB  HBase   Solr   ElasticSearch....

2.MYSql数据库的安装和卸载

1,安装
直接点下一步
2.卸载
1.去MySQL的安装目录找到my.ini文件
2.复制 datadir=“D:/develope/mysql/Data/”
3.卸载Mysql
删除"D:/develope/mysql/Data/"目录下的MySQL文件夹。x
3.配置
1.MySQL服务 启动
1.手动
2.cmd --》services.msc 打开服务窗口 手动打开
3.以管理员身份打开cmd 输入:net start mysql 启动 退出:net stop mysql

 1.  登陆
        1.mysql -uroot -p123
		mysql -uroot -p
		123
    退出:exit	quit
2.mysql -ip(登陆谁的IP)	 -uroot -p(连接目标的密码)

3.mysql --host=IP(登陆谁的IP)  --user=root --password=(连接目标的密码)

mysql  退出:exit	quit

MySQL目录结构
    1.MySQL安装目录
	    配置文件my.ini
	2.MySQL数据目录
	    几个概念
		    数据库:文件夹
			表:文件
			数据:

SQL
1.什么是SQL?
Structured Query Language:结构化查询语言
其实就是定义了操作所有关系型数据库的规则。
每一种数据库操作的方式存在不一样的地方,称为“方言”
2.SQL通用语法
1.SQL 语句可以单行或多行书写,以分号结尾。
2.可以使用空格和缩进来增强语句的可读性。
3.MySQL 数据库的 SQL 语句不区分大小写,关键字建议使用大写。
4。3中注释
1.单行注释 – 注释内容 或
2单行注释: # 注释内容(MySQL 特有)
2.多行注释:/* 注释 */
3.SQL分类
1)DDL(Data definition language)数据定义语言
用来定义数据库对象:数据库,表,列等。关键字:create,drop,alter等
2)DML(Data Manipulation language)数据操作语言
用来定义数据库中表的数据进行增删改:关键字:insert,delete,update等
3)DQL(Data Query language)数据查询语言
用来查询数据库中表的记录(数据)。关键字:select ,where 等
4)DCL(Data Control language)数据控制语言(了解)
用来定义数据库的访问权限和安全级别,及创建用户。关键字:GRANT ,REVOKE 等。

DDL:操作数据库,表

1.操作数据库:CRUD

    **1.C(Create):创建  默认字符集  UTF-8**
	    create database 数据库名称;
		create database if not exists 数据库名称;  判断是否存在,不存在就创建
		create database 数据库名称 character set 字符集名称; 创建指定字符集的数据库。
		create database if not exists 数据库名称 character set 字符集名称;
		判断是否存在并指定字符集
	**2.R(Retrieve):查询**
	    *查询所有数据库的名称:
	      show databases;
	        *查看某个数据库的字符集:查看某个数据库的创建语句
	            show create database 数据库名称;
	**3.U(update):修改**
	    修改数据库的字符集
		    alter database 数据库名称 character set 字符集名称;
	**4.D(Delete):删除**
	    删除数据库(危险动作一般不要用)
		    drop database 数据库名称;
			
	    判断数据库存在,存在再删除
		    drop database if exists 数据库名称;
	**5.使用数据库**
	    查询当前正在使用的数据库名称
		    select database();
		使用数据库   
		    use 数据库名称

2.操作表

    1.C(Create):创建
	    1.语法:
		    create table 表名(
			    列名1 数据类型1,
				列名2 数据类型2,
				...
				列名n 数据类型n
			);
	     注意:最后一列,不需要加逗号(,)
		 数据库类型
		     1.int :整数类型
			     age int,
			2.double :小数类型
			    score double(5,2) 最多有5位,小数点后最多有两位
			3.date:日期,只包含年月日,yyyy-MM-dd
			4.datetime :日期,包含年月日时分秒 yyyy-MM-dd HH:mm:ss
			5.timestamp :时间戳类型  包含年月日时分秒 yyyy-MM-dd HH:mm:ss
			    如果将来不给这个字段赋值,或者赋值为null,则默认使用当前的系统时间,
				来自动赋值
			6.varchar:字符串
			    name vachar(20);姓名最大20个字符
				   zhangsan 8个字符  张三 2个字符
			
			创建表
			    create table student(
				    id int,
					name varchar(20),
					age int,
					score double(4,1)
					brithday date,
					insert_time timestamp
					);
			复制:
			    create table stu like student;
			
			
			
	2.R(Retrieve):查询
	    查询某个数据库中所有的表名称
		    show tables;
		查询表结构
		    desc 表名;
	3.U(update):修改
	    1.修改表名
		    alter table 表名 rename to 新的表名;
		2.修改表的字符集
		    alter table 表名 character set 字符集名称;
		3.添加一列
		    alter table 表名 add 列名 数据类型;
		4.修改列名称 类型
		    alter table 表名 change 列名 新列名 新数据类型;
            alter table 表名 modify 列名 新数据类型;				
		5.删除列
		    alter table 表名 drop 列名;
	
	4.D(Delete):删除
	    drop table 表名;
	    drop table if exists 表名;

DML:增删改表中数据

  **1.添加数据**
		语法:
		    insert into 表名(列名1,列名2...列名n) values (值1,值2,...值n);
		注意:
		    1.列名和值要一一对应。
			2.如果表名后,不定义列名,则默认给所有列添加值。
				insert into 表名 values (值1,值2,...值n);
			3.除了数字类型,其他类型需要使用引号(单双都可以 建议用单引号)扩起来。
  **2.删除数据:**
        语法: 
		    delete from 表名[wherw 条件]
		注意:
		    1.如果不加条件,则删除表中所有记录。(不建议使用)
			2.如果要删除所有记录
			    1.delete from 表名; -- 不推荐使用。
				     有多少条记录就会执行多少次删除操作(效率比较低)
				2.truncate table 表名; -- 推荐使用  效率高。
					 先删除表,然后再创建一张一模一样的表。
	3.修改数据:
		语法:
		    updata 表名 set 列名1 = 值1,列名2 = 值2,...[where 条件];
		注意:  
		    1.如果不加条件,则修改表中所有记录。(不建议使用)

<面试题>DELETE TRUNCATE的区别

**相同点:**都可以进行数据删除(全表删除)
**不同点:**DELETE可以进行条件删除 TRUNCATE只能进行全表删除
**不同点:**DELETE会保留自增序列 TRUNCATE除了表结构 其他数据全部清空 不会保留自增序列
**不同点(先了解):**TRUNCATE会结束事务 而DELETE不会影响到事务

DQL(Data Query Language) 数据查询语言

它是SQL中最核心的部分!可难可易!
– 【1.掌握MySQL的标准查询语句结构】

SELECT [ALL|DISTINCT]
	{* | 表名.* | 表名.字段名.... [AS 别名]}
FROM 要查询的表名 [AS 别名]
	[LEFT | RIGHT | INNER JOIN 连接表名 [AS 别名]]
WHERE 查询条件;

– 1.1 SELECT后 FROM前的这一块内容 它是用来筛选查询字段的
– 简单理解就是你想查看哪些信息 例如:我想查看student表中的学生名、学生年龄、学生性别信息
1.查看学生表中的所有信息
不推荐写* 推荐写全字段名年列表
效率低
SELECT * FROM student;
2.查看学生表中的学生姓名和性别
SELECT stuName,gender FROM student;

– 1.2 别名(比较常用) 注意:此处使用中文只不过是方便你理解而已 后面不会采用写中文别名
AS关键字可以省略 ''也可以省略
SELECT stu.stuName AS ‘姓名’,stu.gradeId + 1 年级 FROM student stu;
如果SQL过长可以进行"美化"
推荐写法

SELECT
	stuName AS '姓名',
	gradeId + 1 年级 
FROM
	student;

以前写法

SELECT
	stuName AS '姓名',gradeId + 1 年级
		FROM 	student;

– 1.3 去重 (默认的)ALL所有的、全部 DISTINCT直接的、明显的 (去重)

SELECT ALL stuName,gradeId FROM student;

DISTINCT 用来在指定的查询字段值范围内 去除重复数据

SELECT DISTINCT stuName,gradeId FROM student;
SELECT DISTINCT stuName,gender,gradeId FROM student;

– 1.4 where查询条件
在修改 和 删除时用过 目的是为了防止修改/删除全表。
用于检索数据表中符合条件的记录的
简单理解:上方的操作是用来筛选列的 where是用来筛选行的
在where条件语句中 可以由一个或者多个逻辑表达式组成 结果一般为真或假
<关系/比较运算符和逻辑运算符>

SELECT * FROM student;

查询年级是大于1的学生信息

SELECT * FROM student WHERE gradeId > 1;

复杂条件的处理:逻辑运算符 与and 或or 非not
查询姓名为张三 且 性别为女的学生信息

SELECT * FROM student WHERE stuName = '张三' AND gender = '女';

查询性别是女的 或者 年级为3的

SELECT * FROM student WHERE gender = '女' OR gradeId = 3;

查询性别不是女的

SELECT * FROM student WHERE NOT gender = '女';
SELECT * FROM student WHERE gender <> '女';
SELECT * FROM student WHERE gender != '女';

特殊的比较运算符
IS NULL IS NOT NULL
查询地址为空的学生姓名 查询空千万记住不能使用=

SELECT stuName FROM student WHERE address IS NULL;
SELECT stuName FROM student WHERE address IS NOT NULL;

BETWEEN … AND 在…之间/范围内 它等价于>= and <=
查询年级在2-3之间的学生姓名

SELECT stuName FROM student WHERE  gradeId >= 2 AND gradeId <= 3;

更加简洁

SELECT stuName FROM student WHERE  gradeId BETWEEN 2 AND 3;

IN查询 在…内/里面
查询年级为1或年级为3的学生信息

SELECT * FROM student WHERE gradeId = 1 OR gradeId = 3;

更加简洁

SELECT * FROM student WHERE gradeId IN (1,3);
SELECT * FROM student WHERE gradeId NOT IN (1,3);

– 【2.掌握模糊查询】LIKE 像…一样 喜欢

 %表示任意单个/多个字符  _表示任意单个字符
 查询姓为张的学生信息
SELECT * FROM student WHERE stuName LIKE '张%';
 查询姓张的两个字的学生信息
SELECT * FROM student WHERE stuName LIKE '张_';
 查询名称中带有三的学生信息
SELECT * FROM student WHERE stuName LIKE '%三%';

查询三是姓名第二个字符的学生信息

SELECT * FROM student WHERE stuName LIKE '_三%';

– 【3.理解连接查询原理及掌握连接查询的使用】(多表连查)
– 连接查询:内连接查询、外连接查询、[自连接查询]
内连接:显式内连接、隐式内连接
查询学生的姓名和所在年级

SELECT stuName,gradeId FROM student;

采用显式内连接[推荐给多表起别名 区分清楚 防止出现模糊不清错误]
内连接可以理解为交集

SELECT 
	stu.stuName,g.gradeName
FROM 
	student stu
INNER JOIN grade g 
ON stu.gradeId = g.gradeId; # 关联条件

采用隐式内连接查询 避免笛卡尔积

SELECT
	stu.stuName,g.gradeName
FROM 
	student stu,grade g

SELECT
	stu.stuName,g.gradeName
FROM 
	student stu,grade g
WHERE
	stu.gradeId = g.gradeId;

查询所有的学生姓名、课程名称、考试成绩

SELECT
	stu.stuName,sub.subjectName,r.result
FROM
	student stu,`subject` sub,result r
WHERE 
	stu.stuId = r.stuId 
	AND 
	sub.subjectId = r.subjectId;

外连接:左外连接、右外连接

查询学生的姓名和所在年级

采用左外连接 以左表为主 LEFT JOIN前面的就是左表

SELECT
	stu.stuName,g.gradeName
FROM
	student stu LEFT OUTER JOIN grade g
	ON stu.gradeId = g.gradeId;

采用右外连接

SELECT
	stu.stuName,g.gradeName
FROM
	student stu RIGHT JOIN grade g
	ON stu.gradeId = g.gradeId;

DQL标准语法结构:编写DQL一定要严格按照此语法的顺序来实现!

	SELECT [ALL | DISTINCT] ALL表示查询出所有的内容 DISTINCT 去重
		{* | 表名.* | 表名.字段名[ AS 别名][,...]} 指定查询出的字段的
	FROM
		表名[AS 别名][,表1... AS 别名]
	[INNER | [LEFT | RIGHT] [OUTER] JOIN 另一张表名 [AS 别名] ON 关联条件]
	[WHERE 条件]
	[GROUP BY 分组字段[,...]] 
	[HAVING 给分组后的数据进行条件筛选]
	[ORDER BY 排序字段[,...]]
	[LIMIT [startIndex,]pageSize]

[1.掌握排序查询] ORDER BY

排序:成绩、游戏排行榜(金额、战力、等级…)、音乐、销量
价格、评分、距离…
需求:查询出学生姓名、课程名称、成绩 并且按照成绩进行降序排序
ORDER BY 默认情况下为升序排序即ASC(Ascend) 降序DESC(Descend)

SELECT
	stu.stuName,sub.subjectName,r.result
FROM 
	result r,student stu,`subject` sub
WHERE
	r.stuId = stu.stuId AND r.subjectId = sub.subjectId
ORDER BY r.result DESC;

需求:在上方基础进行改动 要求按照成绩进行降序 且如果成绩相同按照时间降序

SELECT
	stu.stuName,sub.subjectName,r.result,r.examDate
FROM 
	result r,student stu,`subject` sub
WHERE
	r.stuId = stu.stuId AND r.subjectId = sub.subjectId
ORDER BY 
	r.result DESC , r.examDate DESC; # (X) ORDER BY r.result,r.examDate DESC;

[2.掌握限制查询(分页)] LIMIT

LIMIT offset,row;
LIMIT startIndex起始索引<从0开始>,pageSize 分页场景
需求:只想看前两条学生信息

SELECT
	*
FROM
	student
LIMIT 0,2; -- 如果offset是从0开始 那么可以省略 LIMIT 2

分页:因为数据量比较大的时候 如果把所有数据显示在一页上
那么将不利于阅读,且不利于定位查找。所以要对数据进行分页。
假设有20条数据 现在可以将数据拆分成4条每页 则有5页 [后续在Java Web对其进行业务实现]
假设有21条数据 现在可以将数据拆分成4条每页 则有6页
LIMIT可以在我们的MySQL中实现分页的数据查询/指定页码的数据查询
需求:现在学生信息要求每页显示2条 想查看第一页的数据

SELECT * FROM student LIMIT 0,2;

要求查看第二页的数据

SELECT * FROM student LIMIT 2,2;

要求查看第三页的数据

SELECT * FROM student LIMIT 4,2;

页码和起始索引的计算公式:(页码 - 1) * 显示条数

 startIndex = (currentPage - 1) * pageSize;

– [3.掌握MySQL子查询] ()

子查询:在一个查询中又嵌套了其他的查询,那么嵌套的查询就被称为子查询,而外层的查询被称为父查询。
子查询可以任意嵌套!可以出现在INSERT UPDATE DELETE WHERE等中…
建议在初期写子查询时 先将查询进行步骤化
需求:查询在高等数学考试中,成绩比张三高的学生的姓名信息
如果不考虑连表查询

SELECT
	stuId
FROM
	result
WHERE
	subjectId = 1
	AND
	result > 86;

1.查询高等数学的课程编号

SELECT
	subjectId
FROM
	`subject`
WHERE 
	subjectName = '高等数学';

整合

SELECT
	stuId
FROM
	result
WHERE
	subjectId = (
		SELECT
			subjectId
		FROM
			`subject`
		WHERE 
			subjectName = '高等数学'
	)
	AND
	result > 86;

2.查询张三的高数考试成绩

SELECT
	result
FROM
	result
WHERE
	stuId = (SELECT stuId FROM student WHERE stuName = '张三')
	AND subjectId = (SELECT subjectId FROM `subject` WHERE subjectName = '高等数学');

整合

SELECT
	r.stuId,stu.stuName
FROM
	result r,student stu
WHERE
	r.stuId = stu.stuId
	AND
	subjectId = (
		SELECT subjectId FROM `subject` WHERE subjectName = '高等数学'
	)
	AND
	result > (
		SELECT result FROM result WHERE stuId = (
				SELECT stuId FROM student WHERE stuName = '张三'
		)
		AND subjectId = (
				SELECT subjectId FROM `subject` WHERE subjectName = '高等数学'
		)
	);

使用子查询解决连表查询
要求查询学生姓名、年级名称
原来

SELECT stu.stuName,g.gradeName FROM student stu,grade g WHERE stu.gradeId = g.gradeId;

子查询

SELECT
	stu.stuName,
	(SELECT g.gradeName FROM grade g WHERE g.gradeId = stu.gradeId) AS gradeName
FROM
	student stu;

[4.掌握MySQL常用函数]

常用的字符串函数

4.1 字符串拼接 CONCAT(str1,str2,…)

SELECT CONCAT('这是','MySQL','数据库');

4.2 字符串内容替换 REPLACE(str,from_str,to_str)
SELECT REPLACE(‘这是MySQL数据库’,‘MySQL’,‘Oracle’);
4.3 去除左侧空格

SELECT LTRIM('   Hello World  ');

去除右侧空格

SELECT RTRIM('   Hello World  ');

4.4 获取字符串长度

SELECT LENGTH('Hello');

4.5 截取字符串SUBSTR(str,pos) 索引从1开始

SELECT SUBSTR('Hello World',5);
 SUBSTR(str,pos,len)
SELECT SUBSTR('Hello World',5,3);

常用的数学函数

4.6 获取随机数 Math.random();

SELECT RAND();

4.7 向上取整

SELECT CEIL(20.4);

向下取整

SELECT FLOOR(20.7);

4.8 四舍五入

SELECT ROUND(20.5);
SELECT ROUND(20.76,1)

常用的时间函数

4.9 获取当前时间

SELECT NOW();
SELECT CURRENT_DATE();
SELECT CURRENT_TIME();

4.10 获取各种时间信息的函数

SELECT MONTH(NOW());
SELECT YEAR(NOW());
SELECT DAY(NOW());
SELECT HOUR(NOW());
SELECT MINUTE(NOW());
SELECT SECOND(NOW());

4.11 日期转换

SELECT DATE_FORMAT(NOW(),'%Y-%m-%d');

4.12 计算时间差额

SELECT DATEDIFF(NOW(),'2019-05-25');

常用的聚合/统计函数

求年级编号最大的
SELECT MAX(gradeId) FROM grade;
求年级编号最小的
SELECT MIN(gradeId) FROM grade;
 求平均分
SELECT AVG(result) FROM result WHERE subjectId = 1;
 求和
SELECT SUM(result) FROM result WHERE subjectId = 1;
 计算学生总人数
SELECT COUNT(*) FROM student;
SELECT COUNT(stuId) FROM student;
SELECT COUNT(1) FROM student;

[5.掌握分组查询] GROUP BY

注意事项:在分组查询的查询字段中 不要出现与分组查询中无关的字段值
需求:计算各个年级的学生人数

SELECT gradeId,COUNT(1) FROM student GROUP BY gradeId;

如果我希望查看 各个年级的总人数 且要求查看对应的学生姓名列表

SELECT gradeId,COUNT(1),GROUP_CONCAT(stuName) FROM student GROUP BY gradeId;

计算各个年级各个性别的人数

SELECT gradeId,gender,COUNT(1) FROM student GROUP BY gradeId,gender;

需求:查询年级的学生人数大于1人的年级名称

SELECT
	stu.gradeId,count(1),g.gradeName
FROM
	student stu,grade g
WHERE
	stu.gradeId = g.gradeId
GROUP BY 
	gradeId
HAVING 
	count(1) > 1;

HAVING和WHERE的区别?
相同点:都可以用来进行条件判断 筛选行数
不同点:
位置不同:WHERE是在分组之前 HAVING是在分组之后
条件筛选不同:WHERE是给FROM查询到的数据进行条件筛选 而HAVING是对分组后的数据进行筛选

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值