第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 ##########