MySQL在我们工作中都会用到,那么我们最常接触的就是增删改查,而对于增删改查来说,我们更多的是查询。但是面试中,面试官又不会问你什么查询是怎么写的,都是问一些索引啊,事务啊, 底层结构这些东西,所以我打算分四篇去逐一的过一遍MySQL的知识点。
以下为四篇的传送门,有需要直接点击进入,目前还在建设当中,可以关注作者或专栏,持续更新,永不收费。

| 篇章 | 地址 |
|---|---|
| DDL查询篇 | 传送门 |
| MySQL函数及视图、存储过程 | – |
| MySQL索引及优化 | – |
| MySQL事务及架构 | – |
文章目录
我们在工作中写的最多的是查询语句,像数据库和数据表可能组内大佬已经给建好了,我们一般不会进行改动,所以一些基本的DDL语言我们不是很熟悉,再此还是复习一下吧~
| 类型 | 数据变量 |
|---|---|
| 整数类型 | TINYINT、SMALLINT、MEDIUMINT、INT(或INTEGER)、BIGINT |
| 浮点类型 | FLOAT、DOUBLE |
| 定点数类型 | DECIMAL |
| 位类型 | BIT |
| 日期时间类型 | YEAR、TIME、DATE、DATETIME、TIMESTAMP |
| 文本字符串类型 | CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT |
| 枚举类型 | ENUM |
| 集合类型 | SET |
| 二进制字符串类型 | BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB |
| JSON类型 | JSON对象、JSON数组 |
| 空间数据类型 | 单值:GEOMETRY、POINT、LINESTRING、POLYGON; 集合:MULTIPOINT、MULTILINESTRING、MULTIPOLYGON、 GEOMETRYCOLLECTION |
CREATE DATABASE test; # 最简单的方式
CREATE DATABASE test2 CHARACTER SET 'gbk'; # 指定字符集
CREATE DATABASE IF NOT EXISTS test3 CHARACTER SET 'gbk'; # 避免sql报错并指定字符集
USE test; # 使用数据库test
SHOW DATABASES; # 查看当前所有的数据库
SELECT DATABASE(); # 查看当前正在使用的数据库
SHOW TABLES FROM test; # 查看当前使用的数据库中的所有表
SHOW CREATE DATABASE test; # 查看数据库的创建信息
ALTER DATABASE test CHARACTER SET 'utf8'; # 更改数据库test的字符集为utf8
注意:DATABASE 不能改名。一些可视化工具可以改名,它是建新库,把所有表复制到新库,再删 旧库完成的。
DROP DATABASE IF EXISTS test; # 删除数据库test,不要做删库跑路的事哦
# 1.这是很基础的创建表
CREATE TABLE IF NOT EXISTS employees(
id INT,
`name` VARCHAR(15),
`hire_date` DATE,
`salary` DOUBLE(10,2)
);
# 2.类似克隆表,不要数据
CREATE TABLE employees_back AS SELECT * FROM employees WHERE 1=2;
# 3.工作中标准的表创建(可以使用作为模板)
CREATE TABLE IF NOT EXISTS `role` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(32) NOT NULL DEFAULT '' COMMENT '角色名称',
`desc` varchar(32) NOT NULL DEFAULT '' COMMENT '角色描述',
`status` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb3 COMMENT='用户角色表';
# 4.查看数据表结构
SHOW CREATE TABLE `role`;
# 1.给数据表添加字段
ALTER TABLE employees_back ADD status TINYINT;
# 2.添加字段并指定其位置
ALTER TABLE employees_back ADD age TINYINT AFTER department_id;
# 3.修改status字段设默认值
ALTER TABLE employees_back MODIFY status TINYINT DEFAULT(1);
# 4.删除字段
ALTER TABLE employees_back DROP COLUMN sex;
# 5.重命名字段
ALTER TABLE employees_back CHANGE age sex VARCHAR(2);
# 6.重命名数据表
RENAME TABLE employees_back TO employees1;
DROP TABLE employees_back; # 删除数据表
TRUNCATE TABLE employees_back; # 清空数据表
INSERT INTO empl VALUES(1,'Tom','2022-12-06',4500); # 插入一条数据
INSERT INTO empl VALUES(3,'Scott','2022-12-10',12000),(4,'Alex','2022-12-10',6500); # 插入多条数据
INSERT INTO empl(id,hire_date,salary,`name`) VALUES(2,'2022-12-07',4500,'Kate'); # 插入指定字段数据
INSERT INTO empl (SELECT employee_id,last_name,hire_date,salary FROM employees WHERE department_id IN (70,60)) # 以查询结果作为插入数据
UPDATE empl SET id = 5 WHERE id = 103;
UPDATE empl SET id = 6,hire_date = '2022-12-23',salary = 4500 WHERE id = 104;
DELETE FROM empl WHERE id = 111; # 删除id是111的数据
面试题:DELETE和TRUNCATE有什么区别?
相同点:都可以对数据进行删除,保留数据表结构
不同点:TRUNCATE一旦操作,表数据全部清除,并且不能回滚。DELETE可以删除部分数据,可以回滚
对于我们程序员来说,写的最多的就是查询,比较重要,内容也比较多,所以单拉出来记录。
SELECT 字段1,字段2,... FROM 表名 *表示所有字段
SELECT * FROM employees; # 查询employees表所有数据
SELECT * FROM `ORDER`; # 当表名与保留字重复时,可以使用着重号
SELECT '哈哈哈',employee_id FROM employees; # 查询常数
SELECT DISTINCT department_id FROM employees; # 去除重复department_id
SELECT employee_id as empId FROM employees; # as起别名,也可以省略as
SELECT * FROM employees WEHRE emp_id = 1; # 查询emp_id是1的员工
SELECT last_name,salary,department_id
FROM employees
WHERE department_id IN(10,20,30)
SELECT employee_id ,last_name,salary
FROM employees
WHERE salary BETWEEN 6000 AND 8000
SELECT last_name FROM employees WHERE last_name LIKE '%a%'; # 查询名字中包含a的
SELECT last_name FROM employees WHERE last_name LIKE '_a%'; #查询第二个字符是a的
SELECT last_name FROM employees WHERE last_name LIKE '_\_a%'; # 转义字符 查询第二个字符是_并且第三个字符是a的
SELECT * FROM employees ORDER BY salary DESC; # 按照工资从大到小排序
SELECT * FROM employees ORDER BY salary ASC; # 按照工资从小到大排序
# (pageNum-1)* pageSize,pageSize
SELECT employee_id,last_name FROM employees LIMIT 0,20; # 每页显示20条,当前是第一页
SELECT employee_id,last_name FROM employees LIMIT 20,20; # 每页显示20条,当前是第二页
如果条件没有相等的,就不会显示出来(从sql优化的角度考虑,多表查询时都指明所在的表)

