MySQL基础使用

引言

为什么需要数据库?

Java中保存数据需要使用集合或数组,但使用集合或数组程序关闭后,所有的数据全部丢失,如何才能持久化保存数据呢?

  1. 文件:存储少量数据,没有严格的格式;
  2. 网盘:需要网络,存储少量数据,没有严格的格式;
  3. 数据库:存储大量数据,按照一定格式存储。

数据库和应用程序的关系

数据库是存放数据的仓库,应用程序主要给用户一个可视的界面以及相关的功能,二者相辅相成。

MySQL基础使用

一、数据库简介

1.1 简介

  • 数据库(DataBase,DB):指长期保存在计算机的存储设备上,按照一定规则组织起来,可以被各种用户或应用共享的数据集合。简单理解数据的仓库。
  • 数据库管理系统(DataBase Management System,DBMS):指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,堆数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管理系统访问数据中的数据。
  • 数据库是通过数据库管理系统创建和操作的。

1.2 常见数据库管理系统

  • 关系型数据库管理系统(RDBMS,Relational Database Management System)
    1. Oracle:Oracle数据库被认为是业界目前比较成功的关系型数据库管理系统。Oracle数据库可以运行UNIX、Windows等主流操作系统平台,完全支持所有的工业标准,并获得最高级别的ISO标准安全性认证。
    2. MySQL:MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle旗下产品。MySQL是最好RDBMS(Relational Database Management System,关系数据库管理系统)应用软件。
    3. DB2:DB2是IBM公司的产品,DB2数据库系统采用多进程多线索体系结构,其功能足以满足大中公司的需要,并可灵活的服务于中小型电子商务解决方案。
    4. Microsoft SQL Server:SQL Server 是 Microssft公司退出的关系型数据库管理系统。具有使用方便可伸缩性好与相关软件集成程度高的优点。
    5. SQLite:应用在手机端的数据库。
    6. 国产数据库,阿里目前自研数据库分为两个支线,OceanBasePOLARDB
  • 非关系型数据库管理系统(NoSQL)
    Redis、MongoDB等

1.3 MySQL卸载

  1. 关闭MySQL服务
    方式1:win+R -> service.msc -> 关闭MySQL相关服务
    方式2:命令停止
    cmd管理员启动 -> net stop 服务名(默认mysql57)
  2. 控制面板卸载(相关MySQL均卸载)
  3. 删除C盘残留文件(Program Files、Program Files(x86)、ProgramData)
  4. 检查服务是否删除成功(第一步可查看)
  5. 如果未删除服务,手动删除
    使用管理员身份进入cmd命令行,执行:sc delete 服务名

1.4 MySQL5.5安装

  • 安装和配置步骤
    5.5-1
    5.5-25.5-3
    5.5-4
    5.5-5
    5.5-6
    5.5-7
    5.5-8
    5.5-9
    5.5-10
    5.5-11
    5.5-12
    5.5-13
    5.5-14
    5.5-15
    5.5-16
    5.5-17
    5.5-18
    5.5-19
    5.5-20
    5.5-21
    5.5-22
  • 启动MySQL服务
    1. win+R -> service.msc -> 启动MySQL相关服务
    2. 命令停止
      cmd管理员启动 -> net start 服务名(默认mysql57)
  • 验证是否安装成功
    win+R -> cmd -> mysql -uroot -p -> 回车后输入密码
  • 卸载MySQL
    1. 停止服务,使用net stop 服务名命令停止服务。
    2. 在控制面版–>“程序和功能”中,找到“MySQL”程序,点击卸载。
    3. 删除安装目录,一般默认在C:\Program Files\MySQL。
    4. 删除数据库文件 存放目录,一般默认在C:\ProgramData\MySQL

注意:
(1)在运行窗口中,输入services.msc,打开服务窗口查看是否还有“MySQL”服务。
(2)如果卸载后,发现MySQL服务没有删除,手动删除:以管理员身份打开命令行,输入sc delete 服务名

  • MySQL安装目录
    bin文件夹:改文件夹下存放着可执行文件
    include文件夹:该文件夹下存放着头文件
    lib文件夹:该文件夹下存放着库文件
    share文件夹:该文件夹下存放着字符集、语言等信息。
  • MySQL配置文件
    在MySQL安装目录中找到my.ini文件,并打开查看几个常用配置参数
常用的参数名描述
default-character-set客户端默认字符集
character-set-server服务器端默认字符集
port客户端和服务器端的端口号
default-storage-engineMySQL默认存储引擎 INNODB

1.5 MySQL5.7安装

  • 卸载
    (1)停止服务 net stop mysql57 (2)安装和卸载程序 卸载mysql项目 (3)删除残留文件 C:\ProgramData

