数据库的安装、卸载
数据库的启动与登录
启动
通过服务启动MySQL服务。
1、可以通过右键计算机—>管理—>服务和应用程序—>服务,找到MySQL服务启动。
2、可以通过win+R,输入services.msc快捷进入服务页面。
可以将MySQL服务设置为自动启动,就不再需要手动开启了。
通过控制台启动MySQL服务
以管理员模式打开控制台。
1、win10系统,按住win+x,选择图示选项即可快速以管理员模式打开powershell;
2、如果习惯了win+R的方式,可以添加新的命令进去以管理员模式打开cmd控制台,具体方法如下:
在
%windir%\system32\
目录下,找到cmd,添加快捷方式到C:\Windows
目录下,为避免冲突给这个快捷方式起一个别名;右键双击此快捷方式–>快捷方式–>高级–>勾选以管理员方式运行
使用win+R,输入之前的别名即可以管理员方式打开cmd。
net start mysql
:启动MySQL服务。
net stop mysql
:关闭MySQL服务。
登录
本地数据库登录
1、mysql -u用户名 -p密码
2、mysql -u用户名 -p
:回车后要求输入密码
3、mysql -h localhost -P 端口号 -u root -p[密码/回车]
:以本地服务器的方式登录数据库
注意:
-h、-P、-u
后面的空格可有可无,-p
后面如果直接跟密码则不能有空格
远程数据库登录
1、mysql -h远程数据库地址 -u用户名 -p密码
2、mysql -h远程数据库地址 -u用户名 -p
3、mysql --host=远程数据库地址 --user=用户名 --password=密码
4、mysql --host=远程数据库地址 --user=用户名 --password
数据库退出
exit
Ctrl+c
数据库的目录结构
bin
:执行文件
data
:用于放置一些日志文件以及数据库
include
:用于放置一些头文件
lib
:用于放置一系列库文件
share
:用于存放字符集、语言等信息
my.ini
:配置文件
SQL语言
定义
Structured Query Language:结构化查询语言
其实就是定义了操作所有关系型数据库的规则。每一种数据库操作的方式存在不一样的地方,称为“方言”。
通用语法
SQL 语句可以单行或多行书写,以分号结尾。
可使用空格和缩进来增强语句的可读性。
MySQL 数据库的 SQL 语句不区分大小写,关键字建议使用大写。
3 种注释
- 单行注释: – 注释内容(注意–后面的空格) 或 # 注释内容(mysql 特有)
- 多行注释: /* 注释 */(与java多行注释相似)
分类
- DDL(Data Definition Language)数据定义语言
用来定义数据库对象:**数据库,表,列**等。关键字:create, drop,alter 等
- DML(Data Manipulation Language)数据操作语言
用来对数据库中表的**数据**进行**增删改**。关键字:insert, delete, update 等
- DQL(Data Query Language)数据查询语言
用来**查询**数据库中表的**记录(数据)**。关键字:select, where 等
- DCL(Data Control Language)数据控制语言(了解)
用来定义数据库的**访问权限和安全级别,及创建用户**。关键字:GRANT, REVOKE 等
DDL:操作数据库、表
操作数据库:
CRUD语句
CRUD定义:
- C(Create):创建
- R(Retrieve):查询
- U(Update):修改
- D(Delete):删除
Create语句:
1 | create database 数据库名; -- 创建数据库 |
新创建的数据库与已知数据库重名时:
可以使用以下语句避免错误出现:
1 | create database if not exists 数据库名; |
1 | create database 数据库名 character set 字符集名称; -- 创建数据库并指定字符集 |
创建数据库db4,判断是否重名,并指定字符集为gbk:
1 | create database if not exists db4 character set gbk; |
Retrieve语句:
1 | show databases; -- 查询所有已创建的数据库 |
1 | select database(); -- 查询当前所使用的数据库 |
在MySQL数据库的数据目录下(win7:
C:\ProgramData\MySQL\MySQL Server 5.5\data
)有三个文件夹,就是MySQL自带的数据库。**
information_schema
**:视图,并不是真正的数据库。它提供了访问数据库元数据的方式。没有在data目录下。
mysql库
**:这个是mysql的核心数据库,主要负责存储数据库的用户、权限设置、关键字等mysql自己需要使用的控制和管理信息。不可以删除**。
performance_schema
**:对性能提升进行操作的数据库。尽量别动**
test
:测试数据库。
1 | show create database 数据库名; -- 查看某个数据库字符集的名称(安装时默认utf-8)、查看某个数据库的创建语句 |
Update语句:
1 | alter database 数据库名 character set 字符集; -- 更改指定数据库的字符集 |
Delete语句:
1 | drop database 数据库名; -- 删除指定数据库,删除不存在的数据库会报错 |
1 | drop database if exists 数据库名; -- 如果存在则删除 |
使用数据库的语句
1 | select database(); -- 查询当前使用的数据库 |
返回NULL,当前未使用任何数据库;
1 | use 数据库名称; -- 使用指定数据库 |
操作数据库的表:
Create:
1 | create 表名( |
MySQL常见数据类型:
- int:整数类型
age int,
- double:小数类型
score double(int digits1,int digits2),
digits1:位数,digits2:保留小数点后位数- date:日期,只包含年月日,格式:
yyyy-MM-dd
- datetime:日期,包含年月日时分秒,格式:
yyyy-MM-dd HH:mm:ss
- timestamp:时间戳日期,包含年月日时分秒,不赋值或赋值为NULL时,自动为其赋值为当前系统时间。
- varchar:字符串,
name varchar(int length)
length:最多能容纳的字符数。name varchar(20)名字最多容纳20个字符张三:两个字符——zhangsan:八个字符
在数据库db1中创建一个学生表:
1 | create table Student( |
1 | create table 新的表名 like 已存在的表名; -- 复制表 |
Retrieve:
1 | show tables; -- 查询正在使用的数据库中的所有表 |
1 | show tables from 数据库名; -- 查询正在特定的数据库中的所有表,如果当前使用的是另一个数据库,执行命令后仍在此数据库,而不会切换到该特定数据库 |
用use命令切换到mysql:
1 | desc 表名称; -- desc:description ,查询表结构 |
1 | show create table 表名; -- 展示表的字符集 |
Update:
1 | alter table 表名 rename to 新的表名; -- 修改表名 |
1 | alter table 表名 character set 字符集名; |
1 | alter table 表名 add 列名 数据类型; -- 给表添加一列 |
1 | alter table 表名 change 列名 新的列名 新的数据类型; -- 修改表的列名及数据类型 |
1 | alter table 表名 modify 列名 新数据类型; -- 修改列的数据类型 |
1 | alter table 表名 drop 列名; -- 删除列 |
Delete:
1 | drop table 表名; |
1 | drop table if exists 表名; |
DML:操作数据库中表的记录
重点掌握。包括添加数据,删除数据,修改数据。
添加数据
1 | insert into 表名(列名1,列名2,...,列名n) values(值1,值2,...,值n); |
查询表中记录(DQL语句):
注意事项:
1、列名和值要一 一对应(数据类型和个数都要一致);
2、如果表名后不定义列名,则默认给所有列添加值(不想添加值的value可以用NULL表示)
1 | insert into 表名 values(值1,值2,...,值n); |
3、除了数字,其他类型都需要用引号(单双引号皆可)括起来。
删除数据
1 | delete form 表名 [where 条件]; -- []中是可选的 |
不加条件时,默认删除表中所有记录。不推荐使用,因为表中有多少条记录,就会执行多少次删除操作,效率较低。
推荐使用以下语句,删除全部记录,效率比较高:
1 | truncate table 表名; -- 先删除表,再创建一个一模一样的表 |
修改数据
1 | update 表名 set 列名1=值1,列名2=值2,...[where 条件]; |
如果不加任何条件,则会将表中所有记录全部修改。
DQL:数据查询
最重要的内容。
1 | select |
基础查询
1 | select * from 表名; -- 查询表中所有记录 |
多字段查询
1 | select 列名1,列名2,... from 表名; -- 多字段查询 |
查询细节
添加着重号可区分关键字和字段。
比方说,myemployees
表中有个字段为name
,如果不添加着重号,查询时会把name
当作关键字,使得查询出错:
给name
字段加上着重号,可以避免查询出错:
代码演示:
1.创建一个表student:
1 | CREATE TABLE student( |
2.从student表中查询姓名,math,和English
1 | select name,math,english from student; |
去重查询
1 | select address from student; |
使用该语句查询时,会出现重复的项目:
可以使用关键字 distinct
去重查询:
1 | select distinct address from student; |
只有查询出的结果完全一致时才会去重,比如以下代码:
1 | select distinct name,address from student; |
因为姓名有一致的,即使地址重复了,且使用了地distinct关键字也不会将重复地址筛选掉。
计算列
一般可以使用四则运算计算一些列的值。(一般只会进行数值型的计算)
代码演示
1 | select name,math,english,math+english from student; -- 查询名字,数学成绩,英语成绩并计算总成绩 |
ifnull(exp1,exp2)函数
从上述操作中可以发现,当查询的值中存在NULL时,进行四则运算后得到的值也会是NULL。为了避免出现这种问题,我们可以使用ifnull
函数来进行处理。
1 | ifnull(exp1,exp2) -- exp1表示可能为null的值,exp2表示将NULL替换掉的值 |
因此上述计算总分的查询语句可以改为:
1 | select name,math,english,math+ifnull(english,0) from student; -- 为NULL时就将值用0替换 |
起别名
从上述查询我们发现列math+ifnull(english,0)
在结果中不好看,所以我们可以对其设置别名,当然任意列都可以设置别名。
1 | 列名 as 别名 -- 使用关键字as对列名设置别名 |
别名的好处:
- 便于理解
- 如果要查询的字段存在重复名称时,使用别名可以区分开来
代码演示
1 | select name,math,english,math+ifnull(english,0) as 总分 from student; |
1 | select name as 姓名,math as 数学,english as 英语,math+ifnull(english,0) as 总分 from student; |
起别名简化形式
1 | select 列名1 别名1,列名2 别名2,... from 表名; |
1 | select name,math 数学,english 英语,math+ifnull(english,0) 总分 from student; |
当别名中存在关键字时,可以将别名用引号(单双皆可)包括起来。
条件查询
where子句后加条件。
运算符
比较运算符 | 备注 |
---|---|
>、<、=、>=、<=、<> | <>在SQL中表示不等于,在mysql中也可以使用!=没有== |
BETWEEN…AND… | 在一个范围之内,包头又包尾 |
IN(集合) | 集合表示多个值,各个值之间用逗号隔开 |
LIKE ‘张%’ | 模糊查询 |
IS [NOT] NULL | 查询某一列为[NOT]NULL的值,注:不能写=NULL(!=NULL) |
逻辑运算符 | 备注 |
---|---|
&&或 AND | 与,SQL中建议使用AND,&&并不通用。 |
|| 或 OR | 或,SQL中建议使用OR,||并不通用。 |
! 或 NOT | 非,SQL中建议使用NOT,!并不通用。 |
注:null不能用
=、>、<
等符号来进行判断。判断一个字段是否为null,除了使用IS NULL之外,还可以使用安全等于:<=>
。此外安全等于也可以用于判断非NULL的字段是否相等。
代码演示
1.查询math大于80的人
1 | select * from student where math > 80; |
查询English小于90的人
1 | select * from student where english < 90; |
查询sex等于女的人
1 | select * from student where sex = '女'; |
2、查询年龄位于18-30(包含两头)之间的人
1 | -- 以下查询效果一致 |
3.查询英语成绩为空的人
1 | select * from student where english IS NULL; |
4.查询英语成绩不为空的人
1 | select * from student where english IS NOT NULL; |
5.查询年龄为18,22,50的人
1 | -- 以下查询结果一致 |
模糊查询
MySQL通配符:_:匹配单个任意字符;%:匹配任意多个字符。
查询姓马的有哪些人
1 | select * from student where name LIKE '马%'; |
查询姓名第二个字为化的人
1 | select * from student where name LIKE '_化%'; |
查询名字包含德字的人
1 | select * from student where name LIKE '%德%'; |
查询名字是三个字的人
1 | select * from student where name LIKE '___'; |
使用转义字符
如果想要查询结果中包含_、%
的字段可以使用转义字符
- 使用
\
来转义 - 使用
escape
关键字来定义任意符号为转义字符
1 | #查询员工中,名字第二个字为_的员工信息 |
1 | SELECT |
表的约束
外键约束
涉及多张表的操作。
数据有冗余的时候,进行表的拆分,然后利用外键对拆分的表进行关联。
添加外键
1.在创建表时添加外键约束
1 | create table 表名( |
其中,外键名称可以任意取,主键表名,即为关联的表名。
2.在表创建完成之后添加外键
1 | alter table 表名 add constraint 外键名 foreign key(外键列名) references 主表名(主键列名); |
代码演示
1 | -- 创建一个部门表,作为主表,因为副表需要引用他,所以需要先创建 |
1 | -- 创建员工表,利用外键和部门表产生关联 |
添加约束后,主键的列不能被删除,因为和从表产生了关联
删除外键
1 | alter table 表名 drop foreign key 外键名称; |
级联操作
添加级联操作时需要谨慎对待。在添加外键约束的语句中添加相应的语法,以便主表改变时,从表发生相应变化。级联操作有两种:级联更新和级联删除。级联更新:主表的主键发生变化时,从表的外键也会发生相应变化。级联删除:主表删除主键列的数据时,相应的从表的外键列会被全部删除。因此添加级联操作时要慎之又慎。
级联更新
在添加外键约束的语句中添加相应的语法。
1 | on update cascade |
1.创建表时添加级联更新
1 | create table 表名( |
2.创建完表后添加级联更新
1 | alter table 表名 add constraint 外键名称 foreign key(外键列名) refereces 主表名(主键列名) on update cascade; |
3.删除级联更新
1 | alter table 表名 drop foreign key 外键名称; |
级联删除
1 | on delete cascade |
1.创建表时添加
1 | create table 表名( |
2.创建完表后添加级联更新
1 | alter table 表名 add constraint 外键名称 foreign key(外键列名) refereces 主表名(主键列名) on delete cascade; |
3.删除级联更新
1 | alter table 表名 drop foreign key 外键名称; |
同时添加两种级联操作
1 | create table 表名( |