一篇文章学会MySQL快速入门!
一、MySQL概述
数据库基本概念
数据库的英文单词: DataBase 简称 : DB
用于存储和管理数据的仓库。
数据库的特点:
- 持久化存储数据。其实数据库就是一个文件系统
- 方便存储和管理数据
- 使用了统一的方式操作数据库 -- SQL
数据持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用。 大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存 到硬盘上加以”固化”,而持久化的实现过程大多通过各种关系数据库来完成。
持久化的主要应用是将内存中的数据存储在关系型数据库中,当然也可以 存储在磁盘文件、XML数据文件中。
RDBMS
关系数据库管理系统(Relational Database Management System:RDBMS)是指包括相互联系的逻辑组织和存取这些数据的一套程序 (数据库管理系统软件)。关系数据库管理系统就是管理关系数据库,并将数据进行存取的系统。
常用的关系数据库管理系统产品:MySQL、Oracle、 DB2、SQL Server、Sybase。
SQL
概念:结构化查询语言(Structured Query Language)简称SQL, 结构化查询语言是一种数据库查询和程序设计语言,用于 存取数据以及查询、更新和管理关系数据库系统。
分类
- DML: Data Manipulation Language 数据操纵语言DML用于查询与修改数据记录,包括如下SQL语句:
- INSERT:添加数据到数据库中
- UPDATE:修改数据库中的数据
- DELETE:删除数据库中的数据
- SELECT:选择(查询)数据
- DDL: Data Definition Language 数据定义语言DDL用于定义数据库的结构,比如创建、修改或删除数据库对象,包括如下SQL语句:
- CREATE TABLE:创建数据库表
- ALTER TABLE:更改表结构、添加、删除、修改列长度
- DROP TABLE:删除表
- CREATE INDEX:在表上建立索引
- DROP INDEX:删除索引
- ......
- DCL: Data Control Language 数据控制语言DCL用来控制数据库的访问,定义数据库的访问权限和安全级别,及创建用户。包括如下SQL语句:
- GRANT:授予访问权限
- REVOKE:撤销访问权限
- COMMIT:提交事务处理
- ROLLBACK:事务处理回退
- SAVEPOINT:设置保存点
- LOCK:对数据库的特定部分进行锁定
- ......
作用:
1.是一种所有关系型数据库的查询规范,不同的数据库都支持。
2.通用的数据库操作语言,可以用在不同的数据库中。
3.不同的数据库 SQL 语句有一些区别
MySQL 的语法
- 每条语句以分号结尾,如果在 SQLyog 中不是必须加的。
- SQL 语句可以单行或多行书写,以分号结尾。
- 可使用空格和缩进来增强语句的可读性。
- SQL 中不区分大小写,关键字中认为大写和小写是一样,关键字建议使用大写。
- 注释:
-- 单行注释 /* 多行注释 */ # MySQL特有注释
二、MySQL使用
MySQL安装
Windows安装MySQL5.7.35教程 - 学编程那点事儿 (imyjs.cn)
MySQL基础配置
MySQL服务启动
- cmd--> services.msc 打开服务的窗口
- 使用管理员打开cmd
- net start mysql : 启动mysql的服务
- net stop mysql:关闭mysql服务
MySQL登录
- mysql -uroot -p密码
- mysql -hip -uroot -p连接目标的密码
- mysql --host=ip --user=root --password=连接目标的密码
MySQL退出
- exit
- quit
三、数据处理之查询
基本的SELECT语句
select
字段列表 -- SELECT 标识选择哪些列。
from
表名列表 -- FROM 标识从哪个表中选择
where
条件列表 -- WHERE 标识从选择的条件
group by
分组字段 -- GROUP BY 标识按照哪个字段分组
having
分组之后的条件
order by
排序 -- ORDER BY 标识按照哪个字段排序 【ASC | DESC】
limit
分页限定
-- 计算列
/* 一般可以使用四则运算计算一些列的值。(一般只会进行数值型的计算)
ifnull(表达式1,表达式2):null参与的运算,计算结果都为null
* 表达式1:哪个字段需要判断是否为null
* 如果该字段为null后的替换值。*/
-- 起别名:
-- as:as也可以省略
SELECT last_name AS name, commission_pct comm
FROM employees;
-- 查询指定列
SELECT Sname FROM Student; -- 查询Student数据表中Sname列
-- 查询全部列
SELECT * FROM Course; -- 查询Course数据表中所有列
-- 查询经过计算的值
SELECT Sname,2020-Sage AS '出生年份' FROM Student;
-- 查询Student数据表中Sname 以及 表达式2020-Sage的值并命名表达式组成的新列为‘出生年份’
SELECT Sname,'Year of Birth:',2020-Sage,LOWER(Sdept) FROM Student;
-- SELECT <目标表达式> 可以是表达式、字符串、或函数
SELECT Sname NAME,'Year of Birth:' BIRTH,2020-Sage BIRTHDAY,LOWER(Sdept) DEPARTMENT FROM Student;
-- 不用AS关键字指定别名来表示查询结果的列标题
-- 消除取值重复的行
SELECT Sno FROM SC; -- 查询选修了课程的学生学号
SELECT DISTINCT Sno FROM SC; -- 去除表中重复行数据
列的别名
紧跟列名,也可以在列名和别名之间加入关键字‘AS’,别名使用双引号,以便在别名中包含空格或特殊的字符并区分大小写。
字符串
- 字符串可以是 SELECT 列表中的一个字符,数字,日期。
- 日期和字符只能在单引号中出现。
- 每当返回一行时,字符串被输出一次。
显示表结构
使用 DESCRIBE 命令,表示表结构。
条件查询
1. where子句后跟条件
2. 运算符
* > 、< 、<= 、>= 、= 、<>
* BETWEEN...AND -- 使用 BETWEEN 运算来显示在一个区间内的值
* IN( 集合) -- 使用 IN运算显示列表中的值
* LIKE:模糊查询
-- 使用 LIKE 运算选择类似的值
-- 选择条件可以包含字符或数字
* 占位符:
* _:单个任意字符
* %:代表零个或多个字符(任意个字符)。
-- ‘%’和‘-’可以同时使用。
* IS NULL -- 使用 IS (NOT) NULL 判断空值。
* and 或 && -- AND 要求并的关系为真。
* or 或 || -- OR 要求或关系为真。
* not 或 ! -- 取非(反)
-- 比较大小 =、>、<、>=、<=、!=、<>、!>、!<、
SELECT Sname FROM Student WHERE Sdept='CS'; -- 从Student数据表查询Sdept列为CS的学生姓名
SELECT Sname,Sage FROM Student WHERE Sage<20; -- 从Student数据表查询Sage<20的学生姓名及其年龄
SELECT DISTINCT Sno FROM SC WHERE Grade<90; -- 从SC数据表查询Grade<90的学生学号并去重
-- 确定范围 [NOT] BETWEEN ...AND ...
-- 从Student数据表中查询Sage在20---23之间的学生信息
SELECT Sname,Sdept,Sage FROM Student WHERE Sage BETWEEN 20 AND 23;
-- 从Student数据表中查询Sage不在20---23之间的学生信息 关键字NOT
SELECT Sname,Sdept,Sage FROM Student WHERE Sage NOT BETWEEN 20 AND 23;
-- 确定集合 [NOT] IN...
-- 从Student数据表中查询Sdept为CS,IS,MA的学生名称,性别
SELECT Sname,Ssex FROM Student WHERE Sdept IN ('CS','IS','MA');
-- 从Student数据表中查询Sdept不为CS,IS,MA的学生名称,性别 关键字NOT
SELECT Sname,Ssex FROM Student WHERE Sdept NOT IN ('CS','IS','MA');
-- 字符匹配 LIKE谓词 % _ 通配符
-- 如果LIKE后面的匹配串中不含有通配符,则可以用=运算符取代LIKE谓词,用!=或<>运算符取代 NOT LIKE谓词
SELECT * FROM Student WHERE Sno='201215121';
SELECT * FROM Student WHERE Sno LIKE '201215121'; -- 二者等价
-- 从Student数据表中查询姓刘的学生姓名 学号 性别
SELECT Sname,Sno,Ssex FROM Student WHERE Sname LIKE '刘%';
-- 从Student数据表中查询姓欧阳且全名为三个字的学生姓名
SELECT Sname FROM Student WHERE Sname LIKE '欧阳_';
-- 从Student数据表中查询名字第二个字为阳的学生姓名,学号
SELECT Sname,Sno FROM Student WHERE Sname LIKE '_阳%';
-- 从Student数据表中查询不姓刘的学生姓名 学号 性别
SELECT Sname,Sno,Ssex FROM Student WHERE Sname NOT LIKE '刘%';
-- ESCAPE '<换码字符>' 对通配符进行转义
SELECT Cno,Ccredit FROM Course WHERE Cname Like 'DB\_Design' ESCAPE'\';
-- 涉及空值的查询 IS NULL / IS NOT NULL
SELECT * FROM SC WHERE Grade IS NULL; -- 查询成绩为空的学生学号以及课程号
-- 查询成绩不为空的学生学号以及课程号 注意:IS 不能用=代替
SELECT * FROM SC WHERE Grade IS NOT NULL;
-- 多重条件查询 逻辑运算符AND OR 优先级: AND>OR
-- 查询计算机系且年龄小于20的学生姓名
-- OEDER BY 子句 对查询结果按照一个或多个属性列的升序ASC或降序DESC排列
SELECT Sname FROM Student WHERE Sdept='CS' AND Sage <20;
-- 选修课程号为3的学生号及其成绩 并按照成绩降序排列
SELECT Sno,Grade FROM SC WHERE Cno='3' ORDER BY Grade DESC;
-- 全部学生信息按照所在系的系号升序,同系按照年龄降序排列
SELECT * FROM Student ORDER BY Sdept,Sage DESC;
--聚集函数
SELECT COUNT(*) AS '总人数' FROM Student; -- 查询学生总人数
SELECT COUNT(*) AS '总人数' FROM Student; -- AS可省略
-- 查询选课的学生总人数,避免一名学生选择多门课程重复记录 需要DISTINCT去重 (必须在COUNT函数中使用DISTINCT短语)
SELECT COUNT(DISTINCT Sno) FROM SC;
SELECT MAX(Grade) FROM SC WHERE Cno='1'; -- 查询选择1号课程的最高成绩
SELECT AVG(Grade) FROM SC WHERE Cno='1' ; -- 查询选择1号课程的平均成绩
SELECT SUM(Grade) FROM SC WHERE Sno='201215121'; --查询学号为201215121学生的总成绩
SELECT SUM(Grade) FROM SC,Course WHERE Sno='201215121' AND SC.Cno=Course.Cno; -- 查询学号为201215121学生的选修课程总分数
-- 注意:当聚集函数遇到空值时,除COUNT(*)外,都跳过空值而只处理非空值。
-- WHERE子句中是不能用聚集函数作为条件表达式的
-- 聚集函数只能用于SELECT子句和GROUP BY 中的HAVING子句
-- GROUP BY 子句 将查询结果按某一列或多列的值分组,值相等的为一组
SELECT Cno,COUNT(Sno) FROM SC GROUP BY Cno; -- 查询各个课程号及其选课人数
-- 该语句对查询结果按照Cno的值分组,所有具有相同Cno的元组为一组,然后对每一组作用聚集函数COUNT函数进行计算,求出该组学生人数
SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*) >2; -- 查询选择了三门课程学生的学生号
-- 该语句先用GROUP BY子句按照Sno进行分组,再用聚集函数COUNT对每一组计数,HAVING则是给出了选择条件,只有满足了选择条件,才会被列出
--注意:
--WHERE子句与HAVING短语不同在于作用对象不同
--WHERE子句作用于基本表或视图,从中选择满足条件的元组
--HAVING短语作用于组,从中选择满足条件的组
-- 查询平均成绩大于90的学生号及其平均成绩
SELECT Sno,AVG(Grade) FROM SC GROUP BY Sno HAVING AVG(Grade)>90;
-- 错误!!WHERE子句中是不能用聚集函数作为条件表达式的
SELECT Sno,AVG(Grade) FROM SC WHERE AVG(Grade)>90 GROUP BY Sno;
-- 查询以DB_开头且倒数第三个字符为i 的课程信息 这里第一个_前有\被转义为普通字符_,后面两个仍为通配符_
SELECT * FROM Course WHERE Cname LIKE 'DB\_%i__' ESCAPE'\';
ORDER BY子句
使用 ORDER BY 子句排序
- ASC(ascend): 升序
- DESC(descend): 降序
ORDER BY 子句在SELECT语句的结尾。
四、数据处理之增删改
DML(Data Manipulation Language – 数据操纵语言) 可以在下列条件下执行:
- 向表中插入数据
- 修改现存数据
- 删除现存数据
事务是由完成若干项工作的DML语句组成的
1. 添加数据:
* 语法:
* insert into 表名(列名1,列名2,...列名n) values(值1,值2,...值n);
-- 使用这种语法一次只能向表中插入一条数据。
* 注意:
1. 列名和值要一一对应。
2. 如果表名后,不定义列名,则默认给所有列添加值
insert into 表名 values(值1,值2,...值n);
3. 除了数字类型,其他类型需要使用引号(单双都可以)引起来
4.向表中插入空值
-- 隐式方式: 在列名表中省略该列的值。
-- 显示方式: 在VALUES 子句中指定空值NULL。
2. 删除数据:
* 语法:
* delete from 表名 [where 条件]
* 注意:
1. 如果不加条件,则删除表中所有记录。
2. 如果要删除所有记录
1. delete from 表名; -- 不推荐使用。有多少条记录就会执行多少次删除操作
2. TRUNCATE TABLE 表名; -- 推荐使用,效率更高 先删除表,然后再创建一张一样的表。
3. 修改数据:
* 语法:
* update 表名 set 列名1 = 值1, 列名2 = 值2,... [where 条件];
* 注意:
1. 如果不加任何条件,则会将表中所有记录全部修改。
五、数据库管理DDL
1. 操作数据库:CRUD
1. C(Create):创建
* 创建数据库:
* create database 数据库名称;
* 创建数据库,判断不存在,再创建:
* create database if not exists 数据库名称;
* 创建数据库,并指定字符集
* create database 数据库名称 character set 字符集名;
* 练习: 创建db4数据库,判断是否存在,并制定字符集为gbk
* create database if not exists db4 character set gbk;
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)
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 varchar(20):姓名最大20个字符
* zhangsan 8个字符 张三 2个字符
2.创建表
create table student(
id int,
name varchar(32),
age int ,
score double(4,1),
birthday date,
insert_time timestamp
);
* 复制表:
* create table 表名 like 被复制的表名;
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 表名 ;
六、实例代码
CREATE DATABASE SIMS -- 创建数据库SIMS
ON PRIMARY( -- 配置数据库主文件信息
NAME='SIMS', --主文件名称
FILENAME='D:\SIMS\Smis.mdf', -- 主文件物理存储路径 目标目录必须存在
SIZE=10MB, -- 主文件初始大小
MAXSIZE=50MB, -- 主文件存储最大值
FILEGROWTH=5MB) -- 主文件自增大小
LOG ON( -- 配置数据库日志文件信息
NAME='SIMS_LOG',
FILENAME='D:\SIMS\Smis_Log.ldf',
SIZE=10MB,
MAXSIZE=50MB,
FILEGROWTH=5MB)
CREATE TABLE Student( -- 创建Student数据表
Sno CHAR(9) PRIMARY KEY, -- 创建列Sno 字符型最大值9 设置为主键 列级完整性约束
Sname CHAR(20) UNIQUE, -- 创建列Sname 字符型最大值20 设置为唯一性
Ssex CHAR(2), -- 创建列Ssex 字符型最大值2
Sage SMALLINT, -- 创建列Sage 短整型
Sdept CHAR(20) -- 创建列Sdept 字符型最大值20
);
CREATE TABLE Course( -- 创建Course数据表
Cno CHAR(4) PRIMARY KEY,
Cname CHAR(40) NOT NULL, -- 设置为不可为空值
Cpno CHAR(4),
Ccredit SMALLINT,
FOREIGN KEY(Cpno) REFERENCES Course(Cno)
-- 将Cpno设置为外键 参照数据表Course中的Cno列 表级完整性约束 同时说明参照表与被参照表可以为同一表
);
CREATE TABLE SC(
Sno CHAR(9),
Cno CHAR(4),
Grade SMALLINT,
PRIMARY KEY(Sno,Cno), -- 主键由两个属性构成,必须作为表级完整性进行定义
FOREIGN KEY(Sno) REFERENCES Student(Sno), -- 将Sno设置为外键 参照数据表Student中的Sno列
FOREIGN KEY(Cno) REFERENCES Course(Cno) -- 将Cno设置为外键 参照数据表Course中的Cno列
);
INSERT
INTO Course --(Cno,Cname)
VALUES('7','C语言',null ,null )
-- 因为定义Course数据表时将Cpno作为外键,插入数据时应遵循外键完整性约束,
-- 即在保证被参照表Course中被参照列Cno有数据时才可进行对Cpno进行赋值,所以Cpno应为NULL;
UPDATE Course
SET Cpno=6,Ccredit=4
-- 因为定义Course数据表时将Cpno作为外键,插入数据时应遵循外键完整性约束,
-- 即在更新Course数据表中Cpno列时,须保证被参照表Course中被参照列Cno存在该数据时才可进行对Cpno进行赋值,否则ERROR;
WHERE Cno=7
ALTER TABLE Student -- 修改数据表Student
ADD S_time DATE; -- 添加新列S_time 数据类型为日期型
ALTER TABLE Student -- 修改数据表Student
ALTER COLUMN Sage INT; -- 修改Sage列属性 数据类型为INT
ALTER TABLE Course -- 修改数据表Course
ADD UNIQUE(Cname) -- 增加唯一性给Cname列
CREATE UNIQUE INDEX Stusno -- 创建唯一索引Stusno
ON Student(Sno); -- 基于Student数据表的Sno列
CREATE UNIQUE INDEX Course -- 创建唯一索引Course
ON Course(Cno); -- 基于Course数据表的Cno列
CREATE UNIQUE INDEX SCno -- 创建唯一索引SCno
ON SC(Sno ASC,Cno DESC); -- 基于Course数据表的Cno列降序 --基于Student数据表的Sno列升序
ALTER INDEX Course RENAME TO Coucno -- 提示RENAME附近有语法错误
EXEC sp_rename 'Course.Course', 'Coucno', 'index'
-- EXEC sp_rename '表名.旧索引名', '新索引名', 'index'
-- 或 EXEC sp_rename @objname = '表名.旧索引名', @newname = '新索引名', @objtype = 'index'
DROP INDEX Course; --删除索引Course