前言
数据库(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
定义:对数据库、表、列进行创建、修改、删除等操作
使用的关键字:CREATE、ALTER、DROP
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不同。
使用关键词:INSERT、UPDATE、DELETE
注意:在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,0) FROM 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 聚合函数
常用聚合函数有sum,avg,max,min,count
聚合函数是用来做纵向运算的函数
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的区别
- having是在分组后对数据进行过滤,where是在分组前对数据进行过滤
- having后面可以使用分组函数(统计函数),where后面不可以使用分组函数
- 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 分页查询
- 定义currentPage记录当前页数,并赋值1
- 定义count记录每页显示的记录行数,赋值5(可变)
- 那么使用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的基础语法与使用。
有什么错误的地方,欢迎大家留言指正。也欢迎大家一起交流学习!注各位学习进步!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/116592.html