MySQL常用操作

第1关:创建数据表并插入数据

任务描述

本关任务:创建emp表,并向表中插入数据。

相关知识

创建表结构CREATE TABLE

创建 MySQL 数据表需要以下信息:

表名

表字段名

定义每个表字段

以下为创建 MySQL 数据表的通用 SQL 语法:

CREATE TABLE table_name (

column_name1 column_type1,

column_name2 column_type2

);

MySQL数据类型

创建表之前我们需要了解创建数据的类型。MySQL 支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。

数值类型

数值数据类型严格包括这些类型:INTEGER、SMALLINT、DECIMAL和NUMERIC,以及近似数值数据类型:FLOAT、REAL和DOUBLE PRECISION。

注意:关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。

下面的表显示了需要的每个数值类型的存储和范围:

类型 大小 范围(有符号) 范围(无符号) 用途

TINYINT 1 字节 (-128,127) (0,255) 小整数值

SMALLINT 2 字节 (-32768,32767) (0,65535) 大整数值

MEDIUMINT 3 字节 (-8388608,8388607) (0,16777215) 大整数值

INT或INTEGER 4 字节 (-2147483648,2147483647) (0,4294967295) 大整数值

BIGINT 8 字节 (-9233372036854775808,9223372036854775807) (0,18446744073709551615) 极大整数值

FLOAT 4 字节 (-3.402823466E+38,-1.175494351E-38),0,(1.175494351E-38,3.402823466351E+38) 0,(1.175494351E-38,3.402823466E+38) 单精度浮点数值

DOUBLE 8 字节 (-1.7976931348623157E+308,-2.225073858507201 4E-308),0,(2.2250738585072014E-308,1.7976931348623157E+308) 0,(2.2250738585072014E-308,1.7976931348623157E+308) 双精度浮点数值

DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值

日期和时间类型

表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。

类型 字节 范围 格式

DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD

TIME 3 -838:59:59/838:59:59 HH:MM:SS

YEAR 1 1901/2155 YYYY

DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS

TIMESTAMP 4 1970-01-01 00:00:00/2037 年某时 YYYYMMDD HHMMS

字符串类型

字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。

类型 大小 范围

CHAR 0-255字节 定长字符串

VARCHAR 0-65535 字节 变长字符串

TINYBLOB 0-255字节 不超过 255 个字符的二进制字符串

TINYTEXT 0-255字节 短文本字符串

BLOB 0-65 535字节 二进制形式的长文本数据

TEXT 0-65 535字节 长文本数据

MEDIUMBLOB 0-16 777 215字节 二进制形式的中等长度文本数据

MEDIUMTEXT 0-16 777 215字节 中等长度文本数据

LONGBLOB 0-4 294 967 295字节 二进制形式的极大文本数据

LONGTEXT 0-4 294 967 295字节 极大文本数据

注意:CHAR和VARCHAR类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。

插入数据INSERT INTO

以下为向 MySQL 数据表插入数据通用的 SQL 语法:

INSERT INTO table_name (field1,field2,...,fieldN) VALUES (value1,value2,...,valueN);

如果数据是字符型,必须使用单引号或者双引号,如:"value" 或 'value'。

下面我们通过创建student表来演示:

CREATE TABLE student (

no INT(8) NOT NULL,

name CHAR(14),

age INT(2)

);

解析:

如果你不想字段为 NULL (空)可以设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为NULL,就会报错

命令终止符为分号(;)

创建字段时,类型后面需要加括号标注字段的长度,创建多个字段时用逗号隔开,注意最后一个字段不需要添加逗号(,)

我们再向student表中插入数据:

INSERT INTO student(no,name,age) VALUES (17010001,"zhangsan",22);

插入成功后会有如下提示,表示插入成功:

编程要求

在右侧编辑器中补充代码,创建雇员登记表,并插入数据。

雇员登记表emp结构如下:

字段名 类型 长度 能否为空(默认) 说明

empno INT 4 NOT NULL 雇员编号

ename CHAR 9 雇员名字

job CHAR 10 工种

mgr INT 4 经理编号

sal INT 7 工资

comm INT 7 联系方式

deptno INT 2 NOT NULL 部门编号

插入数据为:

empno ename job mgr sal comm deptno

1011 Elon cameraman 001 8000 18207471234 30

1111 Donny waiter 003 4000 18207475678 40

评测说明

平台会对你编写的代码进行测试,将输出你创建的表结构和表中你插入的数据,由于输出内容过长,请在右侧测试集中查看。

万事开头难,加油^-^

