MySQL数据库入门

一.前提知识(准备)

MySQL数据库的优点:

1.开放源代码

2.可跨平台

3.轻量级,能够更快速的、更高效的处理数据

4.成本低

▲注意:

①[ ]号中的是可选项,并非一定要写的

②字段就是表格中的列。

③MySQL不区分 ' 和 " 。

1.必知数据类型:

拓展:

文本文件类型:

类型范围说明
BLOBbinary large object二进制形式的长文本数据
TEXT长文本数据

时间类型:(中间连接符:-  /  .    这三种都行,就是不能写中文)

DATE('1000-01-01','9999-12-31')'YYYY-MM-DD'
DATETIME('1000-01-01 00:00.00','9999-12-31 23:59:59')
 
'YYYY-MM-DD HH:MM:SS'

TIMESTAMP

时间戳

('1970-01-01 00:00:01'UTC,'2038-01-19 03:14:07'UTC)'YYYY-MM-DD HH:MM:SS'

 2.表的完整性约束:

约束条件描述
PRIMARY KEY主键约束,约束字段的值可唯一地标识对应的记录
NOT NULL非空约束,约束字段的值不能为空
UNIQUE唯一约束,约束字段的值是唯一的
CHECK检查约束,限制某个字段的取值范围
DEFAULT默认值约束,约束字段的默认值
AUTO INCREMENT自动增加约束,约束字段的值自动递增
FOREIGN KEY外键约束,约束表与表之间的关系

▲重点讲一下外键约束

外键约束的作用:

1.参照完整性:从表要插入一个主表中有对应主键值的数据行

2.避免数据冗余:避免主表中某些数据重复存储

3.避免意外删除数据:外键约束默认无法对正在使用的主键的行进行删除或修改

外键约束的条件:

主表:主表的外键字段必须引用从表的主键或唯一键。

从表:必须有一个主键。

引用完整性检查:主表中的外键字段必须引用从表中唯一存在的,不能填其他的值。

性能影响:在设计数据库时,需要考虑外键约束对性能的影响,尤其是在大型数据库中,频繁的外键检查可能会对性能产生负面影响。

在创建表的时候加:
constraint FK_从表_主表 foreign key (从表字段,唯一性) references 主表 (字段)

在创建表后
alter table 从表 add constraint FK_从表_主表 foreign key (从表字段,唯一性) references 主表 (字段)

FK_从表_主表 是一个描述性的约束名,它清晰地表明了这个约束是一个从表到主表的外键约束。

问题解答:

问题1:为什么设置主外键后,主表的数据不能随意删除和修改,但是从表中的数据时可以删除和修改?

如果你尝试删除主表中的数据,而该数据在从表(即引用主表的表)中被引用,那么数据库管理系统(DBMS)会阻止这个删除操作,以防止数据不一致。这是因为删除主表中的数据会导致从表中的相关外键失去引用,违反了外键约束。

要正确删除主表中的数据时可以这样做:

  1. 先删除从表中的主键或者置空主键:这种比较常用。
  2. 级联删除:在定义外键约束时,可以指定级联删除,这样当主表中的数据被删除时,从表中的相关数据也会自动被删除。(谨慎使用,因为可能会删除大量数据)
  3. 关闭外键,删除相关信息后再重新启用:有一点不好就是前后数据可能不统一。

*其实在navicat的表的外键设置中有一个“删除时”和“更新时”的选项:其中CASCADE是级联

SET NULL是置空,RESTRICT是默认的阻止删除或更新操作,NO ACTION和RESTRICT差不多但有些细微差别。

二.语言操作(预热)

1.SQL(Structured Query Language)结构化查询语言分类:

DDL数据定义语言用来定义数据库对象:数据库、表、字段
DML数据操作语言数据库中的数据进行增删改查
DQL数据查询语言查询数据库中表的信息
DCL数据控制语言用来创建数据库用户,控制数据库的访问权限

 2.DDL操作:

<1>数据库:

/*创建数据库*/
CREATE DATABASE [IF NOT EXISTS] 数据库名称 [DEFAULT CHARSET 编码格式] [COLLATE 排序规则];


SHOW DATABASES;--查看所有数据库


DROP DATABASE [IF EXISTS] 数据库名称;--删除数据库


USE 数据库名称;--切换使用数据库

<2>表:

--创建表
CREATE TABLE 表名(
列名1 类型 [comment '注释'],
列名2 类型,
列名3 类型,
......
);


SHOW TABLES;--查询当前数据库的所有表


DESC 表名;--查询表结构


SHOW CREATE TABLE 表名;--查询指定表的建表语句



/*拓展内容*/
--快速创建表 复制表结构+数据(只有这些被复制过来了)
CREATE TABLE 表2
AS
SELECT 字段1,字段2... FORM 表1

<3>修改表结构:(有例子)

----添加新列
ALTER TABLE 表名 ADD 字段 类型 [FIRST/AFTER 某字段];


----删除列
ALTER TABLE 表名 DROP 字段;


----修改列属性(类型->另一种类型)
ALTER TABLE 表名 MODIFY 字段 类型;


----修改列名和其属性
ALTER TABLE 表名 CHANGE 字段名(修改前) 字段名(修改后) 类型;


----删除表
DROP TABLE 表名;


----修改表名
ALTER TABLE 表名(前) RENAME 表名(后);--MySQL等
ALTER TABLE 表名(前) RENAME TO 表名(后);--SQLite等

3.DML操作: 

----插入数据
INSERT INTO 表名 (字段1,字段2...) VALUES (数据1,数据2...);


----删除数据行
DELETE FROM 表名 WHERE 字段 = ?;
DELETE FROM 表名;--清空表数据


----更新数据行(就是修改某确定行的部分数据)
UPDATE 表名 SET 字段1 = ?,字段2 = ? WHERE 字段3 = ?;


----查看当前数据库
SELECT DATABASE();


/*拓展内容*/
--批量添加
INSERT INTO 表名 VALUES (1,'xxx'),(2,'xxx'),(3,'xxx');

问题解答:

问题2:DELETE 和 TRUNCATE 的区别是什么?

答:两者都可以删除表的全部数据,但是还是有很多区别:

①DELETE 作为数据操作语言DML;TRUNCATE作为数据定义语言DDL

DELETE FROM 表名;是一条条删数据,直到删完;TRUNCATE保留了表结构,直接删除表后再重建这个表,所有状态相当于新表(这里要是全删TRUNCATE更高效)

DELETE可以回滚,TRUNCATE隐式提交不能回滚

DELETE的表中要是有自增字段,它会从删除的表中的最大值直接往后自增;TRUNCATE删除表后则不会

拓展:

回滚与删除复原的区别

  • 回滚:通常指的是撤销整个事务或到特定回滚点的所有操作,包括删除、插入、更新等。

  • 删除复原:通常指的是特定于删除操作的数据恢复。这可能涉及到备份、日志或其他数据恢复技术。

总结:虽然TRUNCATE删除也有一些优点,但是它特殊的不能回滚的特性使得操作的代价较大,通常还是以DELETE优先。

 4.DQL操作:

<1>基本操作:

--单表查询
select * from 表名;


--查询指定列数据
SELECT 字段1,字段2... FROM 表名;


--用算数运算符查询(不改数据,只查看,适用于已知部分求整体)
SELECT 字段1+数值,字段2-数值,字段3*数值,字段4/数值,字段5%数值... FROM 表名;


--AS取别名,两种形式都可以(别名一般是直观的中文名或英语名,最好加上'')
SELECT 字段1 AS '别名1',字段2 AS '别名2' FROM 表名;
SELECT 字段1  '别名1',字段2  '别名2' FROM 表名;


--DISTINCT去掉重复(去重)
SELECT DISTINCT 字段1... FROM 表名;


--WHERE筛选(<,>,=,<>,!=)
select * from 表名 WHERE 字段1 > 100;