SELECT employee_id,department_name
FROM employees JOIN departments
ON employees.department_id = departments.department_id;
# 两个表在连接过程中除了返回满足连接条件的行以外,还返回在左表中不满足条件的行
SELECT employee_id,department_name
FROM employees LEFT JOIN departments
ON employees.department_id = departments.department_id;
# 两个表在连接过程中除了返回满足链接条件的行以外,还返回在右表中不满足条件的行
SELECT employee_id,department_name
FROM employees RIGHT JOIN departments
ON employees.department_id = departments.department_id;
SELECT employee_id,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL;
SELECT employee_id,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE e.`department_id` IS NULL;
# UNION 和 UNION ALL ,UNION是去重后的,UNION ALL是两个结果的并集,但是一般用后者,因为sql优化
SELECT employee_id,department_name
FROM employees LEFT JOIN departments
ON employees.department_id = departments.department_id
WHERE departments.department_id IS NULL
UNION ALL
SELECT employee_id,department_name
FROM employees RIGHT JOIN departments
ON employees.department_id = departments.department_id
SELECT employee_id,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL
UNION ALL
SELECT employee_id,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE e.`department_id` IS NULL;
# 自动查询两张表中所有相同的字段,然后进行等值连接
SELECT e.employee_id,e.last_name,d.department_name
FROM employees e NATURAL JOIN departments d
利用UNION关键字,可以给出多条SELECT语句,并将它们的结果组合成单个结果集。合并时,两个表对应的列数和数据类型必须相同,并且相互对应。各个SELECT语句之间使用UNION或UNION ALL关键字分隔。
SELECT id,cname FROM t_chinamale WHERE csex='男'
UNION ALL
SELECT id,tname FROM t_usmale WHERE tGender='male';
UNION操作符
UNION 操作符返回两个查询的结果集的并集,去除重复记录。
UNION ALL操作符
UNION ALL操作符返回两个查询的结果集的并集。对于两个结果集的重复部分,不去重。
注意:执行UNION ALL语句时所需要的资源比UNION语句少。如果明确知道合并数据后的结果数据不存在重复数据,或者不需要去除重复的数据,则尽量使用UNION ALL语句,以提高数据查询的效率。
✨ 原创不易,还希望各位大佬支持一下 \textcolor{blue}{原创不易,还希望各位大佬支持一下} 原创不易,还希望各位大佬支持一下
👍 点赞,你的认可是我创作的动力! \textcolor{green}{点赞,你的认可是我创作的动力!} 点赞,你的认可是我创作的动力!
⭐️ 收藏,你的青睐是我努力的方向! \textcolor{green}{收藏,你的青睐是我努力的方向!} 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富! \textcolor{green}{评论,你的意见是我进步的财富!} 评论,你的意见是我进步的财富!
我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.
我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co
1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,
Ⅰ软件测试基础一、软件测试基础理论1、软件测试的必要性所有的产品或者服务上线都需要测试2、测试的发展过程3、什么是软件测试找bug,发现缺陷4、测试的定义使用人工或自动的手段来运行或者测试某个系统的过程。目的在于检测它是否满足规定的需求。弄清预期结果和实际结果的差别。5、测试的目的以最小的人力、物力和时间找出软件中潜在的错误和缺陷6、测试的原则28原则:20%的主要功能要重点测(eg:支付宝的支付功能,其他功能都是次要的)80%的错误存在于20%的代码中7、测试标准8、测试的基本要求功能测试性能测试安全性测试兼容性测试易用性测试外观界面测试可靠性测试二、质量模型衡量一个优秀软件的维度①功能性功
ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear
我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时
我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin
我在Rails上使用带有ruby的solr。一切正常,我只需要知道是否有任何现有代码来清理用户输入,比如以?开头的查询。或* 最佳答案 我不知道执行此操作的任何代码,但理论上可以通过查看parsingcodeinLucene来完成并搜索thrownewParseException(只有16个匹配!)。在实践中,我认为您最好只捕获代码中的任何solr异常并显示“无效查询”消息或类似信息。编辑:这里有几个“sanitizer”:http://pivotallabs.com/users/zach/blog/articles/937-s
我正在为锦标赛开发一个Rails应用程序。我在这个查询中使用了三个模型:classPlayertruehas_and_belongs_to_many:tournamentsclassTournament:destroyclassPlayerMatch"Player",:foreign_key=>"player_one"belongs_to:player_two,:class_name=>"Player",:foreign_key=>"player_two"在tournaments_controller的显示操作中,我调用以下查询:Tournament.where(:id=>params