sql 复制代码
########### Begin ########## 
#创建emp表
CREATE TABLE emp(
    empno INT(4) NOT NULL,
    ename CHAR(9),
    job CHAR(10),
    mgr INT(4),
    sal INT(7),
    comm INT(7),
    deptno INT(2) NOT NULL
);
#向emp表中插入数据
INSERT INTO emp (empno, ename, job, mgr, sal, comm, deptno) values (1011, 'Elon', 'cameraman', 001, 8000, 18207471234, 30);
INSERT INTO emp (empno, ename, job, mgr, sal, comm, deptno) values (1111, 'Donny', 'waiter', 003, 4000, 18207475678, 40);

########### End ##########

第2关:删除、修改表中的数据

任务描述

本关任务:公司经常会因为人事变动需要我们对表中数据进行删除或修改,本关我们将对以上操作进行学习和实践。

相关知识

删除数据表

MySQL 中删除数据表是非常容易操作的,但是你在进行删除表操作时要非常小心,因为执行删除命令后所有数据都会消失。

以下为 删除表 的 SQL 如下:

DROP TABLE table_name;

若只要删除数据表中数据的 SQL 如下:

DELETE FROM table_name WHERE Clause;

如果没有指定 WHERE 子句,MySQL 表中的所有记录将被删除

你可以在 WHERE 子句中指定任何条件

您可以在单个表中一次性删除记录

修改数据表

如果我们需要修改或更新表中的数据,我们可以使用UPDATE命令来操作,以下是修改的 SQL语法:

UPDATE table_name SET field1=new-value1,field2=new-value2 WHERE Clause;

你可以同时更新一个或多个字段

你可以在 WHERE 子句中指定任何条件

你可以在一个单独表中同时更新数据

我们仍以student表为例,以下操作会将student更新name为zhangsan 的age字段值:

UPDATE student SET age=23 WHERE name='zhangsan';

编程要求

请在右侧编辑器中补充代码,我们已经在数据库中建立了雇员Elon和Donny的信息,已经在岗位上工作的Elon因为家庭原因离职,需要将他从数据表中删除,同时Donny因为部门调整需要将他的部门编号修改为20。

雇员登记表emp结构如下:

字段名 类型 长度 能否为空(默认) 说明

empno INT 4 NOT NULL 雇员编号

ename CHAR 9 雇员名字

job CHAR 10 工种

mgr INT 4 经理编号

sal INT 7 工资

comm INT 7 联系方式

deptno INT 2 NOT NULL 部门编号

评测说明

平台将对你编写的代码进行测试:

预期输出:

+-------+-------+--------+------+------+------------+--------+

| empno | ename | job | mgr | sal | comm | deptno |

+-------+-------+--------+------+------+------------+--------+

| 1111 | Donny | waiter | 3 | 4000 | 2147483647 | 20 |

+-------+-------+--------+------+------+------------+--------+

放纵是人的本性,而克制则是人的理智所在;理智是一种能力,更是一种胸怀,胸怀开阔才能包容万物,才能把整个宇宙抱在怀里。

克制住自己的杂念,别受外界干扰,继续加油!

sql 复制代码
########### Begin ########## 
#删除 Elon 的信息 
delete from emp where ename='Elon';

#修改 Donny 的信息
update emp set deptno=20 where ename='Donny';
########### End ########## 

第3关:简单查询语句

任务描述

本关任务:使用查询语句查看表中的信息。

相关知识

查询语句 SELECT

以下为查询表数据通用的 SQL 语法:

SELECT column_name1,column_name2 FROM table_name WHERE Clause OFFSET M LIMIT N;

查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件。

SELECT 命令可以读取一条或者多条记录。

你可以使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据

你可以通过 OFFSET 指定 SELECT 语句开始查询的数据偏移量。默认情况下偏移量为0。

你可以使用 LIMIT 属性来设定返回的记录数。

常用操作的介绍

WHERE

以下是SELECT语句使用 WHERE 子句从数据表中读取数据的通用语法:

SELECT field1, field2,...,fieldN FROM table_name1, table_name2... WHERE condition1 \[AND \[OR condition2...];

你可以使用 AND 或者 OR 指定一个或多个条件。

LIKE

打个比方,在表stdent里,有时候我们需要获取no字段含有"1"字符的所有记录,这时我们就需要在WHERE语句中使用LIKE子句。

LIKE子句中使用百分号%字符来表示任意字符。如果没有使用百分号%,LIKE子句与等号=的效果是一样的。

以下是SELECT语句使用LIKE子句从数据表中读取数据的通用语法:

SELECT field1, field2,...,fieldN FROM table_name WHERE field1 LIKE condition1 AND \[OR] filed2 = 'somevalue';

你可以在 WHERE 子句中使用LIKE子句。

你可以使用LIKE子句代替等号 =。

UNION

UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。

UNION 操作符语法格式如下:

SELECT expression1,expression2,...,expression_n FROM tables WHERE conditions

UNION ALL \| DISTINCT

SELECT expression1,expression2,...,expression_n FROM tablesWHERE conditions;

参数解释:

expression1, expression2, ... expression_n:检索的列,

tables:检索的数据表,

WHERE conditions:检索条件,

DISTINCT:删除结果集中重复的数据。

默认情况下 UNION 操作符已经删除了重复数据,所以 DISTINCT 修饰符对结果没啥影响。而ALL可以返回所有结果集,包含重复数据。

GROUP BY

GROUP BY语句根据一个或多个列对结果集进行分组。

在分组的列上我们可以使用 COUNT,SUM,AVG等函数,这些函数的含义非常简单,在这里不多做赘述。

SELECT column_name, function(column_name) FROM table_name WHERE

column_name operator value GROUP BY column_name;

OEDER BY

如果我们需要对读取的数据进行排序,我们就可以使用ORDER BY子句来设定你想按哪个字段哪种方式来进行排序,再返回搜索结果。

SELECT field1, field2,...,fieldN table_name1,table_name2..., ORDER BY

field1,field2... ASC \[DESC];

你可以设定多个字段来排序。

你可以使用 ASC (默认升序)或 DESC(降序) 关键字来设置查询结果是按升序或降序排列。

你可以添加 WHERE...LIKE 子句来设置条件。

我们仍通过student表的例子来让大家学习该语句的操作:

查询表中所有记录

SELECT no,name,age FROM student;

对学生年龄总和进行计算和统计

SELECT SUM(age) FROM student;

查询学号1701001学生的姓名

SELECT name FROM student WHERE no=1701001;

查询学号以1开头的学生学号、姓名

SELECT no,name FROM student WHERE no LIKE '1%';

将所有学号1开头学生按年龄的降序进行排序

SELECT name,age,no FROM student WHERE no LIKE '1%' ORDER BY age DESC;

编程要求

请在右侧编辑器中补充代码,完成以下查询操作:

查询在20号部门工作的雇员姓名和工资(返回的列包括雇员姓名、工资和编号);

使用LIKE查找以"s"开头的雇员姓名和所在部门编号;

按工资升序排列20号部门的雇员(返回包括雇员姓名、工资和编号);

查询所有部门中工资大于2800的雇员(返回包括雇员姓名、工资)。

下面为部门表dept和雇员表emp的源数据信息:

dept表结构信息:

deptno dname loc

10 research beijing

20 account chengdu

30 sales changsha

emp表结构信息:

empno ename job mgr sal comm deptno

1 zcq clerk 10 2000 100 20

2 lbh analyst 20 6000 200 10

3 hdy clerk 20 8000 300 20

4 ljz salesman 30 3000 400 30

5 ssr clerk 30 8000 500 30

评测说明

平台将对你编写的代码进行测试,将依次输出每个查询的结果,由于输出结果过多,请在测试集中进行查看。

一个人能快乐地独自做着有利于社会、他人的事,那是一位伟大的超人。一个人能快乐地独自做着有利于社会、他人的事,那是一位伟大的超人。老想着自己不幸福,幸福也会嫌弃你。

sql 复制代码
########### Begin ########## 

#查询在20号部门工作的雇员姓名和工资
select ename,sal,deptno from emp where deptno=20;

#查找以"s"开头的雇员姓名和所在部门编号
select ename,deptno from emp where  ename like 's%';

#按工资升序排列20号部门的雇员
select ename,sal,deptno from emp where deptno = 20 order by sal asc;

#查询所有部门中工资大于2800的雇员
select ename,sal from emp where sal > 2800;

########### End ########## 

第4关:深入学习查询语句

任务描述

在之前的学习中,我们已经对数据表进行简单的查询掌握得比较好了,能够应对基本的查询要求,但是,公司往往需要我们进行各种更复杂的查询,我们又该怎么做呢?

相关知识

更多操作的介绍

AS

查询可以使用AS关键字为查询的字段起一个别名:

SELECT CONCAT('last_name','first_name') AS full_name FROM mytable ORDER BY full_name;

CONCAT()函数用于将多个字符串连接成一个字符串,是最重要的 mysql 函数之一;

AS是可选的,如果你在查询字段之间忘记输入逗号,MySQL将把第二个字段作为第一个字段的别名。例如,在下面的 SQL 语句中columnb被视为columna的别名:

SELECT columna columnb FROM mytable;

出于这个原因,建议大家使用别名的时候加上as关键字,以免在编写 SQL 中给自己带来不便。

COUNT

count函数是用来统计表中或数组中记录数的,例如我们对下面的user表进行统计:

userno name password

1 name1 123456

2 name2 123456

3 name3 123456

4 name4 NULL

请注意以下查询的返回结果:

SELECT COUNT(*) FROM user;

SELECT COUNT(name) FROM user;

SELECT COUNT(password) FROM user;

输出结果:

4

4

3

输出结果分析:

COUNT(*)是对行数目进行计数,所以结果为4。

COUNT(column_name)是对列中不为空的行进行计数,所以COUNT(name)=4,而COUNT(password)=3。

HAVING

HAVING可以让我们筛选分组后的各种数据。

注意:WHERE在聚合前先筛选记录,也就是说作用在GROUP BY和HAVING前,而HAVING在聚合后对组记录进行筛选。

比如我们对下面的bbc表进行筛选:

loc populationg area region

1 100000 100000 a

2 100000 100000 b

... ... ... ...

查询每个地区的总人口数和总面积:

SELECT region,SUM(population),SUM(area) FROM bbc GROUP BY region;

先以region把返回记录分成多个组,这就是GROUP BY的字面含义。分完组后,然后用聚合函数对每组中的不同字段(一或多条记录)作运算。

查询每个地区的总人口数和总面积超过1000000的地区:

SELECT region, SUM(population), SUM(area)FROM bbc GROUP BY region HAVING SUM(area)>1000000;

在这里,我们不能用WHERE来筛选超过1000000的地区,因为表中不存在这样一条记录。相反,HAVING可以让我们筛选成组后的各组数据。

IN

IN 运算符用于 WHERE 表达式中,以列表项的形式支持多个选择,语法如下:

WHERE column IN (value1,value2,...)

WHERE column NOT IN (value1,value2,...)

当 IN 前面加上 NOT 运算符时,表示与 IN 相反的意思,即不在这些列表项内选择。

JOIN

JOIN按照功能大致分为如下三类:

INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。

LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。

RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。

编程要求

请在右侧编辑器中补充代码,完成以下查询操作:

使用IN查找工种是职员(clerk)或分析员(analyst)的雇员姓名和工种

查在编号为10的部门中哪些工种是编号为30的部门中没有的

查看工资高于3000的雇员的名字

下面为部门表dept和雇员表emp的源数据信息:

dept表结构信息:

deptno dname loc

10 research beijing

20 account chengdu

30 sales changsha

emp表结构信息:

empno ename job mgr sal comm deptno

1 zcq clerk 10 2000 100 20

2 lbh analyst 20 6000 200 10

3 hdy clerk 20 8000 300 20

4 ljz salesman 30 3000 400 30

5 ssr clerk 30 8000 500 30

评测说明

平台将对你编写的代码进行测试,将依次输出每个查询的结果,由于输出结果过多,请在测试集中进行查看。

人的思想是了不起的,只要专注于某一项事业,就一定会做出使自己感到吃惊的成绩来。

sql 复制代码
########### Begin ##########
##########  查询工种是职员或分析员的雇员姓名  ##########
SELECT ename, job
FROM emp
WHERE job IN ('clerk', 'analyst');

##########  查询在 10 号部门中哪些工种是 30 号部门中没有  ##########
SELECT DISTINCT job
FROM emp
WHERE deptno = 10
  AND job NOT IN (SELECT job FROM emp WHERE deptno = 30);

##########  查询工资高于3000的雇员信息  ##########
SELECT e.ename, e.sal, e.deptno, d.loc, d.dname
FROM emp e
JOIN dept d ON e.deptno = d.deptno
WHERE e.sal > 3000;
########### End ##########
相关推荐
其实防守也摸鱼2 小时前
Fastjson 反序列化漏洞(JNDI注入)
android·数据库·安全·oracle·自动化·fastjson·反序列化
haerapi2 小时前
把 PostgreSQL 复制巡检做成可审计闭环:确定性采集、阈值判定与受控模型归纳
数据库·postgresql
yolo_guo2 小时前
调试mysql延迟与libevent回调实际发送回复时机问题
c++·mysql·libevent
旺仔学长 哈哈2 小时前
springboot钓鱼爱好者交流平台APP设计与实现
java·spring boot·mysql·充电桩管理系统
微学AI3 小时前
不让每一步都调用最贵模型:用蓝耘智能路由改造自主式研究 Agent
数据库·人工智能·蓝耘
yjb.gz3 小时前
Oracle19 RAC查看集群状态及磁盘空间情况(巡检)
数据库
钝挫力PROGRAMER3 小时前
开发踩坑记:MyBatis selectKey、空 SQL
数据库·sql·mybatis
JosieBook3 小时前
【数据库】MySQL 实战精通系列 · 第6篇:InnoDB 存储引擎、日志与崩溃恢复
数据库·mysql
杨云龙UP4 小时前
TDengine 3.4.2.8 Community 三节点三副本生产集群部署实战(DNode/MNode/taosAdapter/Explorer)
大数据·linux·运维·数据库·tdengine·时序库