注意
如果MySQL57服务没有删除成功,请手动删除:使用管理原身份进入命令行sc delete 服务名

  • 安装
    同意协议
    同意协议
    仅仅服务器模式
    仅仅服务器模式
    请选择安装的位置,如果修改请记住位置,点击下一步
    请选择安装的位置,如果修改请记住位置,点击下一步
    点击Execute执行
    点击Execute执行
    显示执行进度,请等待执行完毕。
    显示执行进度,请等待执行完毕。
    执行完毕,点击下一步。
    执行完毕,点击下一步。
    安装完成后,开始准备配置
    安装完成后,开始准备配置
    进行第一步配置,除了需要设置密码外,后面的步骤基本上都是下一步下一步
    进行第一步配置,除了需要设置密码外,后面的步骤基本上都是下一步下一步
    设置 root 密码
    设置 root 密码
    设置 root 密码
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    最后一步。把mysql安装目录添加到环境变量,方便使用命令。
    在这里插入图片描述
    在这里插入图片描述
  • 验证是否安装成功
    打开:Command Line Client输入root的账号和密码能进入,安装成功。
    修改密码:`set password for ‘root’@‘localhost’=password(‘新密码’);```
  • 安装目录介绍
    bin:二进制文件
    dosc:存放文档
    include:头文件
    lib:链接库
    share:语言文件
    C:\ProgramData\MySQL\MySQL Server 5.7 存放数据库的目录和配置
  • my.ini设置编码
    设置数据库默认编码:default-character-set=utf8mb4
    设置服务器编码:character-setserver=utf8mb4
  • 服务的停止和服务
    (1)使用windows的服务界面停止和启动MySQL57
    (2)管理员命令行停止
# 停止服务
net stop MySQL57
# 启动服务
net start MySQL57

 
 
  • 1
  • 2
  • 3
  • 4
  • 把MySQL的bin目录添加环境变量
    C:\Program Files\MySQL\MySQL Server 5.7\bin添加到path中
    打开命令提示符:(1)输入mysql -uroot -p 回车(2)输入密码

二、SQL语言

2.1 概述

  • SQL:Structure Query Language(结构化查询语言),用来访问和处理数据库的标准计算机语言。后来被国际化标准组织(ISO)采纳为关系型数据库语言的国际标准。
  • SQL作用:SQL是一种标准化的语言,它允许你在数据库上执行操作,如创建数据库、表等等,查询内容,更新内容,并删除条目等操作;CRUD(Create、Read、Update、Delete)操作。
  • 大部分数据库厂商都支持ISO的SQL标准,但是数据库厂商在标准的基础上做了自己的扩展,称为方言

2.2 SQL语句分类

  • DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等。
  • DML(Data Manipulation Language):数据库操作语言,用来定义数据库记录(数据)。
  • DQL(Data Query Language):数据查询语言,用来查询记录(数据)。
  • DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别。

MySQL语法这主意事项
MySQL每条结尾以“;”结尾。
MySQL语句不区分大小写。
MySQL字符串使用单引号双引号
MySQL注释:(1)单行注释:#开头或者--空格开头(2)多行注释/*多行注释*/

2.3 DDL操作数据库

  • 显示当前MySQL中的数据库
# 显示当前MySQL中的数据库
SHOW DATABASES;

 
 
  • 1
  • 2

系统默认数据库:

数据库名描述
information_schemainformation_schema数据库是MySQL自带的,他提供了访问数据库元数据 1的方式。
mysql这是个MySQL的核心数据库,主要负责存储数据库的用户、权限设置、关键字等MySQL自己需要使用的控制和管理信息,不可删除。
performance_schema收集数据库服务器性能参数,性能优化的数据库。
test(5.5版本)这个是安装时候创建的一个测试数据库,和它的名字一样,是一个完全的空数据库,没有任何表,可以删除。
sys(5.7版本)sys系统数据库,保存系统的元数据信息,数据来源information——schema库。
这个库可以方便DBA发现数据库的很多信息,解决性能瓶颈都提供了巨大帮助。
2.3.1 创建数据库

CREATE DATABASE语句用于创建新的数据库:

  • 语法
CREATE DATABASE [IF NOT EXISTS] db_name;

 
 
  • 1
  • 练习:
# 创建mydb1数据库
CREATE DATABASE mydb1;
# 创建GBK字符集的mydb2数据库
CREATE DATABASE IF NOT EXISTS mydb2 character SET GBK;
# 创建字符集为GBK,校验规则是gbk_chinese_ci的mydb3数据库
CREATE DATABASE mydb3 character SET GBK COLLATE gbk_chinese_ci;

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
2.3.2 查看
  • 查看当前数据库服务器中的所有数据库
SHOW DATABASES;

 
 
  • 1
  • 查看前面创建的mydb2数据库定义信息
SHOW CREATE DATABASE mydb2;

 
 
  • 1
2.3.3 修改
  • 查看服务器中的数据库,并把mydb2的字符集修改为utf8;
ALTER DATABASE mydb2 character SET utf8;

 
 
  • 1
2.3.4 删除
  • 语法
DROP DATABASE [IF EXISTS] db_name;

 
 
  • 1
  • 练习:
# 判断mydb3数据库是否存在存在就直接删除
DROP DATABASE IF EXISTS mydb3;

 
 
  • 1
  • 2
2.3.5 其他语句
  • 查看当前使用的数据库
SELECT DATABASES();	# 没有选择数据 null    

 
 
  • 1
  • 切换数据库
USE mydb2;

 
 
  • 1
  • 退出MySQL
quit;
# OR
exit;
# OR
\q

 
 
  • 1
  • 2
  • 3
  • 4
  • 5

2.4 DDL操作表

2.4.1 创建表 CREATE TABLE
  • CREATE TABLE语句用于创建新表。
  • 语法
CREATE TABLE [IF NOT EXISTS] db_name(
	字段1 字段类型(长度) 约束,
	字段2 字段类型(长度) 约束,
	...
	字段n 字段类型(长度) 约束
)[CHARSET=utf8];

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 实例:
CREATE TABLE IF NOT EXISTS student(
	id INT NOT NULL,
	name VARCHAR(50),
	age INT,
	address VARCHAR(100)
) CHARSET=utf8;

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

