[TOC]
MySQL 基础语法
数据库概述
数据的存储方式
Java 中创建对象: Student s = new Student(1, “张三”) 存在内存中
学习了 Java IO 流:把数据保存到文件中
存储位置 | 优点 | 缺点 |
---|---|---|
内存 | 速度快 | 不能永久保存,数据是临时状态 |
文件 | 数据可以永久保存 | 操作数据不方便,查询某个数据 |
数据库 | 1)数据可以永久保存 2) 查询速度快 3) 对数据的管理方便 | 占用资源,需要购买 |
什么是数据库
- 存储数据的仓库
- 本质上是一个文件系统,还是以文件的方式存在服务器的电脑上的。
- 所有的关系型数据库都可以使用通用的 SQL 语句进行管理 DBMS DataBase Management System
常见数据库排行榜
MySQL:开源免费的数据库,小型的数据库,已经被 Oracle 收购了。MySQL6.x 版本也开始收费。后来 Sun 公司收购了 MySQL,而 Sun 公司又被 Oracle 收购
Oracle:收费的大型数据库,Oracle 公司的产品。
DB2 :IBM 公司的数据库产品,收费的。常应用在银行系统中。
SQL Server:MicroSoft 公司收费的中型的数据库。C#、.net 等语言常使用。
SQLite: 嵌入式的小型数据库,应用在手机端,如:Android。
为什么选择 MySQL
- 免费
- 功能强大
docker 操作MySQL
docker 查看可用版本:
[root@iZwz98qdx9tvkknmzwtbl9Z ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 11777 [OK]
mariadb MariaDB Server is a high performing open sou… 4486 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 880 [OK]
centos/mysql-57-centos7 MySQL 5.7 SQL database server 92
mysql/mysql-cluster Experimental MySQL Cluster Docker images. Cr… 89
centurylink/mysql Image containing mysql. Optimized to be link… 59 [OK]
databack/mysql-backup Back up mysql databases to... anywhere! 53
prom/mysqld-exporter 44 [OK]
deitch/mysql-backup REPLACED! Please use http://hub.docker.com/r… 41 [OK]
tutum/mysql Base docker image to run a MySQL database se… 35
linuxserver/mysql A Mysql container, brought to you by LinuxSe… 34
schickling/mysql-backup-s3 Backup MySQL to S3 (supports periodic backup… 31 [OK]
mysql/mysql-router MySQL Router provides transparent routing be… 23
centos/mysql-56-centos7 MySQL 5.6 SQL database server 21
arey/mysql-client Run a MySQL client from a docker container 19 [OK]
fradelg/mysql-cron-backup MySQL/MariaDB database backup using cron tas… 16 [OK]
openshift/mysql-55-centos7 DEPRECATED: A Centos7 based MySQL v5.5 image… 6
cytopia/mysql-5.5 MySQL 5.5 on CentOS 7 4 [OK]
ansibleplaybookbundle/mysql-apb An APB which deploys RHSCL MySQL 3 [OK]
devilbox/mysql Retagged MySQL, MariaDB and PerconaDB offici… 3
idoall/mysql MySQL is a widely used, open-source relation… 3 [OK]
centos/mysql-80-centos7 MySQL 8.0 SQL database server 2
jelastic/mysql An image of the MySQL database server mainta… 2
widdpim/mysql-client Dockerized MySQL Client (5.7) including Curl… 1 [OK]
monasca/mysql-init A minimal decoupled init container for mysql 0
[root@iZwz98qdx9tvkknmzwtbl9Z ~]#
拉取MySQL镜像
先查看有没有MySQL镜像
[root@iZwz98qdx9tvkknmzwtbl9Z ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@iZwz98qdx9tvkknmzwtbl9Z ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
默认拉取最新镜像
[root@iZwz98qdx9tvkknmzwtbl9Z ~]# docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
ffbb094f4f9e: Pull complete
df186527fc46: Pull complete
fa362a6aa7bd: Pull complete
5af7cb1a200e: Pull complete
949da226cc6d: Pull complete
bce007079ee9: Pull complete
eab9f076e5a3: Pull complete
8a57a7529e8d: Pull complete
b1ccc6ed6fc7: Pull complete
b4af75e64169: Pull complete
3aed6a9cd681: Pull complete
23390142f76f: Pull complete
Digest: sha256:ff9a288d1ecf4397967989b5d1ec269f7d9042a46fc8bc2c3ae35458c1a26727
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest
[root@iZwz98qdx9tvkknmzwtbl9Z ~]#
查看本地镜像
docker images
在上图中可以看到我们已经安装了最新版本(latest)的 mysql 镜像。
运行容器
安装完成后,我们可以使用以下命令来运行 mysql 容器:
docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=xxx -d mysql
参数说明:
- -p 3306:3306 :映射容器服务的 3306 端口到宿主机的 3306 端口,外部主机可以直接通过 宿主机ip:3306 访问到 MySQL 的服务。
- MYSQL_ROOT_PASSWORD=xxx:设置 MySQL 服务 root 用户的密码。
[root@iZwz98qdx9tvkknmzwtbl9Z ~]# docker images # 查看镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest bbf6571db497 26 hours ago 516MB
[root@iZwz98qdx9tvkknmzwtbl9Z ~]# docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql #启动
0c4092bd7e1b02ae14a423733e720aafdc7bdbba38b5cb3584ead1f583726f00
[root@iZwz98qdx9tvkknmzwtbl9Z ~]# docker exec -it mysql bash #进入容器
root@0c4092bd7e1b:/# mysql -u root -p #登录mysql
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.27 MySQL Community Server - GPL
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.01 sec)
mysql> CREATE USER 'nateshao'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; #登录mysql
Query OK, 0 rows affected (0.01 sec)
mysql> GRANT ALL PRIVILEGES ON *.* TO 'nateshao'@'%';
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
mysql> exit
Bye
root@cb30c0de2342:/# ll
bash: ll: command not found
root@cb30c0de2342:/# exit
exit
[root@iZwz98qdx9tvkknmzwtbl9Z ~]# ll
total 0
[root@iZwz98qdx9tvkknmzwtbl9Z ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cb30c0de2342 mysql "docker-entrypoint.s…" 11 hours ago Up 11 hours 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql
[root@iZwz98qdx9tvkknmzwtbl9Z ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest bbf6571db497 26 hours ago 516MB
[root@iZwz98qdx9tvkknmzwtbl9Z ~]# docker rmi bbf6571db497
Error response from daemon: conflict: unable to delete bbf6571db497 (cannot be forced) - image is being used by running container cb30c0de2342
[root@iZwz98qdx9tvkknmzwtbl9Z ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cb30c0de2342 mysql "docker-entrypoint.s…" 11 hours ago Up 11 hours 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql
[root@iZwz98qdx9tvkknmzwtbl9Z ~]# docker rm -f cb30c0de2342
cb30c0de2342
[root@iZwz98qdx9tvkknmzwtbl9Z ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@iZwz98qdx9tvkknmzwtbl9Z ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest bbf6571db497 26 hours ago 516MB
[root@iZwz98qdx9tvkknmzwtbl9Z ~]# docker rmi bbf6571db497
Untagged: mysql:latest
Untagged: mysql@sha256:ff9a288d1ecf4397967989b5d1ec269f7d9042a46fc8bc2c3ae35458c1a26727
Deleted: sha256:bbf6571db4977fe13c3f4e6289c1409fc6f98c2899eabad39bfe07cad8f64f67
Deleted: sha256:a72da99dce60d6f8d4c4cffa4173153c990537fcdfaa27c35324c3348d55dd5c
Deleted: sha256:8b535d432ef2fbd45d93958347b2587c5cbe334f07d6909ad9d2d480ebbafb65
Deleted: sha256:14d13a3b33fc76839f156cd24b4636dab121e6d3d026cefa2985a4b89e9d4df8
Deleted: sha256:77c21a5a897a1ba752f3d742d6c94ee7c6b0e373fd0aeecc4bf88b9a3982007e
Deleted: sha256:189162becec8bb4588c54fb4ea7e62d20121812e68aeb0291fb4bb5df9ec0985
Deleted: sha256:34980dadfd6a5bb9d7f9e8d4e408000e0a8f4840cc7d3092dc94357ebe7a89b6
Deleted: sha256:15b2beb64a91785c8f3709ecd2410d13577b3174faad164524434ce6a7633506
Deleted: sha256:e38dd14d47b61171927ea4b928f7296123b65a81ad1cfde8f5d00cadf1e81bbb
Deleted: sha256:865abdfd8444741f581ce582e4ac5746c4a00c282febf65aa808a235ec7abf78
Deleted: sha256:b1e35233e1ac953bd06fc8fa83afb3a88c39c1aeae0c89a46cb1b652d6821b38
Deleted: sha256:3bcfdf6641227ff63e3ddf9e38e45cf317b178a50a664e45c6ae596107d5bc46
Deleted: sha256:f11bbd657c82c45cc25b0533ce72f193880b630352cc763ed0c045c808ff9ae1
[root@iZwz98qdx9tvkknmzwtbl9Z ~]#
DDL 操作数据库
创建数据库
CREATE DATABASE 数据库名;
判断数据库是否已经存在,不存在则创建数据库
CREATE DATABASE IF NOT EXISTS 数据库名;
创建数据库并指定字符集
CREATE DATABASE 数据库名 CHARACTER SET 字符集;
具体操作:
-- 直接创建数据库 db1
create database db1;
-- 判断是否存在,如果不存在则创建数据库 db2
create database if not exists db2;
-- 创建数据库并指定字符集为 gbk
create database db3 default character set gbk;
--------------------------------------------------------------------
mysql> -- db1
mysql> create database db1;
Query OK, 1 row affected (0.01 sec)
mysql> -- db2
mysql> create database if not exists db2;
Query OK, 1 row affected (0.00 sec)
mysql> -- gbk
mysql> create database db3 default character set gbk;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| db1 |
| db2 |
| db3 |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
7 rows in set (0.00 sec)
mysql>
查看数据库
按 tab 键可以自动补全关键字
-- 查看所有的数据库
show databases;
-- 查看某个数据库的定义信息
show create database db3;
show create database db1;
修改数据库
修改数据库默认的字符集
ALTER DATABASE 数据库名 DEFAULT CHARACTER SET 字符集;
具体操作:
将 db3 数据库的字符集改成 utf8
alter database db3 character set utf8;
删除数据库的语法:DROP DATABASE 数据库名;
drop database db2;
使用数据库
-- 查看正在使用的数据库
select database();
-- 改变要使用的数据库
use db4;
DDL 操作表结构
前提先使用某个数据库
MySQL 数据类型
分类 | 类型名称 | 类型说明 |
---|---|---|
tinyInt | 微整型:很小的整数(占 8 位二进制) | |
整数 | mediumint | 中整型:中等长度的整数(占 24 位二进制) |
int(integer) | 整型:整数类型(占 32 位二进制) | |
小数 | float | 单精度浮点数,占 4 个字节 |
double | 双精度浮点数,占 8 个字节 | |
time | 表示时间类型 | |
日期 | date | 表示日期类型 |
datetime | 同时可以表示日期和时间类型 | |
字符串 | char(m) | 固定长度的字符串,无论使用几个字符都占满全部,M 为 0~255 之间的整数 |
varchar(m) | 可变长度的字符串,使用几个字符就占用几个,M 为 0~65535 之间的整数 | |
tinyblob Big Large Object | 允许长度 0~255 字节 | |
blob | 允许长度 0~65535 字节 | |
大二进制 | mediumblob | 允许长度 0~167772150 字节 大二进制 |
longblob | 允许长度 0~4294967295 字节 | |
大文本 | tinytext | 允许长度 0~255 字节 |
text | 允许长度 0~65535 字节 | |
mediumtext | 允许长度 0~167772150 字节 | |
longtext | 允许长度 0~4294967295 字节 |
具体操作:创建 student 表包含 id,name,birthday 字段
create table student (
id int, -- 整数
name varchar(20), -- 字符串
birthday date -- 生日,最后没有逗号
);
查看 day21 数据库中的所有表
use day21;
show tables;
查看 student 表的结构
desc student;
查看 student 的创建表 SQL 语句 ---show create table student;
mysql> show create table student;
+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| student | CREATE TABLE `student` (
`id` int DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
`birthday` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql>
条件查询的语法
创建一个学生表,包含如下列:
CREATE TABLE student3 (
id int, -- 编号
name varchar(20), -- 姓名
age int, -- 年龄
sex varchar(5), -- 性别
address varchar(100), -- 地址
math int, -- 数学
english int -- 英语
);
INSERT INTO student3(id,NAME,age,sex,address,math,english) VALUES (1,'马云',55,'男','
杭州',66,78),(2,'马化腾',45,'女','深圳',98,87),(3,'马景涛',55,'男','香港',56,77),(4,'柳岩
',20,'女','湖南',76,65),(5,'柳青',20,'男','湖南',86,NULL),(6,'刘德华',57,'男','香港
',99,99),(7,'马德',22,'女','香港',99,99),(8,'德玛西亚',18,'男','南京',56,65);
运算符
比较运算符 | 说明 |
---|---|
>、<、<=、>=、=、<> | <>在 SQL 中表示不等于,在 mysql 中也可以使用!= 没有== |
BETWEEN…AND | 在一个范围之内,如:between 100 and 200 . 相当于条件在 100 到 200 之间,包头又包尾 |
IN | (集合) 集合表示多个值,使用逗号分隔 |
LIKE ‘张%’ | 模糊查询 |
IS NULL | 查询某一列为 NULL 的值,注:不能写=NULL |
具体操作:
-- 查询 math 分数大于 80 分的学生
select * from student3 where math>80;
-- 查询 english 分数小于或等于 80 分的学生
select * from student3 where english <=80;
-- 查询 age 等于 20 岁的学生
select * from student3 where age = 20;
-- 查询 age 不等于 20 岁的学生,注:不等于有两种写法
select * from student3 where age <> 20;
select * from student3 where age != 20;
- 逻辑运算符
逻辑运算符 | 说明 |
---|---|
and 或 && | 与,SQL 中建议使用前者,后者并不通用。 |
or 或 || | 或 |
not 或 ! | 非 |
具体操作:
-- 查询 age 大于 35 且性别为男的学生(两个条件同时满足)
select * from student3 where age>35 and sex='男';
-- 查询 age 大于 35 或性别为男的学生(两个条件其中一个满足)
select * from student3 where age>35 or sex='男';
-- 查询 id 是 1 或 3 或 5 的学生
select * from student3 where id=1 or id=3 or id=5;
- in 关键字
SELECT 字段名 FROM 表名 WHERE 字段 in (数据 1, 数据 2...);
in 里面的每个数据都会作为一次条件,只要满足条件的就会显示
具体操作:
-- 查询 id 是 1 或 3 或 5 的学生
select * from student3 where id in(1,3,5);
-- 查询 id 不是 1 或 3 或 5 的学生
select * from student3 where id not in(1,3,5);
- 范围查询
BETWEEN 值 1 AND 值 2
表示从值 1 到值 2 范围,包头又包尾
比如:age BETWEEN 80 AND 100 相当于: age>=80 && age<=100
like 关键字
LIKE 表示模糊查询
SELECT * FROM 表名 WHERE 字段名 LIKE '通配符字符串';
通配符 说明
% 匹配任意多个字符串
_ 匹配一个字符
- MySQL 通配符
通配符 | 说明 |
---|---|
% | 匹配任意多个字符串 |
_ | 匹配一个字符 |
-- 查询姓马的学生
select * from student3 where name like '马%';
select * from student3 where name like '马';
-- 查询姓名中包含'德'字的学生
select * from student3 where name like '%德%';
-- 查询姓马,且姓名有两个字的学生
select * from student3 where name like '马_';