Chapter(MySQL)(基础知识)
基础知识
- 基础知识
- 数据库中的数据类型
- 整数类型
- 浮点类型
- 字符类型
- 日期类型
- 数据库中的约束条件
- 主键约束
- 添加主键约束
- 自动增长类型
- 删除主键约束
- 外键约束
- 添加外键约束
- 删除外键约束
- 唯一约束
- 添加唯一约束
- 删除唯一约束
- 非空约束
- 添加非空约束
- 删除非空约束
- 检查约束
- 数据库的创建和删除
- 表的创建删除和修改
- 数据库中的数据操作
- 添加数据
- 默认处理
- 更新数据
- 删除数据
- 数据库中的查询操作
- 基本查询
- 算数表达
- 使用别名
- 去除重复
- 比较查询
- 逻辑条件
- 数据排序
- 查询练习
- 数据库中的函数操作
- 函数介绍
- 单行函数
- 字符函数
- 数字函数
- 日期函数
- 转换函数
- 通用函数
- 单行函数练习
- 多表查询
- 等值连接(简单连接)(内连接)
- 非等值连接
基础知识
数据库中的数据类型
整数类型
数据类型 | 含义 |
---|---|
tinyint(m) | 1个字节 范围(-128~127) |
smallint(m) | 2个字节 范围(-32768~32767) |
mediumint(m) | 3个字节 范围(-8388608~8388607) |
int(m) | 4个字节 范围(-2147483648~2147483647) |
bigint(m) | 8个字节 范围(±9.22*10的18次方) |
数值类型中的长度 m 是指显示长度,并不表示存储长度,只有字段指定 zerofill 时有用
例如: int(3),如果实际值是2,如果列指定了zerofill,查询结果就是002,左边用0来填充
浮点类型
数据类型 | 含义 |
---|---|
float(m,d) | 单精度浮点型 8位精度(4字节) m总个数,d小数位 |
double(m,d) | 双精度浮点型 16位精度(8字节) m总个数,d小数位 |
float(5,3) 表示 563.24
字符类型
数据类型 | 含义 |
---|---|
char(n) | 固定长度,最多255个字符 |
tinytext | 可变长度,最多255个字符 |
varchar(n) | 可变长度,最多65535个字符 |
text | 可变长度,最多65535个字符 |
mediumtext | 可变长度,最多2的24次方-1个字符 |
longtext | 可变长度,最多2的32次方-1个字符 |
最常用的是 char 和 varchar
char:长度固定, 即每条数据占用等长字节空间;适合用在身份证号码、手机号码等定长
varchar:可变长度,可以设置最大长度;适合用在长度可变的属性
text:不设置长度, 当不知道属性的最大长度时,比如一段描述,就适合用
按照查询速度: char最快, varchar次之,text最慢
日期类型
数据类型 | 含义 |
---|---|
date | 日期 YYYY-MM-DD |
time | 时间 HH:MM:SS |
datetime | 日期时间 YYYY-MM-DD HH:MM:SS |
timestamp | 时间戳YYYYMMDD HHMMSS |
数据库中的约束条件
数据库约束是对表中的数据进行进一步的限制,保证数据的正确性、有效性和完整性
主键约束
主键约束是使用最频繁的约束。在设计数据表时,一般情况下,都会要求表中设置一个主键
主键是表的一个特殊字段,该字段能唯一标识该表中的每条信息
例如,学生信息表中的学号是唯一的
添加主键约束
单一主键
使用一个列作为主键列,当该列的值有重复时,则违反唯一约束
联合主键
使用多个列作为主键列,当多个列的值都相同时,则违反唯一约束
//将 emp 表中的 employee_id 修改为主键
alter table emp add primary key(employee_id);//设置联合主键
alter table emp add primary key(name, name);
自动增长类型
- 一个表中只能有一个列为自动增长
- 自动增长的列的类型必须是整数类型
- 自动增长只能添加到具备主键约束与唯一性约束的列上
- 删除主键约束或唯一性约束,如果该列拥有自动增长能力,则需要先去掉自动增长然后在删除约束
//将 emp 表中的 employee_id 主键修改为自增
alter table emp modify employee_id int auto_increment;
删除主键约束
//删除主键时,如果主键列具备自动增长能力,需要先去掉自动增长,然后在删除主键//去掉自动增长
alter table emp modify employee_id int;//删除主键约束
alter table emp drop primary key;
外键约束
外键约束经常和主键约束一起使用,用来确保数据的一致性
一个表的外键关联的必须是另一个表的主键
外键可以为空或重复
添加外键约束
//向 emp 表中的 dept_id 列添加外键约束 emp_fk是约束名
alter table emp add constraint emp_fk foreign key(dept_id) references departments(department_id);
删除外键约束
//删除 dept_id 的外键约束
alter table emp drop foreign key emp_fk;
唯一约束
唯一约束与主键约束有一个相似的地方,就是它们都能够确保列的唯一性
与主键约束不同的是唯一约束在一个表中可以有多个,并且设置唯一约束的列是允许有空值的
添加唯一约束
//向 emp 表中的 name 添加唯一约束 emp_uk是约束名
alter table emp add constraint emp_uk unique(name);
删除唯一约束
//删除 emp 表中 name 的唯一约束
alter table emp drop key emp_uk;
非空约束
非空约束用来约束表中的字段不能为空
添加非空约束
//向 emp 表中的 salary 添加非空约束
alter table emp modify salary float(8,2) not NULL;
删除非空约束
//删除 emp 表中 salary 的非空约束 NULL表示可以为空
alter table emp modify salary float(8,2) NULL;
检查约束
检查约束也叫用户自定义约束,是用来检查数据表中,字段值是否有效的一个手段,但目前 MySQL 数据库不支持检查约束
数据库的创建和删除
//查看数据库
show databases;//创建数据库
create database `name` default character set 'utf8';//删除数据库
drop database `name`;//选择数据库
use `name`;
表的创建删除和修改
//查看表
show tables;//创建表
create table employees(employee_id int,employee_name varchar(10),salary float(8,2));//删除表
drop table employees;//修改表名 将 employees 表名修改为 emp
alter table employees rename emp;//修改列名 将 emp 表中的 employee_name 修改为 new_name
alter table emp change column employee_name new_name varchar(20);//修改列类型 将 emp 表中的 name 的长度指定为 40
alter table emp modify name varchar(40);//添加列 在 emp 表中添加佣金列 列名为 commission_pct
alter table emp add column commission_pct float(4,2);//删除列 删除 emp 表中的 commission_pct
alter table emp drop column commission_pct;
数据库中的数据操作
添加数据
//(选择插入)向 departments 表中添加一条数据,部门名称为 market 工作地点 ID 为 1
insert into departments(department_name,location_id) values("market", 1);//(完全插入)向 departments 表中添加一条数据,部门名称为 development,工作地点 ID 为 2,使用 default 占位
insert into departments values(default,"development",2);注意:完全插入中如果主键是自动增长,需要使用 default 或者 null 或者 0 占位
默认处理
在 MySQL 中可以使用 default 为列设定一个默认值。如果在插入数据时并未指定该列的值,那么 MySQL 会将默认值添加到该列中
//创建 emp 表,该表包含 emp_id 主键且自动增长,包含 name,包含 address 该列默认值为”未知”
create table emp(emp_id int primary key auto_increment,name varchar(10),address varchar(50) default "Unknown");//修改表添加新列并指定默认值
//修改 emp 表,添加job_id 该列默认值为 0
alter table emp add column job_id int default 0;//向 emp 表中添加数据,要求 address 列与 job_id 列使用默认值作为该列的值
//方式一
insert into emp(name) values("admin");
//方式二
insert into emp values(default,"admin",default,default);
更新数据
更新语句中一定要给定更新条件,否则表中的所有数据都会被更新
//更新 emp 表中的 id 为 1 的数据,添加 address 为 BeiJing (where关键字很重要)
update emp set address = "BeiJing" where emp_id = 1;
删除数据
在删除语句中,如果没有给定删除条件则会删除表中的所有数据
truncate 是整体删除(速度较快), delete 是逐条删除(速度较慢);
truncate 不写服务器 log,delete 写服务器 log,也就是 truncate 效率比 delete 高的原因;
truncate 是会重置自增值,相当于自增列会被置为初始值,又重新从 1 开始记录,而不是接着原来的值。而 delete 删除以后, 自增值仍然会继续累加
//删除 emp 表中 emp_id 为 1 的雇员信息
delete from emp where emp_id = 1;//删除 emp 表中的所有数据
truncate table emp;
数据库中的查询操作
列选择:能够使用 SELECT 语句的列选择功能选择表中的列,这些列是想要用查询返回的。当查询时,能够返回列中的数据
行选择:能够使用 SELECT 语句的行选择功能选择表中的行,这些行是想要用查询返回的。能够使用不同的标准限制看见的行
连接:能够使用 SELECT 语句的连接功能来集合数据,这些数据被存储在不同的表中,在它们之间可以创建连接,查询出我们所关心的数据
语句 | 含义 |
---|---|
SELECT | 是一个或多个字段的列表 |
* | 选择所有的列 |
DISTINCT | 禁止重复 |
column | expression |
alias | 给所选择的列不同的标题 |
FROM table | FROM table 指定包含列的表 |
基本查询
//查询 departments 表中的所有数据(列选择)
select * from departments;//查询 departments 表中所有部门名称(列选择)
select department_name from departments;//查询 departments 表中部门 ID 为 90 的部门名称与工作地点 ID(行选择)where表示行选择
select department_name, location_id from departments where department_id = 4;
算数表达
//查询雇员的年薪,并显示他们的雇员ID,名字
select employee_id,last_name, 12 * salary from employees;//计算 employees 表中的员工全年薪水加 100 以后的薪水是多少,并显示他们的员工ID与名字
select employee_id,last_name, 12 * salary + 100 from employees;//计算 employees 表中的员工薪水加 100 以后的全年薪水是多少,并显示他们的员工ID与名字
select employee_id,last_name, 12 * (salary + 100) from employees;
使用别名
//使用列别名:查询 employees 表将雇员 last_name 列定义别名为 name
select last_name as name from employees; //as 是可以省略的//使用表别名:查询 employees 表为表定义别名为emp,将雇员 last_name 列定义别名为 name
select emp.last_name name from employees emp;
去除重复
//查询 employees 表,显示唯一的部门 ID
select distinct department_id from employees;
比较查询
运算 | 含义 |
---|---|
= | 等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
!= | 不等于 |
between…and | 在两个值之间(包含) |
in | 匹配一个任意值列表 |
like | 匹配一个字符模板 |
is null | 是一个空值 |
//查询 employees 表中员工薪水大于等于 3000 的员工的姓名与薪水
select last_name, salary from employees where salary >= 3000;//查询 employees 表中员工薪水不等于 5000 的员工的姓名与薪水
select last_name, salary from employees where salary != 5000;//查询 employees 表,薪水在 3000-8000 之间的雇员ID、名字与薪水
select employee_id, last_name, salary from employees where salary between 3000 and 8000;//查询 employees 表,找出薪水是 5000,6000,8000 的雇员ID、名字与薪水
select employee_id, last_name, salary from employees where salary in(5000, 6000, 8000);//查询 employees 中雇员名字第二个字母是 e 的雇员名字
select last_name from employees where last_name like '_e%';//找出 emloyees 表中那些没有佣金的雇员雇员ID、名字与佣金
select employee_id, last_name, commission_pct from employees where commission_pct is null;//找出 employees 表中那些有佣金的雇员ID、名字与佣金
select employee_id, last_name, commission_pct from employees where commission_pct is not null;
逻辑条件
运算 | 含义 |
---|---|
and | 如果两个组成的条件都为真,返回True |
or | 如果两个组成的条件任意一个为真,返回True |
not | 如果跟随的条件为假,返回True |
//查询 employees 表中雇员薪水是 8000 的并且名字中含有e 的雇员名字与薪水
select last_name, salary from employees where salary = 8000 and last_name like '%e%';//查询 employees 表中雇员薪水是 8000 的或者名字中含有e 的雇员名字与薪水
select last_name, salary from employees where salary = 8000 or last_name like '%e%';//查询 employees 表中雇员名字中不包含 u 的雇员的名字
select last_name from employees where last_name not like '%u%';
数据排序
//查询 employees 表中的所有雇员,显示他们的ID、名字与薪水,并按薪水升序排序
select employee_id, last_name, salary from employees order by salary;select employee_id, last_name, salary from employees order by salary asc;//查询 employees 表中的所有雇员,显示他们的ID与名字,并按雇员名字降序排序
select employee_id, last_name from employees order by last_name desc;//显示雇员ID,名字。计算雇员的年薪,年薪列别名为annsal,并对该列进行升序排序
select employee_id, last_name, 12 * salary annsal from employees order by annsal;//以升叙排序显示 DEPARTMENT_ID 列,同时以降序排序显示 SALARY 列(先排后面在排前面,因为前面的重要些)
select department_id, salary from employees order by department_id asc, salary desc;
查询练习
//查询收入超过 12,000 的雇员的名字和薪水
select LAST_NAME, SALARY from employees WHERE SALARY > 12000;//创建一个查询,显示雇员号为 176 的雇员的名字和部门号
SELECT LAST_NAME, DEPARTMENT_ID from employees where EMPLOYEE_ID = 176;//显示所有薪水不在 5000 和 12000 之间的雇员的名字和薪水
select LAST_NAME, SALARY from employees where salary not BETWEEN 5000 and 12000;//显示所有在部门 20 和 50 中的雇员的名字和部门号,并以名字按字母顺序排序
SELECT LAST_NAME, DEPARTMENT_ID FROM employees WHERE DEPARTMENT_ID IN (20,50) ORDER BY LAST_NAME asc;//列出收入在 5,000 和 12,000 之间,并且在部门 20 或50 工作的雇员的名字和薪水。将列标题分别显示为 Employee 和 Monthly Salary
SELECT LAST_NAME Employee, SALARY "Monthly Salary" FROM employees WHERE SALARY BETWEEN 5000 and 12000 AND DEPARTMENT_ID in(20,50);//显示所有没有主管经理的雇员的名字和工作岗位
SELECT LAST_NAME, JOB_ID FROM employees WHERE MANAGER_ID is null;//显示所有有佣金的雇员的名字、薪水和佣金。以薪水和佣金的降序排序数据
SELECT LAST_NAME, SALARY, COMMISSION_PCT from employees where COMMISSION_PCT is not NULL ORDER BY SALARY DESC, COMMISSION_PCT desc;//显示所有名字中有一个 a 和一个 e 的雇员的名字
SELECT LAST_NAME from employees where LAST_NAME LIKE "%a%" AND LAST_NAME LIKE "%e%";//显示所有工作岗位是销售代表(SA_REP)或者普通职员(ST_CLERK),并且薪水不等于 2500、3500 或 7000 的雇员的名字、工作岗位和薪水
SELECT LAST_NAME, JOB_ID, SALARY from employees WHERE JOB_ID in('SA_REP','ST_CLIERK') AND SALARY not IN(2500,3500,7000);
数据库中的函数操作
函数介绍
SQL 函数有输入参数,并且总有一个返回值
单行函数
单行函数仅对单个行进行运算,并且每行返回一个结果
常见的函数类型:
- 字符
- 数字
- 日期
- 转换
- 通用
字符函数
函数 | 描述 |
---|---|
LOWER(s) | LCASE(s) | 将字符串 s 转换为小写 |
UPPER(s) | UCASE(s) | 将字符串 s 转换为大写 |
LENGTH(s) | 返回字符串 s 的长度 |
CONCAT(s1,s2…sn) | 字符串 s1,s2 等多个字符串合 并为一个字符串 |
LPAD(s1,len,s2) | 在字符串 s1 的开始处填充字 符串 s2,使字符串长度达到 len |
LTRIM(s) | 去掉字符串 s 开始处的空格 |
REPLACE(s,s1,s2) | 将字符串 s2 替代字符串 s 中 的字符串 s1 |
REVERSE(s) | 将字符串s的顺序反过来 |
RPAD(s1,len,s2) | 在字符串 s1 的结尾处添加字 符串 s2,使字符串的长度达 到 len |
RTRIM(s) | 去掉字符串 s 结尾处的空格 |
SUBSTR(s, start, length) | 从字符串 s 的 start 位置截取 长度为 length 的子字符串 |
SUBSTRING(s, start, length) | 从字符串 s 的 start 位置截取 长度为 length 的子字符串 |
TRIM(s) | 去掉字符串 s 开始和结尾处的 空格 |
# 显示雇员 Davies 的雇员号、姓名和部门号,将姓名转换为大写
select employee_id, UPPER(last_name), department_id from employees where last_name = 'davies';# 显示所有工作岗位名称从第 4 个字符位置开始,包含字符串 REP 的雇员的ID信息
# 将雇员的姓和名连接显示在一起,还显示雇员名的的长度,以及名字中字母 a 的位置
SELECT employee_id, CONCAT(last_name, first_name) NAME, job_id, LENGTH(last_name), INSTR(last_name, 'a') "Contains 'a'?" FROM employees WHERE SUBSTR(job_id, 4) = 'REP';
数字函数
函数 | 描述 |
---|---|
ABS(x) | 返回 x 的绝对值 |
ACOS(x) | 求 x 的反余弦值(参数是弧度) |
ASIN(x) | 求反正弦值(参数是弧度) |
ATAN(x) | 求反正切值(参数是弧度) |
ATAN2(n, m) | 求反正切值(参数是弧度) |
AVG(expression) | 返回一个表达式的平均值, expression 是一个字段 |
CEIL(x) | 返回大于或等于 x 的最小整数 |
CEILING(x) | 返回大于或等于 x 的最小整数 |
COS(x) | 求余弦值(参数是弧度) |
COT(x) | 求余切值(参数是弧度) |
COUNT(expression) | 返回查询的记录总数, expression 参数是一个字段或 者 * 号 |
DEGREES(x) | 将弧度转换为角度 |
n DIV m | 整除,n 为被除数,m 为除数 |
EXP(x) | 返回 e 的 x 次方 |
FLOOR(x) | 返回小于或等于 x 的最大整数 |
GREATEST(expr1, expr2, expr3, …) | 返回列表中的最大值 |
LEAST(expr1, expr2, expr3, …) | 返回列表中的最小值 |
LN | 返回数字的自然对数,以 e 为 底 |
LOG(x) 或 LOG(base, x) | 返回自然对数(以 e 为底的对数),如果有 base 参数,则 base 为指定带底数 |
LOG10(x) | 返回以 10 为底的对数 |
LOG2(x) | 返回以 2 为底的对数 |
MAX(expression) | 返回字段 expression 中的最 大值 |
MIN(expression) | 返回字段 expression 中的最 小值 |
MOD(x,y) | 返回 x 除以 y 以后的余数 |
PI() | 返回圆周率(3.141593) |
POW(x,y) | 返回 x 的 y 次方 |
POWER(x,y) | 返回 x 的 y 次方 |
RADIANS(x) | 将角度转换为弧度 |
RAND() | 返回 0 到 1 的随机数 |
ROUND(x) | 返回离 x 最近的整数 |
SIGN(x) | 返回 x 的符号,x 是负数、 0、正数分别返回 -1、0 和 1 |
SIN(x) | 求正弦值(参数是弧度) |
SQRT(x) | 返回x的平方根 |
SUM(expression) | 返回指定字段的总和 |
TAN(x) | 求正切值(参数是弧度) |
TRUNCATE(x,y) | 返回数值 x 保留到小数点后 y 位的值(与 ROUND 最大的区 别是不会进行四舍五入) |
# ROUND 函数四舍五入列、表达式或者 n 位小数的值。如果第二个
# 参数是 0 或者缺少,值被四舍五入为整数。如果第二个参数是 2 值
# 被四舍五入为两位小数。如果第二个参数是–2,值被四舍五入到小数点左边两位
SELECT ROUND(45.923,2), ROUND(45.923,0), ROUND(45.923,-1);# TRUNCATE 函数的作用类似于 ROUND 函数。如果第二个参数是 0或者缺少
# 值被截断为整数。如果第二个参数是 2,值被截断为两位小数
# 如果第二个参数是 –2,值被截断到小数点左边两位。与 ROUND 最大的区别是不会进行四舍五入
SELECT TRUNCATE(45.923,2);# MOD 函数找出 m 除以 n 的余数
# 所有 job_id 是 SA_REP 的雇员的名字,薪水以及薪水被 5000 除后的余数
SELECT last_name, salary, MOD(salary, 5000) FROM employees WHERE job_id = 'SA_REP';
日期函数
在MySQL中允许直接使用字符串表示日期,但是要求字符串的日期格式必须为:‘YYYY-MM-DD HH:MI:SS’ 或者‘YYYY/MM/DD HH:MI:SS’
函数 | 描述 |
---|---|
CURDATE() | 返回当前日期 |
CURTIME() | 返回当前时间 |
CURRENT_DATE() | 返回当前日期 |
CURRENT_TIME() | 返回当前时间 |
DATE() | 从日期或日期时间表达式中提取日期值 |
DATEDIFF(d1,d2) | 计算日期 d1->d2 之间相隔的天数 |
DAY(d) | 返回日期值 d 的日期部分 |
DAYNAME(d) | 返回日期 d 是星期几,如 Monday,Tuesday |
DAYOFMONTH(d) | 计算日期 d 是本月的第几天 |
DAYOFWEEK(d) | 日期 d 今天是星期几,1 星期日,2 星期 一,以此类推 |
DAYOFYEAR(d) | 计算日期 d 是本年的第几天 |
HOUR(t) | 返回 t 中的小时值 |
LAST_DAY(d) | 返回给给定日期的那一月份的最后一天 |
MONTHNAME(d) | 返回日期当中的月份名称,如 November |
MONTH(d) | 返回日期d中的月份值,1 到 12 |
NOW() | 返回当前日期和时间 |
SECOND(t) | 返回 t 中的秒钟值 |
SYSDATE() | 返回当前日期和时间 |
TIMEDIFF(time1, time2) | 计算时间差值 |
TO_DAYS(d) | 计算日期 d 距离 0000 年 1 月 1 日的天数 |
WEEK(d) | 计算日期 d 是本年的第几个星期,范围是 0 到 53 |
WEEKDAY(d) | 日期 d 是星期几,0 表示星期一,1 表示星 期二 |
WEEKOFYEAR(d) | 计算日期 d 是本年的第几个星期,范围是 0 到 53 |
YEAR(d) | 返回年份 |
# 向 employees 表中添加一条数据
# 雇员ID:300,名字:kevin,email:kevin@sxt.cn ,入职时间:2049-5-1 8:30:30
# 工作部门:‘IT_PROG’
insert into employees(EMPLOYEE_ID, last_name, email, HIRE_DATE, JOB_ID) values(300,'kevin','kevin@sxt.cn','2049-5-18:30:30','IT_PROG');# 显示所有在部门 90 中的雇员的名字和从业的周数。雇员的总工作时间以周计算,用当前日期 (SYSDATE) 减去雇员的受顾日期,再除以 7
SELECT last_name, (SYSDATE()-hire_date)/7 AS WEEKS FROM employees WHERE department_id = 90;
转换函数
隐式数据类型转换是指MySQL服务器能够自动地进行类型转换。如:可以将标准格式的字串日期自动转换为日期类型
显示数据类型转换是指需要依赖转换函数来完成相关类型的转换
# 向 employees 表中添加一条数据,雇员ID:400,名字:oldlu ,email:oldlu@sxt.cn ,# 入职时间:2049 年 5 月 5 日,工作部门:‘IT_PROG’
insert into employees(EMPLOYEE_ID, last_name, email, HIRE_DATE, JOB_ID) values(400,'oldlu','oldlu@sxt.cn',STR_TO_DATE('2049年5月5日', '%Y年%m月%d日'), 'IT_PROG');# 查询 employees 表中雇员名字为 King 的雇员的入职日期,要求显示格式为 yyyy 年 MM 月 dd 日
select DATE_FORMAT(hire_date, '%Y年%m月%d日') from employees where last_name = 'King';
通用函数
函数 | 描述 |
---|---|
IF(expr,v1,v2) | 如果表达式 expr 成立,返回结果 v1;否 则,返回结果 v2 |
IFNULL(v1,v2) | 如果 v1 的值不为 NULL,则返回 v1,否则返 回 v2 |
ISNULL(expression) | 判断表达式是否为 NULL |
NULLIF(expr1, expr2) | 比较两个参数是否相同,如果相等 返回 NULL,否则返回 expr1 |
COALESCE(expr1, expr2, …, expr_n) | 返回参数中的第一个非空表达式(从左向右) |
# 查询部门编号是50或者80的员工信息,包含他们的名字、薪水、佣金。在income列中,如果有佣金则显示‘SAL+COMM’,无佣金则显示'SAL'
SELECT last_name, salary, commission_pct, if(ISNULL(commission_pct),'SAL','SAL+COMM') income FROM employees WHERE department_id IN (50, 80);# 计算雇员的年报酬,你需要用 12 乘以月薪,再加上它的佣金 (等于年薪乘以佣金百分比)
SELECT last_name, salary, IFNULL(commission_pct, 0), (salary*12) + (salary*12*IFNULL(commission_pct, 0)) AN_SAL FROM employees;# 查询员工表,显示他们的名字、名字的长度该列名为expr1,姓氏、姓氏的长度该列名为expr2。在result列中,如果名字与姓氏的长度相同则显示空,如果不相同则显示名字长度
SELECT first_name, LENGTH(first_name) "expr1", last_name, LENGTH(last_name) "expr2", NULLIF(LENGTH(first_name), LENGTH(last_name)) result FROM employees;# 查询员工表,显示他们的名字,如果 COMMISSION_PCT 值是非空,显示它
# 如果COMMISSION_PCT 值是空,则显示 SALARY
# 如果 COMMISSION_PCT 和SALARY 值都是空,那么显示 10。在结果中对佣金列升序排序
SELECT last_name, COALESCE(commission_pct, salary, 10) comm FROM employees ORDER BY commission_pct;# 查询员工表,如果 JOB_ID 是 IT_PROG,薪水增加 10%;如果 JOB_ID 是 ST_CLERK,薪水增加 15%
# 如果 JOB_ID 是 SA_REP,薪水增加 20%。对于所有其他的工作角色,不增加薪水
SELECT last_name, job_id, salary, CASE job_id WHEN 'IT_PROG' THEN 1.10*salary WHEN 'ST_CLERK' THEN 1.15*salary WHEN 'SA_REP' THEN 1.20*salary ELSE salary END "REVISED_SALARY" FROM employees;
单行函数练习
# 显示受雇日期在 1998 年 2 月 20 日 和 2005 年 5 月 1 日 之间的雇员的名字、岗位和受雇日期。按受雇日期顺序排序查询结果
SELECT LAST_NAME,JOB_ID,HIRE_DATE FROM employees WHERE HIRE_DATE BETWEEN '1998-2-20' AND '2005-5-1' order by HIRE_DATE;# 显示每一个在 2002 年受雇的雇员的名字和受雇日期
select LAST_NAME,HIRE_DATE FROM employees where HIRE_DATE like '2002%';# 对每一个雇员,显示 employee number、last_name、salary 和 salary 增加 15%,并且表示成整数,列标签显示为 New Salary
SELECT EMPLOYEE_ID,LAST_NAME,SALARY, ROUND(SALARY *1.15,0) FROM employees;# 写一个查询,显示名字的长度,对所有名字开始字母是 J、A 或 M 的雇员。用雇员的 last name排序结果
SELECT LAST_NAME, LENGTH(LAST_NAME) FROM employees WHERE LAST_NAME LIKE 'J%' OR LAST_NAME LIKE 'A%' OR LAST_NAME LIKE 'M%' ORDER BY LAST_NAME;# 创建一个查询显示所有雇员的 last name 和 salary。将薪水格式化为 15 个字符长度,用 $ 左填充
SELECT LAST_NAME,LPAD(SALARY, 15, '$') FROM employees;# 创建一个查询显示雇员的 last names 和 commission (佣金) 比率。如果雇员没有佣金,显示 “No Commission”,列标签 COMM
SELECT LAST_NAME,IFNULL(COMMISSION_PCT,'No Commission') COMM FROM employees;# 写一个查询,按照下面的数据显示所有雇员的基于 JOB_ID 列值的级别
SELECT JOB_ID, CASE JOB_ID WHEN 'AD_PRES' THEN 'A' WHEN 'ST_MAN' THEN 'B' WHEN 'IT_PROG' THEN 'C' WHEN 'SA_REP' THEN 'D' WHEN 'ST_CLERK' THEN 'E' ELSE 0 END FROM employees;
多表查询
等值连接(简单连接)(内连接)
等值连接:为了确定一个雇员的部门名,需要比较 EMPLOYEES 表中的 DEPARTMENT_ID 列与DEPARTMENTS 表中的 DEPARTMENT_ID 列的值。在 EMPLOYEES 和DEPARTMENTS 表之间的关系是一个相等 (equijoin) 关系,即,两 个 表 中DEPARTMENT_ID 列的值必须相等
等值连接特点:
- 多表等值连接的结果为多表的交集部分;
- n表连接,至少需要n-1个连接条件;
- 多表不分主次,没有顺序要求;
- 一般为表起别名,提高阅读性和性能;
- 可以搭配排序、分组、筛选….等子句使用
示例一:查询雇员 King 所在的部门名称
select d.department_name from employees e, departments d where e. = d.department_id and e.last_name = 'King';示例二:显示每个雇员的 last name、departmentname 和 city
SELECT e.last_name, d.department_name, l.city FROM employees e, departments d, locations l WHERE e.department_id = d.department_id AND d.location_id = l.location_id;
非等值连接
非等值连接:一个非等值连接是一种不同于等值操作的连接条件。 EMPLOYEES 表 和JOB_GRADES A 表之间的关系有一个非等值连接例子。在两个表之间的关系是EMPLOYEES 表中的 SALARY 列必须是 JOB_GRADES 表的 LOWEST_SALARY 和HIGHEST_SALARY 列之间的值。使用不同于等于 (=) 的操作符获得关系
查询所有雇员的薪水级别
select e.last_name,j.grade_level from employees e ,job_grades j where e.salary between j.lowest_sal and j.highest_sal;
Chapter(MySQL)(基础知识)相关推荐
- MySQL工作中的实际用_总结工作中经常用到的mysql基础知识
总结工作中经常用到的mysql基础知识 发布时间:2020-06-08 11:27:30 来源:51CTO 阅读:217 作者:三月 本文主要给大家介绍工作中经常用到的mysql基础知识,文章内容都是 ...
- mysql基础知识(二)
这一篇是第二部分,要查看第一部分,请查看这个链接 mysql基础知识(一) DQL语言 1.1简单的单表查询 查询表的通用格式:select [distinct] [*] [列名1,列名] from ...
- mysql基础知识(一)
mysql是主流的关系型数据库管理系统(RDBMS---relation database management system),操作是需要用SQL(Structured Query Language ...
- MySQL基础知识-MySQL概述安装,单表增删改查,函数,约束,多表查询,事物
MySQL基础知识-MySQL概述安装,单表增删改查,函数,约束,多表查询,事物 前言 1.MySQL概述 1.1数据库相关概念 1.2MySQL数据库 1.2.1版本 1.2.2下载 1.2.3安装 ...
- 【MySQL基础知识】查询、过滤数据关键字
MySQL基础知识 一.检索数据 1. SELECT select是使用最广泛的检索数据的语句. 检索要查的表的所有列: select * from (表名称)... 检索要查的表的某一列或多列: s ...
- 快速学习mysql_快速学习MySQL基础知识
这篇文章主要梳理了 SQL 的基础用法,会涉及到以下方面内容: SQL大小写的规范 数据库的类型以及适用场景 SELECT 的执行过程 WHERE 使用规范 MySQL 中常见函数 子查询分类 如何选 ...
- MySQL基础知识之增删改查
MySQL基础知识之增删改查 MySQL基本语法: 1.创建库:create database 库名: 创建带编码格式的库:create database 库名 character set 编码格式: ...
- linux增删查改语句,mysql基础知识之增删查改使用介绍
mysql基础知识之增删查改使用介绍 本文主要介绍mysql常用的SELECT.INSERT.UPDATE.DELETE语句的使用,数据库的安装这里不做介绍,并且事先已经准备好相关数据. 本文中使用的 ...
- MySql基础知识【一】
Mysql基础知识 1. MySql是什么 2. 数据库设计的三大范式 2.1. 第一范式 2.2. 第二范式 2.3. 第三范式 3. Binlog的三种模式 3.1 Statement模式(默认) ...
- 2.MySQL 基础知识
文章目录 MySQL 基础知识 知识点一 : MySQL命令行常用命令 知识点二 : 持久化 相关概念 知识点三 : 数据库 相关概念 知识点四 : DB 和 DBMS 关系图示 知识点五 : MyS ...
最新文章
- 是什么岗位_文案策划的岗位职责是什么?
- Java 批量插入数据到数据库(MySQL)中
- python调用什么函数实现对文件内容的读取_python读取文本文件数据
- redis做几十万待办列表_用待办规划我的一天 | 指南 x 待办清单
- java单链表上的选择排序_《Java数据结构和算法》简单排序选择排序
- 从sql2016导出数据库到sql2014
- 转:jwgkvsq.vmx手工清除方法(针对病毒变种补充完整)
- 婚纱摄影后期修片,PS婚纱写真后期…
- 反激式开关电源设计_变压器选型
- 本科论文发表的难度大吗
- CTO们接着吼:创业公司几乎全是坑!
- 宋楚老师银行风险与合规讲师
- 【java】企业微信机器人消息推送
- IOS 插屏广告弹窗
- SASS实现颜色卡动画
- 奥迪坚技术革新带动信用卡呼叫中心管理升级
- 基于 ocr 的屏幕文字识别 开源
- 单独使用Element图片预览功能
- 从事嵌入式行业年薪有多少,你和高薪究竟差了哪些东西?
- 2022年制冷与空调设备运行操作考试模拟100题及答案