CREATE TABLE IF NOT EXISTS `student`(
	`id` INT NOT NULL,
	`name` VARCHAR(50),
	`age` INT,
	`address` VARCHAR(100)
)CHARSET=utf8;

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

注意:数据库名、表名、字段名可以使用反勾号“`”括住,也可以不括。如果SQL关键字或者数字开头标识符一般要括住。
反勾号即键盘ESC下方的案结案

  • 常用数据类型
数据类型名称描述
int整型(4个字节)
double浮点想(8个字节),近似值
例如double(5,2)表示最多5位,其中必须由2位小鼠,取值范围位-999.99到999.99。
decimal精确数值数据,最大位数可以是65
例如decimal(5,2)能够存储具有五位数和两位小数的任何值,因此可以存储范围位-999.99至999.99。
char固定长度字符串类型;
char(10)——'aaa '最多存储10个字符
缺点:浪费空间;优点:查询速度快。
varchar可变长度字符串类型;
varchar(10)——'aaa’最多存储10个字符
缺点:查询速度慢;优点:节省空间。
text大文本字符串类型;有字符编码,存储比较大的文本数据。
blobBinary Large Object二进制大对象数据;可以存储图片、音频、视频。
date日期类型,格式为:yyyy-MM-dd。
time时间类型,格式为:hh:mm:ss。
timestamp时间戳类型yyyy-MM-dd hh:mm:ss会自动赋值。
datetime日期时间类型yyyy-MM-dd hh:mm:ss。
2.4.2 删除表 DROP TABLE
  • DROP TABLE语句用于删除现有表。
  • 语法
DROP TABLE [IF EXISTS] table_name;

 
 
  • 1
2.4.3 当前数据库中的所有表 SHOW TABLE
SHOW TABLES;

 
 
  • 1
2.4.4 查看表的字段信息 DESC
  • 语法
DESC table_name;

 
 
  • 1
  • 练习:查询student表的字段信息
DESC student;

 
 
  • 1
2.4.5 增加列 ALTER … ADD
  • 语法
ALTER TABLE table_name ADD 列名(字段名) 数据类型;

 
 
  • 1
  • 练习:在上面学生表的基础上增加一个image列(数据类型blob)
# 在上面学生表的基础上增加一个image列(数据类型blob)
ALTER TABLE student ADD image blob;

 
 
  • 1
  • 2
2.4.6 修改列(字段)属性 ALTER … MODIFY
  • 语法
ALTER TABLE table_name MODIFY 列名(字段名) 数据类型;

 
 
  • 1
  • 练习:修改student表中address列,使其长度为60
# 修改student表中address列,使其长度为60
ALTER TABLE student MODIFY address varchar(60);

 
 
  • 1
  • 2
2.4.7 删除列(字段)ALTER … DROP
  • 语法
ALTER TABLE table_name DROP 列名(字段名);

 
 
  • 1
  • 练习:删除student表中image列,一次只能删除一列
# 删除student表中image列,一次只能删除一列
ALTER TABLE student DORP image;

 
 
  • 1
  • 2
2.4.8 更改表名 RENAME … TO
  • 语法
RENAME TABLE old_table_name TO new_table_name; 

 
 
  • 1
  • 练习:把student表名改为user
# 把student表名改为user
RENAME TABLE student TO `user`;

 
 
  • 1
  • 2
2.4.9 查看表的创建细节 SHOW CREATE
  • 语法
SHOW CREATE TABLE table_name;

 
 
  • 1
  • 练习:查看user表的创建细节
# 查看user表的创建细节
SHOW CREATE TBALE user;

 
 
  • 1
  • 2
2.4.10 修改表的字符集 ALTER … CHARACTER SET
  • 语法
ALTER TABLE table_name CHARACTER SET 字符集;

 
 
  • 1
  • 练习:修改user表的字符集为gbk
# 修改user表中的字符集为gbk
ALTER TABLE user CHARACTER SET gbk;

 
 
  • 1
  • 2
2.4.11 修改列名(字段名) ALTER … CHANGE
  • 语法
ALTER TABLE table_name CHANGE old列名 new列名 数据类型;

 
 
  • 1
  • 练习:将user表中name列名改为username
# 将user表中name列名改为username
ALTER TABLE user CHANGE name username varchar(100);

 
 
  • 1
  • 2

2.5 DML操作(重要)

DML是对表中的数据进行增、删、改的操作。不要与DDL混淆了。
主要包括:INSERT、UPDATE、DELETE

  • 小知识
    在MySQL中,字符串类型和日期类型都要用单引号括起来。
    空值:null
  • 被操作表
CREATE TABLE student(
	id INT NOT NULL,
	name VARCHAR(50),
	age INT,
	address VARCHAR(100)
);

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
2.5.1 插入操作:INSERT
  • 语法
INSERT INTO 表明 (列名1,列名2...) VALUES (列值1,列值2...);

 
 
  • 1

注意:列名与列值的类型、个数、顺序要一一对应。
可以把列名当作Java中的形参,把列值当作实参。
参数不要超出列定义的长度。
如果插入空值,请使用null。
插入的日期和字符一样,都使用单引号括起来。

  • 一次添加一条数据
# 一次添加一条数据
INSERT INTO student(id,name,age,address) VALUES (1,'zhangsan',20,'北京海淀');
INSERT INTO student(id,name,age,address) VALUES (2,'lisi',22,'上海浦东');
INSERT INTO student(id,name,age,address) VALUES (3,'wangwu',23,'北京昌平');

 
 
  • 1
  • 2
  • 3
  • 4
  • 一次添加多条数据
# 一次添加多条数据
INSERT INTO student(id,name,age,address) values (4,'曹操',27,'北京海淀'),(5,'周瑜',28,'北京朝阳'),(6,'赵云',30,'北京大兴');

 
 
  • 1
  • 2

思考:命令行中为什么不能添加中文数据,MySQL5.7就没有此问题。

  • 小知识
    查看数据库编码的具体信息
# 查看数据库编码的具体信息
SHOW VARIABLES LISK 'character%';

 
 
  • 1
  • 2

临时更改客户端和服务器结果集的编码

# 临时更改客户端和服务器结果集的编码
SET character_set_client=gbk;
SET character_set_results=gbk;
# 或者
SET NAMES 'gbk';	//	client connection results

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
2.5.2 修改操作:UPDATE
  • 语法
UPDATE 表名 SET 列名1=列值1,列名2=列值2... WHERE 列名=;

 
 
  • 1
  • 练习:
  1. 将student表中所有学生的年龄修改为25。
# 将所有学生的年龄修改为25。
UPDATE student SET age=2;

 
 
  • 1
  • 2
  1. 将student表中id为’1’的地址修改为"河北保定"。
# 将id为'1'的地址修改为"河北保定"。
UPDATE student SET address='河北保定' WHERE id=1;

 
 
  • 1
  • 2
  1. 将student表中姓名为"曹操"的学生年龄改为50,地址改为"河南郑州"。
# 将姓名为"曹操"的学生年龄改为50,地址改为"河南郑州"。
UPDATE student SET age=50,address='河南郑州' WHERE name='曹操';

 
 
  • 1
  • 2
  1. 将student表中所有学生的年龄加5岁。
# 将所有学生的年龄加5岁。
UPDATE student SET age=age+5;

 
 
  • 1
  • 2
2.5.3 删除操作:DELETE
  • 语法
DELETE FROM 表名 [WHERE 列名=];
# OR 删除表
TRUNCATE TABLE table_name;

 
 
  • 1
  • 2
  • 3
  • 练习
    删除student表中姓名为’zhangsan’的记录。
# 删除表中姓名为'zhangsan'的记录
DELETE FROM student WHERE name='zhangsan' 

 
 
  • 1
  • 2

删除emp表中所有记录。

# 删除emp表中所有记录
DELETE FROM emp;

 
 
  • 1
  • 2

使用truncate删除emp表中记录。(先把表删除,然后创建空表)

# 使用truncate删除emp表中记录。(先把表删除,然后创建空表)
TRUNCATE TABLE emp;

 
 
  • 1
  • 2
2.5.4 DELETE和TRUNCATE区别
  • DELETE 删除表中的数据,表结构还在,删除后的数据使用日志可以找回。
  • TRUNCATE 删除是把表直接DROP掉,然后再创建一个同样的新表。
  • TRUNCATE 删除的数据不能找回。执行速度比DELETE快。

2.6 客户端工具

使用命令虽然可以完成基本操作,但为了更方便用户操作和使用MySQL数据库,市面上出现很多第三方的客户端管理工具比如:SQLyogNavicat

三、DQL数据查询(重点)

  • 数据库执行DQL语句不会对数据进行改变,二十让数据库发送结果集给客户端。
  • 查询返回的结果集是一张虚拟表。
  • 查询关键字:SELECT
  • 语法
SELECT 列名 FROM 表名 [WHERE --> GROUP BY --> HAVING --> ORDER BY --> LIMIT];

 
 
  • 1
关键字语法功能描述
SELECT selection_list查询列名
FROM table_name查询表名
WHERE condition行条件
GROUP BY grouping_columns对结果分组
HAVING condition分组后的行条件
ORDER BY sorting_columns对结果排序
LIMIT offset_start,row_count结果限定
  • 被操作表
    创建学生表并添加数据
#创建表stu
CREATE TABLE stu (
	sid	CHAR(6),
	sname		VARCHAR(50),
	age		INT,
	gender	VARCHAR(50)
);
#添加数据
INSERT INTO stu VALUES('S_1001', 'liuYi', 35, 'male');
INSERT INTO stu VALUES('S_1002', 'chenEr', 15, 'female');
INSERT INTO stu VALUES('S_1003', 'zhangSan', 95, 'male');
INSERT INTO stu VALUES('S_1004', 'liSi', 65, 'female');
INSERT INTO stu VALUES('S_1005', 'wangWu', 55, 'male');
INSERT INTO stu VALUES('S_1006', 'zhaoLiu', 75, 'female');
INSERT INTO stu VALUES('S_1007', 'sunQi', 25, 'male');
INSERT INTO stu VALUES('S_1008', 'zhouBa', 45, 'female');
INSERT INTO stu VALUES('S_1009', 'wuJiu', 85, 'male');
INSERT INTO stu VALUES('S_1010', 'zhengShi', 5, 'female');
INSERT INTO stu VALUES('S_1011', 'xxx', NULL, NULL);

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

创建雇员表并添加数据

# 创建表emp
CREATE TABLE emp(
empno INT,
ename VARCHAR(50),
job VARCHAR(50),
mgr INT,
hiredate DATE,
sal DECIMAL(7,2),
comm decimal(7,2),
deptno INT
);
# 添加数据
INSERT INTO emp values(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
INSERT INTO emp values(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
INSERT INTO emp values(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
INSERT INTO emp values(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
INSERT INTO emp values(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
INSERT INTO emp values(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);
INSERT INTO emp values(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);
INSERT INTO emp values(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20);
INSERT INTO emp values(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
INSERT INTO emp values(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);
INSERT INTO emp values(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20);
INSERT INTO emp values(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30);
INSERT INTO emp values(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20);
INSERT INTO emp values(7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

创建部门表并添加数据

#创建部门表
CREATE TABLE dept(
deptno INT,
dname varchar(14),
loc varchar(13)
);
#添加数据
INSERT INTO dept values(10, '财务部', 'beijing');
INSERT INTO dept values(20, 'java开发部', 'tianjin');
INSERT INTO dept values(30, '测试部', 'shanghai');
INSERT INTO dept values(40, '销售部', 'shenzheng');

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

3.1 简单查询

  • 语法
SELECT 表名(多表名“,”隔开;全部*) FROM table_name;

 
 
  • 1
  • 练习:
    查询stu表中所有列
# 查询stu表中所有列
SELECT * FRMO stu;

 
 
  • 1
  • 2

查询stu表的sid、sname、age列

# 查询stu表的sid、sname、age列
SELECT sid,sname,age FROM stu;

 
 
  • 1
  • 2

3.2 条件查询

条件查询就是在查询时给出WHERE子句,在WHERE子句中可以使用如下运算符及关键字:

名称符号
算数运算符+、-、*、/、%
比较运算符=、!=、<>、<、<=、>、>=
BETWEEN...AND-在…和…之间
IN(set) 范围
NOT IN(set)-不在范围内
IS NULL-为空
IS NOT NULL-不为空
LIKE-模糊查询
关系运算符AND&&
OR\|\|
NOT!

参考地址:https://dev.mysql.com/doc/refman/5.7/en/operator-precedence.html.

面试题:
select 1+'1';	# 输出2
select 1+'10a';	# 输出11
select 1+'a';	# 输出1

 
 
  • 1
  • 2
  • 3
  • 练习:
  1. 查询stu表中性别为女,并且年龄小于50的记录
# 查询stu表中性别为女,并且年龄小于50的记录
SELECT * FROM stu WHERE gender='female' AND age<50;

 
 
  • 1
  • 2
  1. 查询stu表中学号为S_1001,或者姓名为liSi的记录
# 查询stu表中学号为S_1001,或者姓名为liSi的记录
SELETCT * FROM stu WHERE sid=S_1001 OR sname=liSi;

 
 
  • 1
  • 2
  1. 查询stu表中学号为S _ 1001 ,S _ 1002,S _ 1003的记录
# 查询stu表中学号为S _ 1001 ,S _ 1002,S _ 1003的记录
SELECT * FROM stu 
WHERE sid IN (S_1001,S_1002,S_1003)

 
 
  • 1
  • 2
  • 3

或者

# 查询stu表中学号为S _ 1001 ,S _ 1002,S _ 1003的记录
SELECT * FROM stu WHERE sid=S_1001 OR sid=S_1002 OR sid=S_1003;

 
 
  • 1
  • 2
  1. 查询stu表中学号不是S_1001,S_1002,S_1003的记录
# 查询stu表中学号不是S_1001,S_1002,S_1003的记录
SELECT * FROM stu WHERE sid NOT IN (S_1001,S_1002,S_1003);

 
 
  • 1
  • 2
  1. 查询stu表中年龄为null的记录
# 查询stu表中年龄为null的记录
SELECT * FROM stu WHERE age IS NULL;

 
 
  • 1
  • 2
  1. 查询stu表中年龄在20到40之间的学生记录
# 查询stu表中年龄在20到40之间的学生记录
SELECT * FROM stu WHERE age>20 AND age<40;

 
 
  • 1
  • 2

或者

# 查询stu表中年龄在20到40之间的学生记录
SELECT * FROM stu WHERE age BETWEEN 20 AND 40;

 
 
  • 1
  • 2
  1. 查询stu表中性别非男的学生记录
# 查询stu表中性别非男的学生记录
SELECT * FROM stu WHERE gender != 'male';

 
 
  • 1
  • 2

或者

# 查询stu表中性别非男的学生记录
SELECT * FROM stu WHERE gender <> 'male';

 
 
  • 1
  • 2

或者

# 查询stu表中性别非男的学生记录
SELECT * FROM stu WHERE NOT gender='male';

 
 
  • 1
  • 2
  1. 查询stu表中姓名不为null的学生记录
# 查询stu表中姓名不为null的学生记录
SELECT * FROM stu WHERE sname IS NOT NULL;

 
 
  • 1
  • 2

或者

# 查询stu表中姓名不为null的学生记录
SELECT * FROM stu WHERE NOT sname IS NULL;

 
 
  • 1
  • 2

3.3 模糊查询

  • 当想查询姓名中包含a字母的学生时就需要使用模糊查询了。模糊查询需要使用关键字LIKE。
  • 通配符:
字符功能描述
_任意一个字符
%任意0~n个字符
  • 练习:
  1. 查询stu表中姓名由3个字符构成的学生记录
# 查询stu表中姓名由3个字符构成的学生记录
SELECT * FROM stu LIKE '___';

 
 
  • 1
  • 2

模糊查询必须使用LIKE关键字。其中 “”匹配任意一个字母,5个“”表示5个任意字母。

  1. 查询stu表中姓名由5个字符构成,并且第5个字符为“i”的学生记录
# 查询stu表中姓名由5个字符构成,并且第5个字符为“i”的学生记录
SELECT * FROM stu LIKE '____i';

 
 
  • 1
  • 2
  1. 查询stu表中姓名以“z”开头的学生记录
# 查询stu表中姓名以“z”开头的学生记录
SELECT * FROM stu LIKE 'z%';

 
 
  • 1
  • 2

其中“%”匹配0~n个任何字符。

  1. 查询stu表中姓名中第2个字符为“i”的学生记录
# 查询stu表中姓名中第2个字符为“i”的学生记录
SELECT * FROM stu LIKE '_i%';

 
 
  • 1
  • 2
  1. 查询stu表中姓名中包含“a”字符的学生记录
# 查询stu表中姓名中包含“a”字符的学生记录
SELECT * FROM stu LIKE '%a%';

 
 
  • 1
  • 2

3.4 字段控制查询

3.4.1 去除重复记录 DISTINCT
  • 语法
SELECT DISTINCT 列名 FROM table_name;

 
 
  • 1
  • 练习:
    去除重复记录(两行或两行以上记录中列的数据相同),例如emp表中sal字段就存放在相同的记录。当值查询emp表的sal字段时,那么会出现重复记录,那么想去除重复记录,需要使用DISTINT:
/*
去除重复记录(两行或两行以上记录中列的数据相同),例如emp表中sal字段就存放在相同的记录。当值查询emp表的sal字段时,那么会出现重复记录,那么想去除重复记录,需要使用DISTINT:
*/
SELECT DISTINCT sal FROM emp;
SELECT DISTINCT sal,comm FROM emp;

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
查看数据之和 +、CONCAT
  • 语法
# 数值型
SELECT *,1+2 FROM table_name;
# 字符串型
# 字符串的合并不能使用+ ,使用CONCAT
SELECT *,CONCAT(1,'可添加字符串或多列',列n) from table_name;

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 练习:
    因为sal和comm两列的类型都是数值类型,所以可以做加运算。如果sal或comm中有一个字段不是数值类型,那么会出错。
# 因为sal和comm两列的类型都是数值类型,所以可以做加运算。如果sal或comm中有一个字段不是数值类型,那么会出错。
SELECT *,sal+comm FROM emp;
# 字符串型
select *,concat(ename,'______',job) from emp;

 
 
  • 1
  • 2
  • 3
  • 4

注意:comm列有很多记录的值为NULL,因为任何东西与NULL相加结果还是NULL,所以结算结果可能会出现NULL。下面

使用了把NULL转换成数值0的函数IFNULL

# 使用了把NULL转换成数值0的函数`IFNULL`:
SELECT *,sal+IFNULL(comm,0) FROM emp;

 
 
  • 1
  • 2
给列名添加别名 [AS]
  • 语法
SELECT *,字段控制等 (AS) 别名 FROM table_name;

 
 
  • 1
  • 练习:
  1. 在上面查询中出现列名为sal+IFNULL(comm,0),这很不美观,现在我们给这一列给出一个别名,为total
# 在上面查询中出现列名为sal+IFNULL(comm,0),这很不美观,现在我们给这一列给出一个别名,为`total`:
SELECT *, sal+IFNULL(comm,0) AS total FROM emp;

 
 
  • 1
  • 2
  1. 给列起别名时,是可以省略AS关键字的:
# 给列起别名时,是可以省略`AS`关键字的:
SELECT *,sal+IFNULL(comm,0)  total FROM emp;

 
 
  • 1
  • 2

3.5 排序 ORDER BY

  • 语法
# 升序
SELECT * FROM table_name ORDER BY 列名 [ASC];
# 降序
SELECT * FROM table_name ORDER BY 列名 DESC;

 
 
  • 1
  • 2
  • 3
  • 4
  • 练习:
  1. 查询stu表中所有学生记录,按年龄升序排序
# 查询stu表中所有学生记录,按年龄升序排序
SELECT * FROM stu ORDER BY age [ASC];

 
 
  • 1
  • 2
  1. 查询stu表中所有学生记录,按年龄降序排序
# 查询stu表中所有学生记录,按年龄降序排序
SELECT * FROM stu ORDER BY age DESC;

 
 
  • 1
  • 2
  1. 查询emp表中所有雇员,按月薪(sal)降序排序,如果月薪相同时,按编号(empno)升序排序
# 查询emp表中所有雇员,按月薪降序排序,如果月薪相同时,按编号升序排序
SELECT * FROM emp ORDER BY sal DESC,empno ASC;

 
 
  • 1
  • 2

3.6 聚合函数

  • 聚合函数是用来做纵向运算的函数:
函数功能描述
COUNT()统计指定列不唯NULL的记录行数。
MAX()计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算。
MIN()计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算。
SUM()计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0。
AVG()计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0。
3.6.1 COUNT
  • 当需要纵向统计时可以使用COUNT()。
  • 练习:
  1. 查询emp表中记录数:
# 查询emp表中记录数:
SELECT COUNT(*) FROM emp; 

 
 
  • 1
  • 2
  1. 查询emp表中有佣金(comm)的人数:
# 查询emp表中有佣金(comm)的人数:
SELECT COUNT(comn) FROM emp; 

 
 
  • 1
  • 2
  1. 查询emp表中月薪(sal)大于2500的人数:
# 查询emp表中月薪(sal)大于2500的人数:
SELECT COUNT(*) FROM emp WHERE sal>2500;

 
 
  • 1
  • 2
  1. 统计emp表月薪与佣金之和大于2500元的人数:
# 统计emp表月薪与佣金之和大于2500元的人数:
SELECT COUNT(*) FROM emp WHERE sal+IFNULL(comn,0)>2500;

 
 
  • 1
  • 2
  1. 查询emp表有佣金的人数,以及有领导(mgr)的人数:
# 查询emp表有佣金的人数,以及有领导(mgr)的人数:
SELECT COUNT(comn),COUNT(mgr) FROM emp;

 
 
  • 1
  • 2
3.6.2 SUM和AVG
  • 当需要纵向求和时使用sum()函数。
  • 练习:
  1. 查询emp表所有雇员月薪和:
# 查询emp表所有雇员月薪和:
SELECT SUM(sal) FROM emp;

 
 
  • 1
  • 2
  1. 查询emp表所有雇员月薪和,以及所有雇员佣金和:
# 查询emp表所有雇员月薪和,以及所有雇员佣金和:
SELECT SUM(sal),SUM(comn) FROM emp;

 
 
  • 1
  • 2
  1. 查询emp表所有雇员月薪+佣金和:
# 查询emp表所有雇员月薪+佣金和:
SELECT SUM(sal+IFNULL(comn,0)) FROM emp;

 
 
  • 1
  • 2
  1. 统计emp表所有员工平均工资:
# 统计emp表所有员工平均工资:
SELECT AVG(sal) FROM emp;

 
 
  • 1
  • 2
3.6.3 MAX和MIN
  • 练习:查询emp表最高工资和最低工资:
# 查询emp表最高工资和最低工资:
SELECT MAX(sal),MIN(sal) FROM emp;

 
 
  • 1
  • 2

3.7 分组查询 GROUP BY … HAVING

  • 当需要分组查询时需要使用GROUP BY子句,例如查询每个部门的工资和,这说明要使用部分来分组。

注:凡是和聚合函数同时出现的列名,则一定要写在GROUP BY之后。

  • 语法
SELECT * FROM table_name GROUP BY 列名 HAVING 条件; 

 
 
  • 1
3.7.1 分组查询 GROUP BY
  • 练习:
  1. 查询emp表中每个部门的部门编号(deptno)和每个部门的工资和:
# 查询emp表中每个部门的部门编号(deptno)和每个部门的工资和:
SELECT deptno,SUM(sal) FROM emp GROUP BY deptno;

 
 
  • 1
  • 2
  1. 查询emp表中每个部门的部门编号以及每个部门的人数:
# 查询emp表中每个部门的部门编号以及每个部门的人数:
SELECT deptno,COUNT(*) FROM emp GROUP BY deptno;

 
 
  • 1
  • 2
  1. 查询emp表中每个部门的部门编号以及每个部门工资大于1500的人数:
# 查询emp表中每个部门的部门编号以及每个部门工资大于1500的人数:
SELECT deptno,COUNT(*) FROM emp WHERE sal>1500 GROUP BY deptno;

 
 
  • 1
  • 2
3.7.2 HAVING子句 GROUP BY … HAVING
  • 练习:查询emp表中工资总和大于9000的部门编号以及工资和:
# 查询emp表中工资总和大于9000的部门编号以及工资和:
SELECT deptno FROM emp GROUP BY deptno HAVING SUM(sal)>9000;

 
 
  • 1
  • 2
3.7.3 HAVING 和 WHERE 的区别
  1. HAVING是在分组后对数据进行过滤,WHERE是在分组前对数据进行过滤。
  2. HAVING后面可以使用分组函数(统计函数),WHERE后面不可以使用分组函数。

3.8 LIMIT限制

  • LIMIT用来限定查询结果的其实行,以及总行数。
  • 语法
SELECT * FROM table_name LIMIT m,n;
# m是指记录开始的index,从0开始,表示第一条记录。
# n是指从第m+1条开始,取n条。

 
 
  • 1
  • 2
  • 3
  • 练习:
  1. 查询emp表中前5行记录,起始行从0开始
# 查询emp表中前5行记录,起始行从0开始
SELECT * FROM emp LIMIT 0,5;

 
 
  • 1
  • 2
  1. 查询emp表中10行记录,起始行从3开始
# 查询emp表中10行记录,起始行从3开始
SELECT * FROM emp LIMIT 3,10;

 
 
  • 1
  • 2
3.8.1 分页查询
  • 如果一页记录为10条,希望查看第3页记录应该怎么查呢?
    l 第一页记录起始行为0,一共查询10行;
    l 第二页记录起始行为10,一共查询10行;
    l 第三页记录起始行为20,一共查询10行;

总结

  • 数据库:存储数据的仓库。
  • 数据库管理系统: MySQL Oracle SQL Server DB2
  • MySQL安装、卸载
  • SQL语句:
    1. DDL 数据定义语言 创建库,创建表
    2. DML数据操纵语言 添加 删除 更新 insert delete udpate
    3. DQL 数据查询语言 select
    4. DCL 数据控制语言, 用户的创建 权限分配。
  • DQL【重点】
    1. 简单查询
    2. 条件查询 where 运算符 = != <> > >= < <= in between and and or not + - * / %
      模糊查询 通配符 _表示一个字符 %表示任意多个字符
    3. 字段控制 distinct 去重 合并 别名
    4. 排序 order by
    5. 聚合函数 count sum max min avg
    6. 分组查询 group by having
    7. limit 限制查询

作业题

  1. 设有成绩表如下所示
    1.查询两门及两门以上不及格的学生姓名
    2.查询学生平均分
    3.查询姓名是张三的学生 成绩和
    4.将学生信息按照 分数倒序
    5.获取学生信息中 分数最低的学生姓名和分数最高的学生姓名
    6.查询两门及两门以上不及格同学的平均分。
    编号 姓名 科目 分数
    1 张三 数学 90
    2 张三 语文 50
    3 张三 地理 40
    4 李四 语文 55
    5 李四 政治 45
    6 王五 政治 30
    7 李四 数学 80
    8 王五 语文 70

  2. 写出 SQL语句的格式 : 插入 ,更新 ,删除
    表名 user
    name tel content date
    张三 13333663366 大专毕业 2006-10-11
    张三 13612312331 本科毕业 2006-10-15
    张四 021-55665566 中专毕业 2006-10-15
    (a).有一新记录(小王 13254748547 高中毕业 2007-05-06)请用SQL语句新增至表中
    (b).请用sql语句把张三的时间更新成为当前系统时间
    ©.请写出删除名为张四的全部记录

  3. 写出 SQL语句的格式 :对emp表进行查询操作
    1.找出奖金高于工资的雇员
    2.找出奖金高于工资60%的雇员
    3.找出部门10中所有经理和部门20中所有店员的信息
    4.薪资大于或等于2000的所有员工的信息。
    5.查询没有奖金或者奖金低于100的员工信息
    6.查询姓名不带”R”的员工姓名
    7.显示员工的姓名和入职时间,根据入职时间,将最老的员工排放在最前面。
    8.显示所有员工的姓名、工作和工资,按照工作的降序排序,若工作相同则按工资升序排序。

面试题

有3个表
student 学生表(学号,姓名,性别,年龄,组织部门)
course 课程表(编号,课程名称)
score 成绩表(学号,课程编号,成绩)
要求如下:
1)写一个SQL 语句,查询参加考试课程名称为’计算机原理’的学生学号和姓名(3 分钟)

select * from student s inner join sc on  s.stuNo=sc.stuNo inner join course c on sc.courseId= c.courseId where c.couseName='计算机原理';

 
 
  • 1

2)写一个SQL 语句,查询’周星驰’参加考试的课程名字(3 分钟)

select c.courseName from course c inner join score sc on c.couserId=sc.couserId where sc.stuNo=(select stuNo from Student where name='周星驰');

 
 
  • 1

3)写一个SQL 语句,查询选修了5 门课程的学生学号和姓名(9 分钟)

select s.stuNo,s.name from Student s inner  join Sc  on s.stuNo=sc.stuNo group by s.stuNo having count(s.stuNo)>=5;

 
 
  • 1

  1. 元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。 ↩︎

                                </div>
            <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-b6c3c6d139.css" rel="stylesheet">
                                <div class="more-toolbox">
            <div class="left-toolbox">
                <ul class="toolbox-list">
                    
                    <li class="tool-item tool-active is-like "><a href="javascript:;"><svg class="icon" aria-hidden="true">
                        <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#csdnc-thumbsup"></use>
                    </svg><span class="name">点赞</span>
                    <span class="count">19</span>
                    </a></li>
                    <li class="tool-item tool-active is-collection "><a href="javascript:;" data-report-click="{&quot;mod&quot;:&quot;popu_824&quot;}"><svg class="icon" aria-hidden="true">
                        <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-csdnc-Collection-G"></use>
                    </svg><span class="name">收藏</span></a></li>
                    <li class="tool-item tool-active is-share"><a href="javascript:;"><svg class="icon" aria-hidden="true">
                        <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-csdnc-fenxiang"></use>
                    </svg>分享</a></li>
                    <!--打赏开始-->
                                            <!--打赏结束-->
                                            <li class="tool-item tool-more">
                        <a>
                        <svg t="1575545411852" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5717" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M179.176 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5718"></path><path d="M509.684 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5719"></path><path d="M846.175 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5720"></path></svg>
                        </a>
                        <ul class="more-box">
                            <li class="item"><a class="article-report">文章举报</a></li>
                        </ul>
                    </li>
                                        </ul>
            </div>
                        </div>
        <div class="person-messagebox">
            <div class="left-message"><a href="https://blog.csdn.net/qq_42646672">
                <img src="https://profile.csdnimg.cn/7/3/C/3_qq_42646672" class="avatar_pic" username="qq_42646672">
                                        <img src="https://g.csdnimg.cn/static/user-reg-year/2x/1.png" class="user-years">
                                </a></div>
            <div class="middle-message">
                                    <div class="title"><span class="tit"><a href="https://blog.csdn.net/qq_42646672" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;}" target="_blank">慕兴</a></span>
                                        </div>
                <div class="text"><span>发布了13 篇原创文章</span> · <span>获赞 30</span> · <span>访问量 2199</span></div>
            </div>
                            <div class="right-message">
                                        <a href="https://im.csdn.net/im/main.html?userName=qq_42646672" target="_blank" class="btn btn-sm btn-red-hollow bt-button personal-letter">私信
                    </a>
                                                        <a class="btn btn-sm  bt-button personal-watch" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;}">关注</a>
                                </div>
                        </div>
                </div>
</article>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值