MySQL基础学习


前言

数据库(DataBase,DB):指长期保存在计算机存储设备上,按照一定规则组织起来,可以被各种用户或者应用共享的集合

数据库管理系统(DataBase Management System,DBMS):指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制。保证数据库的安全性和完整性,用户通过数据库管理系统访问数据库中的数据。

数据库分类:关系型数据库(sql),非关系型数据库(nosql)

  • 关系型数据库(sql)
    Oracal:Oracle公司的数据库产品
    MySQL:最早属于瑞典MysqlAB公司,后被Sun公司收购,最后被Oracle收购
    SQLServer:微软旗下数据库产品
    Access:IBM公司旗下数据库产品
  • 非关系型数据库(nosql)
    HBase是一个分布式、面向列的开源数据库
    MongoDB是一个基于分布式文件存储的数据库
    Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,提供多种语言的API

一、SQL概述

1.SQL

Structure Query Language。(结构化查询语言)

2.SQL的分类

DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列

DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据)

DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别

DQL(Data Query Language):数据查询语言,用来查询数据

二、SQL具体语法

1.DDL

定义:对数据库、表、列进行创建、修改、删除等操作

使用的关键字:CREATEALTERDROP

1.1 操作数据库

1.1.1 创建数据库
CREATE DATABASE db_name;
CREATE DATABASE db_name CHARACTER SET gbk;
CREATE DATABASE db_name CHARACTER SET gbk COLLATE gbk_chinese_ci;
1.1.2 查询数据库
-- 查看当前数据库服务器中的所有数据库
SHOW DATABASES;
-- 查看数据库的定义信息
SHOW CREATE DATABASE db_name;

-- 扩展
-- 查看数据库编码的具体信息
SHOW VARIABLES LIKE 'CHARACTER%';

-- 临时更改客户端和服务器结果集的编码
SET CHARACTER_SET_CLIENT = gbk;
SET CHARACTER_SET_RESULTS = gbk;
1.1.3 修改数据库
-- 修改数据库字符集
ALTER DATABASE db_name CHARACTER SET utf-8;
1.1.4 删除数据库
-- 删除数据库
DROP DATABASE db_name;
1.1.5 查看当前数据库
-- 查看当前使用的数据库
SELECT DATABASE();
1.1.6 切换数据库
-- 切换数据库
USE db_name;
1.1.7 操作数据库

语法

CREATE TABLE 表名(
	字段1 字段类型,
	字段2 字段类型,
	...
	字段n 字段类型
);

常用数据类型

int:整型 
double:浮点型,例如double(5,2)表示最多5位,其中必须有2位小数,即最大值为999.99; 
char:固定长度字符串类型; 
varchar:可变长度字符串类型;
text:字符串类型; 
blob:字节类型; 
date:日期类型,格式为:yyyy-MM-dd; 
time:时间类型,格式为:hh:mm:ss timestamp:
时间戳类型 yyyy-MM-dd hh:mm:ss 会自动赋值 
datetime:日期时间类型 yyyy-MM-dd hh:mm:ss 
boolean:mysql不支持,oracle支持

常用表操作

-- 查看当前使用的数据库下的所有表
SHOW TABLES;

-- 查看表的字段信息
DESC table_name;

-- 在表上添加一列属性
ALTER TABLE table_name ADD 列名 属性;

-- 修改表的某一列属性
ALTER TABLE table_name MODIFY 列名 属性;

-- 删除某列,一次只能删除一列
ALTER TABLE table_name DROP 列名;

-- 修改表名
RENAME TABLE table_name TO table_name1;

-- 查看表的创建细节
SHOW CREATE TABLE table_name;

-- 修改表的字符集为gbk
ALTER TABLE table_name CHARACTER SET gbk;

-- 修改列名
ALTER TABLE 列名1 CHANGE NAME 列名2 类型;

-- 备份表结构和表数据
CREATE TABLE table_name2 AS SELECT * FROM table_1;

-- 备份表结构
CREATE TABLE table_name2 LIKE table_name1;

-- 删除表
DROP TABLE table_name;

2.DML

