存储方式 | 优点 | 缺点 |
---|---|---|
内存 | 速度快 | 不能够永久保存,数据是临时状态的 |
文件 | 数据是可以永久保存的 | 使用IO流操作文件, 不方便 |
数据库 | 1.数据可以永久保存 2.方便存储和管理数据 3.使用统一的方式操作数据库(SQL) |
占用资源,有些数据库需要付费(比如Oracle数据库) |
数据库名 | 介绍 |
---|---|
MySql数据库 | 开源免费的数据库 因为免费开源、运作简单的特点,常作为中小型的项目的数据库首选。 MySQL1996年开始运作,目前已经被Oracle公司收购了. MySQL6.x开始收费 当前我们学习的是MYSQL5.7版本,所以还是免费的 |
Oracle数据库 | 收费的大型数据库,Oracle公司的核心产品。安全性高 |
DB2 | IBM公司的数据库产品,收费的超大型数据库。常在银行系统中使用 |
SQL Server | MicroSoft 微软公司收费的中型的数据库。C#、.net等语言常使用。 但该数据库只能运行在windows机器上,扩展性、稳定性、安全性、性能都表现平平。 |
此时我们的 MySQL 就已经安装成功,并且环境变量已经配置成功,接下来就可以进行学习MySQL了
MySQL是一个需要账户名密码登录的数据库,登陆后使用,它提供了一个默认的root账号,使用安装时设置的密码即可登录。
命令 | 说明 |
---|---|
mysql -u 用户名 -p 密码 | 使用指定用户名和密码登录当前计算机中的MySQL数据库 |
mysql -h 主机IP -u 用户名 -p 密码 -P 端口 | -h 指定IP 方式,进行 登录 |
# 本地登录
mysql -uroot -p123456
# 远程登录
mysql -h127.0.0.1 -uroot -p123456
# 退出数据库
exit 或者 quit
SQLyog是业界著名的Webyog公司出品的一款简洁高效、功能强大的图形化MySQL数据库管理工具。使用 SQLyog 可以快速直观地让您从世界的任何角落通过网络来维护远端的 MySQL 数据库
默认安装路径:C:\Program Files\Webyog SQLyog Ultimate
MySql的默认安装目录在 C:\Program Files\MySQL\MySQL Server 5.7
目录 | 目录内容 |
---|---|
bin | 放置一些可执行文件 |
docs | 文档 |
include | 包含(头)文件 |
lib | 依赖库 |
share | 用于存放字符集、语言等信息。 |
目录文件 | 文件内容 |
---|---|
Data | 数据库和数据表的信息 |
Uploads | |
installer_config.xml | |
my.ini | MYSQL的配置文件 |
数据库其实是文件系统,可以看做目录;数据表就可以看做文件。
数据库中以表为组织单位存储数据
表类似我们Java中的类,每个字段都有对应的数据类型
类 -----> 表
类中属性----> 表中字段
对象 ---> 数据记录
注释语法 | 说明 |
---|---|
– 空格 | 单行注释 |
/* */ | 多行注释 |
# | MySql特有的单行注释 |
分类 | 说明 |
---|---|
数据定义语言 | 简称DDL(Data Definition Language),用来定义数据库对象:数据库,表,列等。 |
数据操作语言 | 简称DML(Data Manipulation Language),用来对数据库中表的记录进行更新。 |
数据查询语言 | 简称DQL(Data Query Language),用来查询数据库中表的记录。 |
数据控制语言 | 简称DCL(Date Control Language),用来定义数据库的访问权限和安全级别,及创建用户。(了解) |
命令 | 说明 |
---|---|
create database 数据库名; | 创建指定名称的数据库。 |
create database 数据库名 character set字符集; | 创建指定名称的数据库,并且指定字符集 (一般都指定utf-8) |
/*创建数据库
默认编码:latin1 编码
常用编码:utf-8 编码
指定数据库名称,指定数据库的字符集 一般都指定为 utf8,与Java中的编码保持一致*/
CREATE DATABASE java1;
CREATE DATABASE java2 CHARACTER SET utf8;
SHOW DATABASES;
数据库 | 功能 |
---|---|
information_schema | 信息数据库,保存的是其他数据库的信息 比如说数据库表的名称,表的字段的名称等 |
mysql | MYSQL核心数据库,保存的是用户和权限的信息 |
performance_schema | 保存性能相关的数据,监控MYSQL的性能 |
sys | 记录了DBA所需要的一些信息,更方便的让DBA快速地了解数据库的运行情况 |
命令 | 说明 |
---|---|
use 数据库 | 切换数据库 |
select database(); | 查看当前正在使用的数据库 |
show databases; | 查看Mysql中 都有哪些数据库 |
show create database 数据库名; | 查看一个数据库的定义信息 |
/*查看数据库
切换数据库*/
USE db2;
/*查询当前正在使用的数据库*/
mysql> select database();
+------------+
| database() |
+------------+
| db2 |
+------------+
/*查询MYSQL中有哪些数据库*/
SHOW DATABASES;
-- 查看一个数据库的定义信息
mysql> show create database db2;
+----------+--------------------------------------------------------------+
| Database | Create Database |
+----------+--------------------------------------------------------------+
| db2 | CREATE DATABASE `db2` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+--------------------------------------------------------------+
命令 | 说明 |
---|---|
alter database 数据库名 character set 字符集; | 数据库的字符集修改操作 |
/*修改数据库的字符集*/
ALTER DATABASE java1 CHARACTER SET utf8;
/*查询当前数据库的信息*/
SHOW CREATE DATABASE java1;
命令 | 说明 |
---|---|
drop database 数据库名 | 从MySql中永久的删除某个数据库 |
-- 删除数据库(永久删除)
DROP DATABASE java2;
SHOW DATABASES;
类型 | 描述 |
---|---|
int | 整型 |
double | 浮点型 |
char | 字符串型(不可变长) |
varchar | 字符串型(可变长) |
date | 日期类型,yyyy-MM-dd ,只有年月日,没有时分秒 |
datetime | 日期类型,yyyy-MM-dd HH:mm:ss,有年月日时分秒 |
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SnsZsuZ4-1649570420265)(01任务一MySQL基础和SQL入门.assets/image-20211127204352218.png)]
注意:MySQL中的 char类型与 varchar类型,都对应了 Java中的字符串类型,区别在于:
比如:保存字符串 “abc”
x char(10) 占用10个字节
y varchar(10) 占用3个字节
适用场景:
CREATE TABLE 表名(
字段名称1 字段类型(长度),
字段名称2 字段类型 注意 最后一列不要加逗号
);
例:
-- 创建商品分类表
-- 选择使用的数据库
USE java1;
CREATE TABLE category(
cid INT,
cname VARCHAR(20)
);
-- 创建测试表
CREATE TABLE test1(
tid INT,
tdate DATE
);
-- 快速创建一个表结构相同的表(复制表结构)
-- 语法结构: create table new_table like old_table
-- 创建一个与test1表结构相同的test2表
CREATE TABLE test2 LIKE test1;
-- 查看表结构
DESC test2;
命令 | 说明 |
---|---|
show tables; | 查看当前数据库中的所有表名 |
desc 表名; | 查看数据表的结构 |
-- 查看表
-- 查看当前数据库中所有的表
SHOW TABLES;
-- 查看创建表的 sql
SHOW CREATE TABLE category;
-- 查看表结构
DESC category;
命令 | 说明 |
---|---|
drop table 表名; | 删除表(从数据库中永久删除某一张表) 如果数据表已经被删除了,再次删除会报错 |
drop table if exists 表名; | 判断表是否存在, 存在的话就删除,不存在就不执行删除 这种删除更加稳妥,即使不存在也不会报错 |
/*
表的删除:
语法格式:
drop table table_name; 从数据库中永久地删除一张表
drop table if exists table_name; 先判断表是否存在,如果存在就删除,否则就不执行删除
*/
-- 删除表
DROP TABLE test1;
-- 如果一张表已经被删除了,再次执行删除,就会报错,可以使用第二种删除方法,会有警告,不会报错
DROP TABLE IF EXISTS test1;
alter对表结构的几种操作(AMCD) | 功能 |
---|---|
add | 添加字段 alter table table_name add 字段名称 字段类型(长度) |
modify | 更改字段相关信息 alter table 表名 modify 字段名称 字段类型 |
change | 更改字段的名称 alter table table_name change 旧列名 新列名 类型(长度) |
drop | 删除字段 alter table table_name 表名 drop 列名 |
/*
修改表
修改表的名称
修改表的字符集
修改表的某一列(数据类型 名称 长度)
向表中添加一列
删除表中的某一列
*/
-- 修改表的名称 语法格式:rename table old_table to new_table
RENAME TABLE category TO category1;
-- 修改表的字符集为gbk 语法格式:alter table table_name character set 字符集
ALTER TABLE category1 CHARACTER SET gbk;
-- 向表中添加一个字段 关键字 add
-- 语法格式: alter table table_name add 字段名称 字段类型(长度)
-- 添加分类描述字段
ALTER TABLE category1 ADD cdesc VARCHAR(20);
DESC category1;
-- 修改表中列的数据类型 或者 长度,关键字:modify
-- 语法格式:alter table 表名 modify 字段名称 字段类型
-- 修改cdesc字段的长度为 50
ALTER TABLE category1 MODIFY cdesc VARCHAR(50); -- 修改字段长度
ALTER TABLE category1 MODIFY cdesc CHAR(20); -- 修改字段的数据类型
DESC category1;
-- 修改列的名称 关键字:change
-- 语法格式:alter table table_name change 旧列名 新列名 类型(长度)
-- 修改cdesc字段 名称改为 description varchar(30)
ALTER TABLE category1 CHANGE cdesc description VARCHAR(30);
-- 删除列 关键字:drop
-- 语法格式:alter table table_name 表名 drop 列名
ALTER TABLE category1 DROP description;
DESC category1;
SQL中的DML 用于对表中的数据进行增删改操作
DML(Data manipulation language)数据操作语言 | 作用 |
---|---|
insert into value() / values() | 可以插入一条或多条数据 |
update set | 更改某一条或多条数据 |
delete from | 根据条件删除指定数据 |
/*
DML 对表中的数据进行 增删改查
增加
语法格式:insert into table_name (字段1,字段2,...) values(字段值1,字段值2,...);
*/
-- 创建学生表
CREATE TABLE student(
sid INT,
sname VARCHAR(20),
age INT,
sex CHAR(1),
address VARCHAR(40));
-- 向学生表中插入数据
-- 方式1:插入全部字段 将所有的字段名都写出来
INSERT INTO student (sid,sname,age,sex,address)
VALUES(1,"孙悟空",18,"男","花果山");
-- 方式2:插入全部字段 不写字段名
INSERT INTO student VALUES(2,"孙悟饭",5,"男","地球");
-- 方式3:插入指定字段
INSERT INTO student(sid,sname) VALUES(3,"蜘蛛精");
-- 注意事项:
-- 1.值与字段必须对应 前面指定几个字段,后面就对应添加对应的字段值,长度和数据类型必须都要对应上
INSERT INTO student(sid,sname,age,sex,address) VALUES(4,"孙悟空",18,"男","花果山");
-- 2.在插入varchar,char,date类型的时候,必须要使用单引号或者双引号包裹(尽量多使用单引号)
-- 3.如果插入空值,可以忽略不写 或者写 null
INSERT INTO student(sid,sname) VALUES(5,'唐僧');
INSERT INTO student(sid,sname,age,sex,address) VALUES(5,'八戒',NULL,NULL,NULL);
/*
修改表
语法格式:update 表名 set 列名 = 值;
update 表名 set 列名 = 值 {where 条件表达式:字段名 = 值};
*/
-- 修改表中所有人性别为女
UPDATE student SET sex = '女'; -- 慎用,一定要带条件
-- 带条件的修改,将 sid 为 1 的数据,性别改为男
UPDATE student SET sex = '男' WHERE sid = 1;
-- 一次性修改多个列
-- 修改 sid 为 5 的这条数据,年龄改为 20,地址改为 大唐
UPDATE student SET age = 20, address = '大唐' WHERE sid = 5;
/*
删除操作
语法格式:delete from 表名;
delete from 表名 {where 条件};
*/
-- 删除 sid 为 5 的数据
DELETE FROM student WHERE sid = 5;
-- 删除所有数据
-- 方式1:不推荐,对表中的数据进行逐条删除,效率低
DELETE FROM student;
-- 方式2:truncate table 表:推荐,删除整张表,然后在创建一个一模一样的新表
TRUNCATE student;
DQL的一些特殊语法 | 功能 |
---|---|
as | 为查询的字段或者表起别名 |
distinct | 放在查询的字段之前,去重 |
+,-,*,/,% | 可以为查询整型字段 显示想要的数据内容 注意:查询操作 不会对数据表中的数据进行修改,只是一种展示的方式 |
#创建员工表
CREATE TABLE emp(
eid INT,
ename VARCHAR(20),
sex CHAR(1),
salary DOUBLE,
hire_date DATE,
dept_name VARCHAR(20)
);
#添加数据
INSERT INTO emp VALUES(1,'孙悟空','男',7200,'2013-02-04','教学部');
INSERT INTO emp VALUES(2,'猪八戒','男',3600,'2010-12-02','教学部');
INSERT INTO emp VALUES(3,'唐僧','男',9000,'2008-08-08','教学部');
INSERT INTO emp VALUES(4,'白骨精','女',5000,'2015-10-07','市场部');
INSERT INTO emp VALUES(5,'蜘蛛精','女',5000,'2011-03-14','市场部');
INSERT INTO emp VALUES(6,'玉兔精','女',200,'2000-03-14','市场部');
INSERT INTO emp VALUES(7,'林黛玉','女',10000,'2019-10-07','财务部');
INSERT INTO emp VALUES(8,'黄蓉','女',3500,'2011-09-14','财务部');
INSERT INTO emp VALUES(9,'吴承恩','男',20000,'2000-03-14',NULL);
INSERT INTO emp VALUES(10,'孙悟饭','男', 10,'2020-03-14',财务部);
/*
DQL 查询操作
简单查询
select 列名 from 表名;
*/
-- 查询emp表中的所有数据
SELECT * FROM emp; -- * 表示 所有的列
-- 查询所有的数据 只显示 eid 和 ename
SELECT eid,ename FROM emp;
-- 查询所有数据,然后给列名 改为中文
-- 别名查询 使用关键字 as
SELECT
eid AS 编号,
ename AS 姓名,
sex AS 性别,
salary AS 薪资,
hire_date AS 入职日期,
dept_name 部门名称 -- as 可以省略
FROM emp;
-- 查询一共有几个部门,需要进行去重 关键字:distinct
SELECT DISTINCT dept_name FROM emp;
-- 将员工薪资 + 1000 进行展示
SELECT salary, salary+1000 AS new_salary FROM emp;
-- 注意:查询操作 不会对数据表中的数据进行修改,只是一种展示的方式
运算符:
运算符 | 说明 |
---|---|
> < <= >= = <> != | 大于、小于、大于(小于)等于、不等于 |
BETWEEN …AND… | 显示在某一区间的值例如: 2000-10000之间: Between 2000 and 10000 当使用 >= 与 <= 搭配使用时,可以与 between and 替换使用 |
IN(集合) | 集合表示多个值,使用逗号分隔,例如: name in (悟空,八戒) in中的每个数据都会作为一次条件,只要满足条件就会显示 |
LIKE ‘%张%’ | 模糊查询 |
IS NULL / is not null | 查询某一列为NULL的值, 注: 不能写 = NULL |
运算符 | 说明 |
---|---|
And && | 多个条件同时成立 |
Or || | 多个条件任一成立 |
Not | 不成立,取反。 |
需求1:
# 查询员工姓名为黄蓉的员工信息
# 查询薪水价格为5000的员工信息
# 查询薪水价格不是5000的所有员工信息
# 查询薪水价格大于6000元的所有员工信息
# 查询薪水价格在5000到10000之间所有员工信息
# 查询薪水价格是3600或7200或者20000的所有员工信息
代码实现:
/*
条件查询
语法格式:select 列名 from 表名 where 条件表达式;
比较运算符
*/
# 查询员工姓名为黄蓉的员工信息
SELECT * FROM emp WHERE ename = '黄蓉';
# 查询薪水价格为5000的员工信息
SELECT * FROM emp WHERE salary = 5000;
# 查询薪水价格不是5000的所有员工信息
-- 方法1:
SELECT * FROM emp WHERE salary != 5000;
-- 方法2:
SELECT * FROM emp WHERE salary <> 5000;
# 查询薪水价格大于6000元的所有员工信息
SELECT * FROM emp WHERE salary > 6000;
# 查询薪水价格在5000到10000之间所有员工信息
-- 方法1:
SELECT * FROM emp WHERE salary BETWEEN 5000 AND 10000;
-- 方法2:
SELECT * FROM emp WHERE salary >= 5000 && salary <= 10000;
# 查询薪水价格是3600或7200或者20000的所有员工信息
-- 方法1:
SELECT * FROM emp WHERE salary IN (3600,7200,20000);
-- 方法2:
SELECT * FROM emp WHERE salary = 3600 OR salary = 7200 OR salary = 20000;
like模糊查询(通配符的使用):
通配符 | 说明 |
---|---|
% | 表示匹配任意多个字符串, |
_(下划线) | 表示匹配 一个字符 |
需求2:
# 查询含有'精'字的所有员工信息
# 查询以'孙'开头的所有员工信息
# 查询第二个字为'兔'的所有员工信息
# 查询没有部门的员工信息
# 查询有部门的员工信息
代码实现:
-- 条件查询是先取出表中的每条数据,满足条件就返回,不满足的就过滤
# 查询含有'精'字的所有员工信息
SELECT * FROM emp WHERE ename LIKE '%精%';
# 查询以'孙'开头的所有员工信息
SELECT * FROM emp WHERE ename LIKE '孙%';
# 查询第二个字为'兔'的所有员工信息
SELECT * FROM emp WHERE ename LIKE '_兔%';
# 查询没有部门的员工信息
-- 在MYSQL中,对于null的判断,不能直接使用 = 来进行判断,而是使用 is null
SELECT * FROM emp WHERE dept_name IS NULL;
# 查询有部门的员工信息
SELECT * FROM emp WHERE dept_name IS NOT NULL;
MySql默认使用的都是 root 用户,超级管理员,拥有全部的权限。除了root用户以外,我们还可以通过DCL语言来定义一些权限较小的用户, 分配不同的权限来管理和维护数据库。
命令 | 功能 |
---|---|
create user ‘用户名’@‘登录地址’ identified by ‘密码’; | 创建用户 |
grant 权限 on 数据库名.表名 to ‘用户名’@‘登录地址’; | 授予用户权限 |
show grants for ‘用户名’@‘登录地址’; | 查询用户的权限 |
drop user ‘用户名’@‘登录地址’; | 删除用户 |
语法格式
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
参数 | 说明 |
---|---|
用户名 | 创建的新用户,登录名称 |
主机名 | 指定该用户在哪个主机上可以登陆,本地用户可用 localhost 如果想让该用户可以 从任意远程主机登陆,可以使用通配符 % |
密码 | 登录密码 |
创建 admin1 用户,只能在 localhost 这个服务器登录 mysql 服务器,密码为 123456
CREATE USER 'admin1'@'localhost' IDENTIFIED BY '123456';
创建的用户在名字为 mysql的 数据库中的 user表中
创建 admin2 用户可以在任何电脑上登录 mysql 服务器,密码为 123456
CREATE USER 'admin2'@'%' IDENTIFIED BY '123456';
% 表示 用户可以在任意电脑登录 mysql服务器.
语法格式
GRANT 权限 1, 权限 2... ON 数据库名.表名 TO '用户名'@'主机名';
参数 | 说明 |
---|---|
权限 | 授予用户的权限,如 CREATE、ALTER、SELECT、INSERT、UPDATE 等。 如果要授 予所有的权限则使用 ALL |
ON | 用来指定权限针对哪些库和表。 |
TO | 表示将权限赋予某个用户。 |
给 admin1 用户分配对 db4 数据库中 products 表的 操作权限:查询
GRANT SELECT ON db4.products TO 'admin1'@'localhost';
给 admin2 用户分配所有权限,对所有数据库的所有表
GRANT ALL ON *.* TO 'admin2'@'%';
使用admin1用户登录数据库 测试权限
-- 首先创立新链接,使用admin1用户和密码进行登录,然后发现只能看到db4数据库,只有一张表products
-- 只拥有查询权限
SELECT * FROM products;
-- 用户 admin1 只有查询权限,如果进行插入数据的操作时,会发生报错
INSERT INTO products VALUES('poo1','小鸟伏特加',3000,1,NULL);
使用admin2用户登录数据库 测试权限
-- 然后使用新连接,使用 admin2 用户和密码进行登录数据库后,可以看到所有的数据库和数据表
语法格式
SHOW GRANTS FOR '用户名'@'主机名';
查看root用户权限
-- 查看root用户权限
SHOW GRANTS FOR 'root'@'localhost';
-- 查看 admin1 用户的权限
SHOW GRANTS FOR 'admin1'@'localhost';
语法格式
DROP USER '用户名'@'主机名';
删除 admin1 用户
-- 删除 admin1 用户
DROP USER 'admin1'@'localhost';
选择名为 mysql的数据库, 直接查询 user表即可
-- 查询用户
SELECT * FROM mysql.user;
mysql> set password for yun=password('111111');
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> update mysql.user set authentication_string=password('222222') where user = 'yun' and host = '%';
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 1
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)