前言
希望你向太阳一样,有起有落,不失光彩~
一、数据库概述
1. 什么是数据库
数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作。
2.数据库管理系统
数据库管理系统(DataBase Managerment System, DBMS): 指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管理系统访问数据库中表内的数据。
3.数据库的特点
1. 持久化存储数据的。其实数据库就是一个文件系统
2. 方便存储和管理数据
存储数据有一定的格式
行和列的格式,当前表格看待就可以了
3. 使用了统一的方式操作数据库
使用图形界面的形式查看数据
使用sql语言进行查看或管理数据
4.常见的数据库
关系型数据库 | 描述 |
---|---|
MySQL | 开源免费的数据库,小型的数据库,已经被 Oracle 收购了。MySQL6.x 版本也开始收费。 |
Oracle | 收费的大型数据库,Oracle 公司的产品 |
DB2 | IBM 公司的数据库产品,收费的。常应用在银行系统中。 |
SQL Server | MicroSoft 公司收费的中型的数据库。C#、.net 等语言常使用。 |
SQLite | 嵌入式的小型数据库,应用在手机端,如:Android。 |
OceanBase | 阿里的大型数据库,性能已经超过Oracle全球第一 |
非关系型数据库(NoSQL) | 描述 |
MongoDB | MongoDB最流行的文档型数据库 |
Redis | 基于内存的键值型数据库通过 Key-Value 键值的方式来存储数据 |
5. MySQL服务启动和关闭
MySQL服务启动:
cmd--> services.msc 打开服务的窗口--> MySQL服务启动
使用管理员打开cmd net start mysql: 启动MySQL的服务
MySQL服务关闭:
cmd--> services.msc 打开服务的窗口--> MySQL服务关闭
使用管理员打开cmd net stop mysql: 关闭MySQL的服务
6.MySQL登录和退出
MySQL登录:
* 本地登录
mysql -u用户名 -p密码
* 指定ip登录
mysql -h主机地址 -u用户名 -p密码
MySQL退出:
1. exit
2. quit
二、 SQL概述
1. 什么是SQL
结构化查询语言(Structured Query Language)简称SQL,SQL语句就是对数据库进行操作的一种语言。
SQL是一套标准,所有的数据库厂商都实现了此标准;但是各自厂商在此标准上增加了特有的语句,这部分内容我们称为
方言
。
2. SQL通用语法
3. 1. SQL 语句可以单行或多行书写,以分号结尾。
select * from stu;
select
*
FROM
stu;
2. 可使用空格和缩进来增强语句的可读性。
3. MySQL 数据库的 SQL 语句不区分大小写(仅此于win系统),关键字建议使用大写。
1). 库名 表名 字段 别名 建议写小写
2). 关键字建议大写: SHOW DATABASES CREATE
4. 3 种注释
* 单行注释: -- 注释内容(这种方式是通用的) 或 # 注释内容(mysql 特有)
* 多行注释: /* 注释 */
3. SQL语句的分类
分类 | 说明 |
---|---|
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 等 |
TCL(Transaction Control Language) 事务控制语言 | 用于控制数据库的事务操作,关键字; commit,savepoint,rollback等 |
三、DDL语句
1. DDL操作数据库
创建数据库==create database 数据库名称;==创建数据库,并指定字符集==create database 数据库名称 character set 字符集名;==查询所有数据库的名称==show databases;==查询某个数据库的字符集:查询某个数据库的创建语句==show create database 数据库名称;==修改数据库的字符集==alter database 数据库名称 character set 字符集名称;==删除数据库==谨慎使用!!!!drop database 数据库名称;==查询当前正在使用的数据库名称==select database();==使用数据库==use 数据库名称;
2. DDL操作表
1. 创建表
语法:
create table 表名(列名(字段名) 数据类型,列名(字段名) 数据类型,列名(字段名) 数据类型...
);
示例:
create table student(id int,name varchar(32),birthday date,money double(5,2)
);
2. 数据类型
数据类型 | 说明 |
---|---|
int | 整数类型,例如 : age |
double | 小数类型,例如 : score double(5,2) 111.11 |
date | 日期,只包含年月日,yyyy-MM-dd |
datetime | 日期,包含年月日时分秒 yyyy-MM-dd HH:mm:ss |
timestamp | 时间戳类型,包含年月日时分秒 yyyy-MM-dd HH:mm:ss 如果将来不给这个字段赋值,或赋值为null,则默认使用当前的系统时间,来自动赋值 |
varchar | 可变字符 name varchar(20) |
char | 不可变字符 name char(20) |
3. 查询表
-
==查询某个数据库中所有的表名称==
show tables;
-
==查询表结构==
desc 表名;
4. 修改表
==添加一列==语法:alter table 表名 add 列名 数据类型;
实例:alter table teacher add jieshao varchar(50);==修改列类型==语法:alter table 表名 modify 列名 新类型;
实例:alter table teacher modify jieshao varchar(99);==修改列名和类型==语法:alter table 表名 change 旧列名 新列名 新类型;
实例:alter table teacher change jieshao intro varchar(999);==删除指定列==语法:alter table 表名 drop 列名;
实例:alter table teacher drop intro;==修改表字符集==语法:alter table 表名 charset 字符集;
实例:alter table teacher charset gbk;==修改表名==语法:rename table 旧表名 to 新表名;
实例:rename table teacher to tch;
5. 删除表
直接删除表
语法:
drop table 表名;
实例:
drop table tch;
四、DML语句
1.添加数据
语法
insert into 表名(列名1,列名2,...列名n) values(值1,值2,...值n);
举例
INSERT INTO student(`id`,`name`,`birthday`) VALUES (1,'李四1','2018-11-11');
注意事项
==列名和值要一一对应==
表名(列名1,列名2,...列名n)写了几个字段,我们就给几个值,值的类型要跟字段类型保持一致
==如果表名后,不定义列名,则默认给所有列添加值【了解,不推荐使用】==
insert into 表名 values(值1,值2,...值n);
==除了数字类型,其他类型需要使用引号(单双都可以)引起来==
【建议大家都使用单引号 '' 不要使用双引号】sql语句拼接 sql语句在java代码中是一个String
==批量插入数据==
INSERT INTO stu1(`id`,`name`,`birthday`) VALUES
(1,'李四1','2020-11-11'),
(2,'李四2','2020-11-11'),
(3,'李四3','2020-11-11'),
(4,'李四4','2020-11-11');
2. 删除数据
语法
delete from 表名 [where 条件]
举例
delete from student where id = 1;
注意事项
==如果不加条件,则删除表中所有记录。==
delete from student; -- 删除所有的记录
==如果要删除所有记录==
delete from 表名; -- 不推荐使用。有多少条记录就会执行多少次删除操作
TRUNCATE TABLE 表名; -- 推荐使用,效率更高 先删除表,然后再创建一张一样的表
3. 修改数据
语法
update 表名 set 列名1 = 值1, 列名2 = 值2,... [where 条件];
举例
update student set name = '王五', birthday = '2020-12-20' where id = 2;
注意事项
如果不加任何条件,则会将表中所有记录全部修改
五、DQL语句
1. 查询完整语法
select字段列表
from表名列表
where条件列表
group by分组字段
having分组之后的条件
order by排序
limit分页限定
2. select特点
* select 可以查询 表中的字段 表达式 常量值 函数
* 查询出的结果是一个虚拟表 不影响实际表中的数据
3. 数据准备
-- 创建表
create table stu(id int,name varchar(20),chinese double,english double,math double
);
-- 插入记录
insert into stu(id,name,chinese,english,math) values(1,'tom',89,78,90);
insert into stu(id,name,chinese,english,math) values(2,'jack',67,98,56);
insert into stu(id,name,chinese,english,math) values(3,'jerry',87,78,77);
insert into stu(id,name,chinese,english,math) values(5,'james',82,84,77);
insert into stu(id,name,chinese,english,math) values(6,'jack',55,85,45);
insert into stu(id,name,chinese,english,math) values(7,'tom',89,65,30);
4.简单查询
==查询所有记录==语法:SELECT * FROM 表名;
举例:SELECT * FROM stu;
==查询表中所有学生的姓名和对应的语文成绩==语法:SELECT 字段名1,字段名2... FROM 表名;
举例:SELECT `name`,chinese FROM stu;SELECT DISTINCT `name`,chinese FROM stu;
==查询表中学生姓名(去重)==语法:select DISTINCT 字段名1,字段名2... FROM 表名;
举例:SELECT DISTINCT `name` FROM stu;
==在所有学生数学分数上加10分特长分==SELECT `name`,math+10 FROM stu;
==统计每个学生的总分==SELECT `name`, chinese+english+math FROM stu;
起别名
在上面求每一个学生的总成绩时,展现出一个结果视图。在这个结果有两列,分别是name, chinese+IFNULL(english,0)+math 。第一个列名,一眼就能看出这列表示的是姓名,但是第二列,你能描述出这是一个学生的总成绩吗? 显然不能。我们就要使用别名的方式,展示别名。
==语法==
as : as也可以省略==在什么地方使用==
1. 可以用在某个字段上 name as 姓名 2. 可以用在函数上 min(sarlay) as 最低工资 3. 可以用在表上 from sutdent as s 注意事项: 如果给表起了别名,后面在使用的时候,必须要用别名==例子==
SELECT `name`, chinese+IFNULL(english,0) + math AS `总成绩` FROM stu; SELECT `name`, chinese+IFNULL(english,0) + math `总成绩` FROM stu;
5.条件查询
语法
SELECT 字段名 FROM 表名 [WHERE 条件];
运算符
运算符 | 说明 |
---|---|
> 、< 、<= 、>= 、= 、<> != | <>在 SQL 中表示不等于,在 mysql 中也可以使用!= 没有== |
BETWEEN...AND | 在一个范围之内 |
IN( 集合) | 集合表示多个值,使用逗号分隔 |
IS NULL 不为空 is not null | 查询某一列为 NULL 的值,注:不能写=NULL |
LIKE | 模糊查询 占位符: _:单个任意字符 %:多个任意字符 |
AND 或 && | 与,SQL 中建议使用前者,后者并不通用。 |
OR 或 || | 或 |
NOT 或 ! | 非 |
导入数据
-- 创建表
CREATE TABLE stu1 (id int,name varchar(20),age int,sex varchar(5),address varchar(100),math int,english int
);
-- 插入记录
INSERT INTO stu1(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);
条件查询
- ==查询math分数大于80分的学生==SELECT * FROM student2 WHERE math > 80;
- ==查询english分数小于或等于80分的学生==SELECT * FROM student2 WHERE english <= 80;
- ==查询age等于20岁的学生==SELECT * FROM student2 WHERE age = 20;
- ==查询age不等于20岁的学生==SELECT * FROM student2 WHERE age != 20;
- ==查询age大于35且性别为男的学生(两个条件同时满足)==SELECT * FROM student2 WHERE age > 35 AND sex = '男';
- ==查询age大于35或性别为男的学生(两个条件其中一个满足)==SELECT * FROM student2 WHERE age > 35 OR sex = '男';
- ==查询id是1或3或5的学生==SELECT * FROM student2 WHERE id = 1 OR id =3 OR id = 5;-- in关键字
-- 再次查询id是1或3或5的学生
SELECT * FROM student2 WHERE id IN(1,3,5);
- ==查询id不是1或3或5的学生==SELECT * FROM student2 WHERE id NOT IN(1,3,5);
- ==查询english成绩大于等于77,且小于等于87的学生==SELECT * FROM student2 WHERE english >=77 AND english <=87;SELECT * FROM student2 WHERE english BETWEEN 77 AND 87;
- ==查询英语成绩为null的学生==SELECT * FROM student2 WHERE english = NULL; -- null这哥们六亲不认...
SELECT * FROM student2 WHERE english IS NULL;
SELECT * FROM student2 WHERE english IS NOT NULL;
- ==查询姓马的学生==SELECT * FROM student2 WHERE name LIKE '马%';
- ==查询姓名中包含'德'字的学生==SELECT * FROM student2 WHERE name LIKE '%德%';
- ==查询姓马,且姓名有三个字的学生==SELECT * FROM student2 WHERE name LIKE '马__';