DML是对表中的数据进行增加、删除、修改的操作。其操作对象是数据。与DDL不同。

使用关键词:INSERTUPDATEDELETE

注意:在mysql中,字符串类型和日期类型都需要使用单引号括起来空值用null表示

2.1 插入操作

语法

-- 插入操作语法
INSERT INTO 表名(列名1,列名2...)
	VALUES(列值1,列值2...);

注意:列名与列值的类型、个数、顺序要一一对应,列值不能超过列定义的长度。如果插入空值,需要使用null,插入日期时需要使用单引号括起来。

2.1.1 三种数据插入方式
-- 第一种 
INSERT INTO table_name(列名1,列名2..)
VALUES(列值1,列值2....)

-- 第二种 插入多条数据 注:不是标准SQL语法,只能在MySQL中使用
INSERT INTO table_name(列名1,列名2...)
VALUES(列值1,列值2...)(列值1,列值2...)
	  ...--示例
INSERT INTO address(AddressId,PersonId,City,State) VALUES
(3,1,'jc','ss'),
(4,1,'ss','xx');

-- 第三种 将已有表中的数据插入到新表中
INSERT INTO table_new SELECT * FROM table_old;

注意:

  • mysql不支持select into
  • 复制时是按照列的顺序依次进行
  • 新表的列和原来表的列的名字、类型都可以是不一样的,也可以复制成功。但是会出现数据转换错误。

2.2 修改操作

语法

-- 修改操作语法
-- where后是修改的条件,条件满足则修改;条件不满足则不修改
UPDATE 表名 SET 列名1=列值1,列名2=列值2... WHERE 列名=列值

2.3 删除操作

语法

-- 使用delete删除操作语法
-- where后是删除条件,条件满足则删除;条件不满足则不删除
-- 如果不加where判断条件,则是将整个表删除
DELETE FROM 表名 WHERE 列名=;

-- 使用truncate删除表记录
TRUNCATE TABLE 表名;
2.3.1 truncate和delete的区别

使用delete删除表的数据后,表结构还在,删除后的数据可以找回
truncate删除是直接把表给删掉,然后再创建一张同样表结构的新表。使用truncate删除的数据不能被找回。
但是使用truncate删除的执行效率要比delete高。

3.DQL

DQL数据查询语言

数据库执行DQL语句不会对数据进行改变,而是让数据库发送符合查询条件的结果集给客户端。查询返回的结果集是一张虚拟表

3.1 语法

-- DQL语句语法
SELECT 列名 FROM 表名
[WHERE ... GROUP BY ... HAVING ... ORDER BY ... LIMIT]

-- 语法子句说明
SELECT 列名列表 -- 要查询的列名称序列
FROM 表名列表 -- 从哪些表中进行查询
WHERE 条件 -- 查询条件
GROUP BY 列名 -- 对结果进行分组
HAVING 条件 -- 分组后的行条件
ORDER BY 列名 -- 对结果进行排序
LIMIT 起始行号,行数 -- 对结果进行限定

3.2 基础查询

查询所有列

SELECT * FROM table_name;

查询指定列

SELECT 列名1,列名2... FROM table_name;

3.3 条件查询

条件查询就是在查询时加上where子句。

where子句中可以使用以下运算符及关键字:=、!=、<>、<、<=、>、>=;BETWEEN…AND;IN(set);IS NULL;AND;OR;NOT;XOR(逻辑异或);

-- 代码示例
SELECT * FROM table_name WHERE ...

3.4 模糊查询

在想查询的目标数据中需要包含某些特定的字符的时候,需要使用到模糊查询。例如在查询名字的时候需要包含a字母的时候。

使用关键字:LIKE

通配符:%_

  • %:表示任意0-n个字符
  • _:表示任意个字符

模糊查询必须使用LIKE关键字,其中_和%分别表示匹配一个和多个字符。

3.4.1 正则表达式

MySQL支持正则表达式的匹配,使用REGEXP操作符来进行正则表达式匹配

模式      描述 
^       匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。 

$       匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。 
.        匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模 式。

[...]    字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。 

[^...]   负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。 