--AND 和 OR 逻辑运算符(AND==&&,OR==||,这里两种皆可,但有的地方不可替代,就像下面的BRTWEEN中)
select * from 表名 WHERE 字段1 > 100 AND 字段2 >100;
select * from 表名 WHERE 字段1 > 100 OR 字段2 >100;


select * from 表名 WHERE 字段1 > 100 && 字段2 >100;
select * from 表名 WHERE 字段1 > 100 || 字段2 >100;


--BRTWEEN区间筛选(大小不要写反,会出错)
select * from 表名 WHERE 字段1 BETWEEN 1 AND 100;
select * from 表名 WHERE 字段1 NOT BETWEEN 1 AND 100;


--IN包含(查询字段中在IN里面出现的值)(以下两个语句等价)
select * from 表名 WHERE 字段1 IN(1,2...);
select * from 表名 WHERE 字段1 = 1 OR 字段1 = 2 OR...;


--LIKE模糊查询(假设查询有'你好!世界'这段话的列,以下为开头,所有,结尾模糊查询)
SELECT * FROM 表名 WHERE 字段1 LIKE '你%';
SELECT * FROM 表名 WHERE 字段1 LIKE '%好%';
SELECT * FROM 表名 WHERE 字段1 LIKE '%界';


拓展.要是想要查询指定位置是否有特定字的列,可以以下这样,用_代替表示前面个数:
SELECT * FROM 表名 WHERE 字段1 LIKE '_好%'; --查第二个字为'好'
SELECT * FROM 表名 WHERE 字段1 LIKE '__!%'; --第三个个字为'!'


--判断是否为空(NULL)(NULL不等于0,注意区分)
SELECT * FROM 表名 WHERE 字段1 IS NULL;
SELECT * FROM 表名 WHERE 字段1 IS NOT NULL;


--小括号()(确定查询优先级,避免意思模糊导致查询错误)
SELECT * FROM 表名 WHERE (字段1=? OR 字段2=?) AND 字段3=?;
SELECT * FROM 表名 WHERE 字段1=? OR (字段2=? AND 字段3=?);


这种就是意思模糊,但是执行的结果是第二种,因为AND优先级比OR高,不推荐使用
SELECT * FROM 表名 WHERE 字段1=? OR 字段2=? AND 字段3=?;

 <2>函数使用:(这里选一些常用的函数)

----单行函数 (执行后会出现多行结果)

--大小写转换(会将其中的英文全部转换)
SELECT UPPER(字段),LOWER(字段) FROM 表名;


--REPLACE字符串替换(不会改变原表数据,只是修改了表的查询,最好只用来转字符,转其他的易报错,str都是字符串)
SELECT REPLACE(字段,str1,str2) FROM 表名;


--SUBSTRING字符串截取(begin和len是数字,begin表示开始位置,len表示截取长度)
SELECT SUBSTRING(字段,begin,len) FROM 表名;


--数值函数(abs绝对值,ceil向上取整,floor向下取整,round四舍五入(可留小数),mod取模,pi圆周率,pow次方,sqrt开方)
SELECT abs(-1),ceil(3.2),floor(3.7),round(3.5), mod(10,3),pi(),pow(2,5),sqrt(25) FROM 表名;
SELECT abs(-1),ceil(3.2),floor(3.7),round(3.5), mod(10,3),pi(),pow(2,5),sqrt(25) FROM DUAL;--DUAL是一个虚表,查看专用
SELECT abs(-1),ceil(3.2),floor(3.7),round(3.5), mod(10,3),pi(),pow(2,5),sqrt(25)
查看模拟数据时以上三种都行


--日期函数(CURDATE只有日期,CURTIME只有时间,NOW日期时间,SYSDATE日期时间)
SELECT CURDATE(),CURTIME(),NOW(),SYSDATE() from 表名;
SELECT CURDATE(),CURTIME(),NOW(),SYSDATE() from dual;


--流程函数

--IF区间判断(条件满足时执行1,不满足时执行2)
SELECT *,IF(字段>10,执行1,执行2)  FROM 表名;


