基础知识

  • 基础知识
    • 数据库中的数据类型
      • 整数类型
      • 浮点类型
      • 字符类型
      • 日期类型
    • 数据库中的约束条件
      • 主键约束
        • 添加主键约束
        • 自动增长类型
        • 删除主键约束
      • 外键约束
        • 添加外键约束
        • 删除外键约束
      • 唯一约束
        • 添加唯一约束
        • 删除唯一约束
      • 非空约束
        • 添加非空约束
        • 删除非空约束
      • 检查约束
    • 数据库的创建和删除
    • 表的创建删除和修改
    • 数据库中的数据操作
      • 添加数据
      • 默认处理
      • 更新数据
      • 删除数据
    • 数据库中的查询操作
      • 基本查询
      • 算数表达
      • 使用别名
      • 去除重复
      • 比较查询
      • 逻辑条件
      • 数据排序
      • 查询练习
    • 数据库中的函数操作
      • 函数介绍
      • 单行函数
        • 字符函数
        • 数字函数
        • 日期函数
        • 转换函数
        • 通用函数
        • 单行函数练习
      • 多表查询
        • 等值连接(简单连接)(内连接)
        • 非等值连接

基础知识

数据库中的数据类型

整数类型

数据类型 含义
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);

自动增长类型

  1. 一个表中只能有一个列为自动增长
  2. 自动增长的列的类型必须是整数类型
  3. 自动增长只能添加到具备主键约束与唯一性约束的列上
  4. 删除主键约束或唯一性约束,如果该列拥有自动增长能力,则需要先去掉自动增长然后在删除约束
//将 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 函数有输入参数,并且总有一个返回值

单行函数

单行函数仅对单个行进行运算,并且每行返回一个结果

常见的函数类型:

  1. 字符
  2. 数字
  3. 日期
  4. 转换
  5. 通用

字符函数

函数 描述
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 列的值必须相等

等值连接特点:

  1. 多表等值连接的结果为多表的交集部分;
  2. n表连接,至少需要n-1个连接条件;
  3. 多表不分主次,没有顺序要求;
  4. 一般为表起别名,提高阅读性和性能;
  5. 可以搭配排序、分组、筛选….等子句使用
示例一:查询雇员 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)(基础知识)相关推荐

  1. MySQL工作中的实际用_总结工作中经常用到的mysql基础知识

    总结工作中经常用到的mysql基础知识 发布时间:2020-06-08 11:27:30 来源:51CTO 阅读:217 作者:三月 本文主要给大家介绍工作中经常用到的mysql基础知识,文章内容都是 ...

  2. mysql基础知识(二)

    这一篇是第二部分,要查看第一部分,请查看这个链接 mysql基础知识(一) DQL语言 1.1简单的单表查询 查询表的通用格式:select [distinct] [*] [列名1,列名] from ...

  3. mysql基础知识(一)

    mysql是主流的关系型数据库管理系统(RDBMS---relation database management system),操作是需要用SQL(Structured Query Language ...

  4. MySQL基础知识-MySQL概述安装,单表增删改查,函数,约束,多表查询,事物

    MySQL基础知识-MySQL概述安装,单表增删改查,函数,约束,多表查询,事物 前言 1.MySQL概述 1.1数据库相关概念 1.2MySQL数据库 1.2.1版本 1.2.2下载 1.2.3安装 ...

  5. 【MySQL基础知识】查询、过滤数据关键字

    MySQL基础知识 一.检索数据 1. SELECT select是使用最广泛的检索数据的语句. 检索要查的表的所有列: select * from (表名称)... 检索要查的表的某一列或多列: s ...

  6. 快速学习mysql_快速学习MySQL基础知识

    这篇文章主要梳理了 SQL 的基础用法,会涉及到以下方面内容: SQL大小写的规范 数据库的类型以及适用场景 SELECT 的执行过程 WHERE 使用规范 MySQL 中常见函数 子查询分类 如何选 ...

  7. MySQL基础知识之增删改查

    MySQL基础知识之增删改查 MySQL基本语法: 1.创建库:create database 库名: 创建带编码格式的库:create database 库名 character set 编码格式: ...

  8. linux增删查改语句,mysql基础知识之增删查改使用介绍

    mysql基础知识之增删查改使用介绍 本文主要介绍mysql常用的SELECT.INSERT.UPDATE.DELETE语句的使用,数据库的安装这里不做介绍,并且事先已经准备好相关数据. 本文中使用的 ...

  9. MySql基础知识【一】

    Mysql基础知识 1. MySql是什么 2. 数据库设计的三大范式 2.1. 第一范式 2.2. 第二范式 2.3. 第三范式 3. Binlog的三种模式 3.1 Statement模式(默认) ...

  10. 2.MySQL 基础知识

    文章目录 MySQL 基础知识 知识点一 : MySQL命令行常用命令 知识点二 : 持久化 相关概念 知识点三 : 数据库 相关概念 知识点四 : DB 和 DBMS 关系图示 知识点五 : MyS ...

最新文章

  1. 是什么岗位_文案策划的岗位职责是什么?
  2. Java 批量插入数据到数据库(MySQL)中
  3. python调用什么函数实现对文件内容的读取_python读取文本文件数据
  4. redis做几十万待办列表_用待办规划我的一天 | 指南 x 待办清单
  5. java单链表上的选择排序_《Java数据结构和算法》简单排序选择排序
  6. 从sql2016导出数据库到sql2014
  7. 转:jwgkvsq.vmx手工清除方法(针对病毒变种补充完整)
  8. 婚纱摄影后期修片,PS婚纱写真后期…
  9. 反激式开关电源设计_变压器选型
  10. 本科论文发表的难度大吗
  11. CTO们接着吼:创业公司几乎全是坑!
  12. 宋楚老师银行风险与合规讲师
  13. 【java】企业微信机器人消息推送
  14. IOS 插屏广告弹窗
  15. SASS实现颜色卡动画
  16. 奥迪坚技术革新带动信用卡呼叫中心管理升级
  17. 基于 ocr 的屏幕文字识别 开源
  18. 单独使用Element图片预览功能
  19. 从事嵌入式行业年薪有多少,你和高薪究竟差了哪些东西?
  20. 2022年制冷与空调设备运行操作考试模拟100题及答案

热门文章

  1. Xshell 常见使用
  2. 题目 1566: 贪吃的大嘴
  3. 抽象单例:一种通用的单例
  4. 【设计模式】的C语言的设计模式及其应用
  5. SQL server删除表信息代码
  6. 中国脂肪填充奶粉(FFMP)市场趋势报告、技术动态创新及市场预测
  7. 【SpringBoot】SpringBoot+Zookeeper+Dubbo整合
  8. 编译器工具链(二)——交叉编译
  9. 智慧城市指挥调度系统软件解决方案
  10. guice使用方法(1)