p1|p2|p3  匹配 p1 或 p2 或 p3。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。 
*         匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。 
+         匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等 价于 {1,}。 
{n}       n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。 
{n,m}     m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。

3.5 字段控制查询

3.5.1 去除重复查询

使用关键字DISTINCT

SELECT DISTINCT sal FROM table_name		
3.5.2 加运算

如果两列都是数值类型那么可以进行加操作,如果有一列不是数值类型,那么会报错

SELECT 列名1+列名2 FROM table_name;
3.5.3 将null进行转换

列中有很多记录都是null,因为任何东西和null相加结果都是null。所以计算结果可能会出现null。这时我们可以把null转换为数值0然后再进行运算。

-- 将null转换为数值0 再运算
SELECT *,列名1+IFNULL(列名2,0FROM table_name;
3.5.4 给列名加别名

将查询出来的列重命名

-- 将列1和列2相加的值命名为列3
SELECT 列名1+列名2 AS 列名3 FROM table_name;

-- 其中AS关键字是可以省略的
SELECT 列名1+列名2 列名3 FROM table_name;

3.6 排序

3.6.1 升序

关键字:ASC

-- 将查询出来的结果按照列1升序排列
SELECT * FROM table_name ORDER BY 列名1 ASC;

-- 不写ASC的时候默认升序
SELECT * FROM table_name ORDER BY 列名1;
3.6.2 降序

关键字:DESC

-- 将查询出来的结果按照列1降序排列
SELECT * FROM table_name ORDER BY 列名1 DESC;
3.6.3 多条件排序
-- 将查询出来的结果按照列1降序排列,列2升序排序
SELECT * FROM table_name ORDER BY 列名1 DESC,列名2 ASC;

3.7 聚合函数

常用聚合函数有sumavgmaxmincount

聚合函数是用来做纵向运算的函数

sum():计算指定列最大值;如果不是数值类型,结果为0

avg():计算指定列平均值;如果不是数值类型,结果为0

max():计算指定列最大值;如果为字符串类型,那么使用字符串排序运算

min():计算指定列最小值;如果为字符串类型,那么使用字符串排序运算

count():统计指定列不为null的记录行数

-- 示例
-- 查询表中的总薪水、平均薪水、最大薪水和最小薪水的值
SELECT sum(salary),avg(salary),max(salary),min(salary) FROM employee;
-- 查询表中共有多少条记录
SELECT COUNT(*) FROM employee;

3.8 分组查询

使用GROUP BY子句

注意:只要和聚合函数同时出现的列名,一定要写在group by子句之后

3.8.1 HAVING子句
-- having子句示例
-- 查询部门薪水总和大于2000的部门id和薪水总和
SELECT empid, SUM(salary) FROM employee GROUP BY empid HAVING SUM(salary) > 2000;
3.8.2 HAVING和WHERE的区别
  1. having是在分组后对数据进行过滤,where是在分组前对数据进行过滤
  2. having后面可以使用分组函数(统计函数),where后面不可以使用分组函数
  3. where是对分组前记录的条件,如果某行记录没有满足where子句的条件,那么这行记录不会参加分组;而having是对分组后数据的约束

3.9 LIMIT

limit用来限定查询结果的起始行,以及总行数

-- 查询5行记录,从0行开始
-- 起始行从0开始,也就是第一行为0
SELECT * FROM table_name LIMIT 0,5;

-- 查询10行记录,从3开始
SELECT * FROM table_name LIMIT 3,10;

3.9.1 分页查询
  1. 定义currentPage记录当前页数,并赋值1
  2. 定义count记录每页显示的记录行数,赋值5(可变)
  3. 那么使用LIMIT((currentPage-1)*count,count)就能实现分页查询

三 其他

  • 查询语句书写顺序
    select-from-where-group by-having-order by-limit
  • 查询语句执行顺序
    from-where-group by-having-select-order by-limit

总结

以上就是MySQL基础部分,仅仅简单介绍了DDL、DML、DQL的基础语法与使用。


有什么错误的地方,欢迎大家留言指正。也欢迎大家一起交流学习!注各位学习进步!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mercury_春秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值