--IFNULL为空判断(一般是判断字段是否为空,不为空就是字段原先的值,为空就填自定义的某个值)
SELECT *,IFNULL(字段,某个值) FROM 表名;


--WHEN条件语句(用来分组或分类的,比如按工资分为'高','中','低'收入)
SELECT *,
CASE
	WHEN id1>=值1 THEN '类1'
	WHEN id1>=值2 THEN '类2'
	ELSE '类3'
END [AS 别名]
FROM 表名;


--NULLIF特定值置空(这里当字段值为1时,直接将其置空,其他情况为字段原先的值)
SELECT *,NULLIF(字段,1) FROM 表名;


----多行函数 (执行后会只有一行结果)

--最大值
SELECT MAX(字段) FROM 表名;


--最小值
SELECT MIN(字段) FROM 表名;


--求和
SELECT SUM(字段) FROM 表名;


--平均数
SELECT AVG(字段) FROM 表名;


--总数(这里返回行数)
SELECT COUNT(字段) FROM 表名;

三.简单实操(动手)

1.创建数据库和表

1.使用文档创建(*第三部分有解释)

首先我们先在笔记本中创建一个没有使用过的表,名字叫my_database

CREATE DATABASE IF NOT EXISTS my_database;
USE my_database;
CREATE TABLE user (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) DEFAULT NULL,
    password VARCHAR(50) DEFAULT NULL
);

 2.在命令行中打开mysql直接创建(--单行注释,/**/多行注释)

mysql -u root -p
password:******
mysql> CREATE DATABASE IF NOT EXISTS my_database;
Query OK, 1 row affected (0.01 sec)--表示成功

SHOW DATABASES;--查看添加的数据库

mysql> use my_database;
Database changed--数据库已经更换

mysql> CREATE TABLE user(
    -> id INT AUTO_INCREMENT PRIMARY KEY,
    -> username VARCHAR(50) DEFAULT NULL,
    -> password VARCHAR(50) DEFAULT NULL
    -> );
Query OK, 0 rows affected (0.03 sec)

mysql> SELECT * FROM user;--查看存的数据
Empty set (0.01 sec)--现在为空

2.查看表的基本信息(DOS)

要查看新创建的表,可以使用以下命令在命令行窗口中查看:

  1. 首先登录到 MySQL 命令行
    这里将绝对路径放下面是直接执行文档中的sql指令(对应上面):

    mysql -u root -p <C:\Users\muyuan\Desktop\text.sql
  2. 输入密码后,选择创建表的数据库(如果不是默认选择的数据库):

    USE my_database;
  3. 使用以下命令查看数据库中的表:

    SHOW TABLES;

    这将列出选定数据库中的所有表。如果看到了创建的 user 表,则表明该表已成功创建。

  4. 要查看表的结构(列和其属性),可以使用以下命令:

    DESCRIBE user;

    这将显示 user 表的列及其相关属性,如数据类型、是否允许为空等,并不是查看表中的数据(标题三有提到)

  5. 查看如下:

3.对表的操作:(SQL)

1.插入数据:
当我们执行了上面的USE my_database;后,我们可以对这个表中的数据进行操作了,下面我们向表中插入一行数据

INSERT INTO user (id, username, password) VALUES (123, 'xiaoli', '456');

2.查看数据:

 插入完成后,我们可以查看一下是否有这个人

SELECT * FROM user;

执行后:

这里验证了插入操作是可行的!

然后我们再次往里面添加元素,添加后:

3.排序:

首先我们可以先试着对id进行排序,这里我们添加的时候是顺序添加的,所以排序来个逆序吧

SELECT * FROM user ORDER BY id DESC;//DESC表示逆序,大->小

排序如下: 

说明:这种排序是不会将原始的表中数据打乱重新按id顺序排列的,只不过是我们使用了一个排序条件让表中的数据按顺序排列出来了,让我们更好的观察和分析数据而已。

NO.49

持续更新中......

以上文章内容仅代表个人观点,请自行参考,如有错误敬请斧正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木鳶戾天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值