创建一个数据库,然后在对象浏览器区,右键->执行SQL脚本->找到文件,打开->点击执行
关系结构数据库是以表格(Table)进行数据存储,表格由行和列组成
语法:SELECT 列名 FROM 表名
关键字 描述
SELECT 指定要查询的列
FROM 指定要查询的表
语法:SELECT * FROM 表名;
或 SELECT 所有列名称 FROM 表名;
#查询t_employees表中所有员工的所有信息
SELECT * FROM t_employees;
SELECT 所有的列名 FROM t_employees;
语法:SELECT 部分列名称 FROM 表名;
#查询表中的所有员工的编号、姓氏、邮箱
SELECT EMPLOYEE_ID,FIRST_NAME,Email FROM t_employees;
#查询表中所有员工的编号、部门编号
SELECT EMPLOYEE_ID,DEPARTMENT_ID FROM t_employees;
语法:SELECT 要计算列名 FROM 表名;
#查询员工表中所有员工的编号、姓名、年薪
SELECT EMPLOYEE_ID,FIRST_NAME,LAST_NAME,SALARY * 13 FROM t_employees;
算术运算符 | 描述 |
---|---|
+ | 列与列之间做加法运算 |
- | 列与列之间做减法运算 |
* | 列与列之间做乘法运算 |
/ | 列与列之间做除法运算 |
语法:SELECT 列名称 AS ‘列的别名’;
#查询员工表中所有员工的编号、姓名、日薪(列的运算 / 22),列名均为中文
SELECT EMPLOYEE_ID AS '编号',FIRST_NAME AS '姓',LAST_NAME AS '名',SALARY / 22 AS'日薪' FROM t_employees;
#起别名,没有对原表的列名发生影响
语法:SELECT DISTINCT 列名 FROM表名;
#查询员工表中,所有经理的ID编号
SELECT DISTINCT MANAGER_ID AS '经理编号' FROM t_employees;
#查询员工表中,所有的工资 (去掉重复的)
SELECT DISTINCT SALARY FROM t_employees;
语法: SELECT 列名 FROM 表名 ORDER BY 排序列名 [排序规则]
排序规则 | 描述 |
---|---|
ASC | 做升序排序 |
DESC | 做降序排序 |
语法:
SELECT 列名1, 列名2, 列名3 FROM 表名 ORDER BY 列名1 ASC;//升序
SELECT 列名1, 列名2, 列名3 FROM 表名 ORDER BY 列名2 DESC;//降序
#查询员工的编号,名字,薪资,按照工资进行升序排序
SELECT EMPLOYEE_ID,FIRST_NAME,salary FROM t_employees ORDER BY salary ASC;
#查询员工的编号,名字,薪资,按照姓名进行升序排序
SELECT EMPLOYEE_ID,FIRST_NAME,salary FROM t_employees ORDER BY FIRST_NAME ASC;
#查询员工的编号,名字,薪资,按照工资进行降序排序
SELECT EMPLOYEE_ID,FIRST_NAME,salary FROM t_employees ORDER BY salary DESC;
语法:
#若列名1相等,按照列名2降序排序
SELECT 列名1, 列名2, 列名3 FROM 表名 ORDER BY 列名1 ASC,列名2 DESC;
#查询员工编号,名字,薪资,按照工资进行升序排序,如果工资相等,按照编号降序排序
SELECT EMPLOYEE_ID,FIRST_NAME,SALARY FROM t_employees
ORDER BY SALARY ASC,EMPLOYEE_ID DESC
#查询员工编号,名字,薪资,按照工资进行升序排序,如果工资相等,按照姓名降序排序
SELECT EMPLOYEE_ID,FIRST_NAME,SALARY FROM t_employees
ORDER BY SALARY ASC,FIRST_NAME DESC
语法: SELECT 列名 FROM 表名 WHERE 条件
关键字 | 描述 |
---|---|
WHERE | 在查询结果中,筛选符合条件的查询结果。条件为布尔表达式 |
语法:SELECT 列名 FROM 表名 WHERE 列名=条件;
#查询工资为2500的员工信息
SELECT EMPLOYEE_ID,FIRST_NAME,SALARY FROM t_employees WHERE salary = 2500;
#查询姓为Steven的
SELECT EMPLOYEE_ID,FIRST_NAME,SALARY FROM t_employees WHERE FIRST_NAME='Steven';
语法:SELECT 列名 FROM 表名 WHERE 列名!=条件(<>同理);
#查询员工工资大于6000的员工的信息
SELECT EMPLOYEE_ID,FIRST_NAME,salary FROM t_employees WHERE salary>=6000;
#查询员工工资不等于2500的员工信息
SELECT EMPLOYEE_ID,FIRST_NAME,salary FROM t_employees WHERE salary<>2500;(!=同理)
语法:
#满足条件1和满足条件2,条件1和条件2互换后结果不变。
SELECT 列名 FROM 表名 WHERE 列名=条件1 AND 列名=条件2;
#先满足条件1再满足条件2,条件1和条件2互换后结果会变化。
SELECT 列名 FROM 表名 WHERE 列名=条件1 OR 列名=条件2;
SELECT 列名 FROM 表名 WHERE NOT 列名=条件;
#查询员工工资在6000~10000的员工信息
SELECT EMPLOYEE_ID,FIRST_NAME,salary FROM t_employees
WHERE salary>=6000 AND salary<=10000;
#查询工资是10000的或者是9000的员工信息
SELECT EMPLOYEE_ID,FIRST_NAME,salary FROM t_employees
WHERE salary =10000 OR salary = 9000;
#查询除了工资是10000的员工信息
SELECT EMPLOYEE_ID,FIRST_NAME,salary FROM t_employees
WHERE NOT salary =10000;
语法:
#区间判断 包含区间边界的两个值
SELECT 列名 FROM 表名 WHERE 列名 BETWEEN 条件1 AND 条件2;
SELECT EMPLOYEE_ID,FIRST_NAME,salary FROM t_employees
WHERE salary BETWEEN 6000 AND 10000;
语法:
SELECT 列名 FROM 表名 WHERE 列名 IS NULL;
SELECT 列名 FROM 表名 WHERE 列名 IS NOT NULL;
- IS NULL
- 列名 IS NULL
- IS NOT NULL
- 列名 IS NOT NULL
#查询出 没有经理编号的员工 IS NULL
SELECT EMPLOYEE_ID,FIRST_NAME,MANAGER_ID FROM t_employees WHERE MANAGER_ID IS NULL;
#查询出 没有经理编号以外的员工信息
SELECT EMPLOYEE_ID,FIRST_NAME,MANAGER_ID FROM t_employees WHERE MANAGER_ID IS NOT NULL;
#查询出 没有经理编号以外的员工信息(此处NOT为取反。两个结果)
SELECT EMPLOYEE_ID,FIRST_NAME,MANAGER_ID FROM t_employees WHERE NOT MANAGER_ID IS NULL;
语法:SELECT 列名 FROM 表名 WHERE 列名 枚举查询 IN (值1,值2,值n…)
#查询部门编号为70,80,90的员工信息
SELECT EMPLOYEE_ID,FIRST_NAME,LAST_NAME,DEPARTMENT_ID FROM t_employees
WHERE DEPARTMENT_ID IN(70,80,90);
#枚举查询 查询经理编号为 124 和100的员工信息
SELECT EMPLOYEE_ID,FIRST_NAME,LAST_NAME,MANAGER_ID FROM t_employees
WHERE MANAGER_ID IN(124,100);
语法:SELECT 列名 FROM 表名 WHERE 列名 LIKE ’ S_% ’
- LIKE
- LIKE _(单个任意字符)
- 列名 LIKE 'S_'
- LIKE %(任意长度的任意字符 0~n个)
- 列名 LIKE 'S%'
#模糊查询,查询姓氏以S开头且长度为6的员工信息
SELECT EMPLOYEE_ID,FIRST_NAME,LAST_NAME FROM t_employees WHERE FIRST_NAME LIKE 'S_____';
#模糊查询,查询姓氏以S开头任意长度的所有员工信息
SELECT EMPLOYEE_ID,FIRST_NAME,LAST_NAME FROM t_employees WHERE FIRST_NAME LIKE 'S%';
语法:
SELECT 列名
CASE WHEN 条件 THEN 结果
ELSE 结果
END
FROM 表名
CASE
WHEN 条件1 THEN 结果1
WHEN 条件2 THEN 结果2
WHEN 条件3 THEN 结果3
WHEN 条件4 THEN 结果4
ELSE 结果
END
#查询员工信息(编号、名字、薪资、薪资级别<条件表达式>)
SELECT EMPLOYEE_ID,FIRST_NAME,salary,
CASE
WHEN salary >=10000 THEN 'A'
WHEN salary >=8000 AND salary<10000 THEN 'B'
WHEN salary >=6000 AND salary<8000 THEN 'C'
WHEN salary >=4000 AND salary <6000 THEN 'D'
ELSE 'E'
END AS '薪资级别'
FROM t_employees;
注意:通过使用CASE END进行条件判断,每条数据对应生成一个值,case分支结构产生一个新的列
经验:类似Java中的分支结构
语法: SELECT 时间函数([参数列表]);
时间函数 | 描述 |
---|---|
SYSDATE() | 当前系统时间(年、月、日、时、分、秒) |
CURDATE() | 获得当前日期 |
CURTIME() | 获得当前时间 |
WEEK(DATE) | 获得指定日期是一年中第几周 |
YEAR(DATE) | 获得指定日期的年份 |
MONTH(DATE) | 获得指定日期的月份 |
DAY(DATE) | 获得指定日期的天 |
HOUR(DATE) | 获得指定时间的小时值 |
MINUTE(DATE) | 获得指定时间的分钟值 |
SECOND(DATE) | 获得指定日期的秒值 |
DATEDIFF(DATE1,DATE2) | 获得DATE1和DATE2之间相隔的天数 |
ADDDATE(DATE,N) | 在指定日期加上N天后的日期 |
#1.当前系统时间
SELECT SYSDATE();
#2.获得当前日期
SELECT CURDATE();
#3.获得当前时间
SELECT CURTIME();
#4.获得指定日期在一年中为第几周
SELECT WEEK(CURDATE());
#5.获取指定日期中的年份
SELECT YEAR(CURDATE());
#6.获取指定日期中的月份
SELECT MONTH(CURDATE());
#7.获取指定日期中的日
SELECT DAY(CURDATE());
#8.获取指定日期中的时
SELECT HOUR(SYSDATE());
#9.获取指定日期中的分
SELECT MINUTE(SYSDATE());
#10.获取指定日期中的秒
SELECT SECOND(SYSDATE());
#11.获取Date1和Date2之间相隔的天数
SELECT DATEDIFF(SYSDATE(),'2019-3-26');
#12.在指定日期之上加N天后的日期
SELECT ADDDATE(SYSDATE(),6);
语法:SELECT 字符串函数([参数列表]);
字符串函数 | 说明 |
---|---|
CONCAT(str1,str2,str3…) | 将多个字符串进行拼接 |
INSERT(str,pos,len,newStr) | 将str中指定pos位置开始len长度的内容替换为newStr |
LOWER(str) | 将指定字符串转换为小写 |
UPPER(str) | 将指定字符串转换为大写 |
SUBSTRING(str,pos,len) | 将str字符串指定pos位置开始截取len个内容 |
#1.连接将多个字符串连接在一起
SELECT CONCAT('My','S','QL');
#2.插入替换(下标从1开始)
SELECT INSERT('这是MySQL数据库',3,5,'Oracle');
#3.转小写
SELECT LOWER('MYSQL');
#4.转大写
SELECT UPPER('mysql');
#5.截取
SELECT SUBSTRING('张阔真的太帅了!我的天呀',3,4);
语法:SELECT 聚合函数(列名) FROM 表名;
聚合函数 | 说明 |
---|---|
COUNT() | 求总行数 |
SUM() | 求单列中所有行的总和 |
AVG() | 求单列中所有行的平均值 |
MAX() | 求单列中所有行的最大值 |
MIN() | 求单列中所有行的最小值 |
#1.查询员工一共多少人
SELECT COUNT(EMPLOYEE_ID) AS '员工总数' FROM t_employees;
SELECT COUNT(MANAGER_ID) AS '经理总数' FROM t_employees;
SELECT COUNT(*) FROM t_employees;
#2.查询员工每个月工资的总和
SELECT SUM(salary) FROM t_employees;
#3.查询员工每个月工资的平均工资
SELECT AVG(salary) FROM t_employees;
#4.查询月薪最高的
SELECT MAX(salary) FROM t_employees;
#5.查询月薪最低的
SELECT MIN(salary) FROM t_employees;
语法: SELECT 列名 FROM 表名 WHERE 条件 GROUP BY 分组依据(列名)
关键字 | 说明 |
---|---|
GROUP BY | 分组依据,如果有WHERE,在WHERE之后生效 |
#思路:
#1.先按照部门编号分组(分组依据是:department_id)
#2.再针对各部门的人数进行统计(count)
SELECT DEPARTMENT_ID,COUNT(EMPLOYEE_ID)
FROM t_employees
GROUP BY DEPARTMENT_ID;
#思路:
#1.先按照部门编号分组(分组依据是:department_id)
#2.再针对各部门的工资进行平均计算(AVG())
SELECT DEPARTMENT_ID,AVG(salary) AS '平均工资',COUNT(EMPLOYEE_ID) AS'人数'
FROM t_employees
GROUP BY DEPARTMENT_ID;
#思路
#1.按照部门编号进行分组(department_id)
#2.按照岗位名称进行分组(job_id)
#3.针对每个部门中各个岗位的人数进行统计
SELECT DEPARTMENT_ID AS'部门',JOB_ID AS'岗位',COUNT(EMPLOYEE_ID) AS'人数'
FROM t_employees
GROUP BY DEPARTMENT_ID,JOB_ID;
#查询各个部门的id、总人数、first_name
SELECT DEPARTMENT_ID,COUNT(EMPLOYEE_ID),FIRST_NAME
FROM t_employees
GROUP BY DEPARTMENT_ID;
语法: SELECT 列名 FROM 表名 WHERE 条件 GROUP BY 分组依据(列名) HAVING 过滤规则
关键字 | 说明 |
---|---|
HAVING | 过滤规则是对分组后的数据进行过滤 |
#统计部门编号为60、70、80的部门最高工资
#思路:
#1.确定分组依据 department_id
#2.对分组后的数据进行过滤 过滤规则为 60 70 80部门编号
#3.分组过滤后的数据,做max()函数处理
SELECT DEPARTMENT_ID,MAX(salary)
FROM t_employees
GROUP BY DEPARTMENT_ID
HAVING DEPARTMENT_ID IN (60,70,80);
#HAVING是在分组之后的数据进行过滤
语法:SELECT 列名 FROM 表名 LIMIT 起始行,查询行
关键字 | 描述 |
---|---|
LIMIT offset_start,row_count | 限定查询结果的起始行和总行数 |
#查询表中前五名员工的信息
SELECT * FROM t_employees LIMIT 0,5;
#查询表中的第二页数据和第三页数据
SELECT * FROM t_employees LIMIT 5,5;
SELECT * FROM t_employees LIMIT 10,5;
语法:SELECT 列名 FROM 表名 WHERE 条件 GROUP BY 分组 HAVING 过滤条件 ORDER BY 排序列 LIMIT 起始行,总条数
#1.执行 FROM : 指定数据来源表
#2.执行WHERE : 对查询的数据做第一次过滤
#3.执行GROUP BY :分组
#4.执行HAVING : 对分组后的数据做第二次过滤
#5.执行SELECT : 查询各个字段的值
#6.执行ORDER BY : 排序
#7.执行LIMIT : 限定查询结果
语法:SELECT 列名 FROM 表名 WHERE 条件(子查询结果)
查询工资大于Bruce的员工信息
#思路
#1.先查询到Bruce的工资(一行一列)
SELECT SALARY FROM t_employees WHERE first_name = 'Bruce';#6000
#2.查询大于Bruce工资的员工信息
SELECT * FROM t_employees WHERE SALARY > 6000;
#3.将1 、2 整合为一条语句
SELECT * FROM t_employees WHERE salary >(SELECT SALARY FROM t_employees WHERE first_name = 'Bruce')
语法:SELECT 列名 FROM 表名 WHERE 列名 IN(子查询结果)
查询与King同一部门员工信息
#思路
#1.查询King所在的部门编号(多行单列)
SELECT DEPARTMENT_ID FROM t_employees WHERE last_name='King';
#2.将 80、90作为枚举查询的条件
SELECT EMPLOYEE_ID,FIRST_NAME,salary
FROM t_employees
WHERE DEPARTMENT_ID IN (80,90)
#3.整合
SELECT EMPLOYEE_ID,FIRST_NAME,salary
FROM t_employees
WHERE DEPARTMENT_ID
IN
(SELECT DEPARTMENT_ID FROM t_employees WHERE last_name='King')
查询工资高于60部门的所有人的信息
#1.查询部门编号为60的工资
SELECT salary FROM t_employees WHERE DEPARTMENT_ID = 60;
#2.查询高于60部门所有人的工资的员工信息(高于所有人!)
SELECT EMPLOYEE_ID,FIRST_NAME,salary FROM t_employees
WHERE salary > ALL
(SELECT salary FROM t_employees WHERE DEPARTMENT_ID = 60);
#3.查询高于60部门所有人的工资的员工信息(高于部分人!)
SELECT EMPLOYEE_ID,FIRST_NAME,salary FROM t_employees
WHERE salary > ANY
(SELECT salary FROM t_employees WHERE DEPARTMENT_ID = 60);
语法:SELECT 列名 FROM (子查询结果集) WHERE 条件;
查询表中部分列的信息,获得工资大于15000的
#思路
#1.先查询部分列的信息作为一张临时表
SELECT EMPLOYEE_ID,FIRST_NAME,salary FROM t_employees;
#2.将子查询得到的临时表作为外部查询的表
SELECT EMPLOYEE_ID ,FIRST_NAME ,salary
FROM
(SELECT EMPLOYEE_ID,FIRST_NAME,salary FROM t_employees)AS temp
WHERE salary > 15000;
语法:
#合并 t1 和t2两张表的结果。纵向合并,去除重复的记录
SELECT * FROM t1
UNION
SELECT * FROM t2
#合并结果集,不去除重复记录
SELECT * FROM t1
UNION ALL
SELECT * FROM t2
语法:SELECT 列名 FROM 表1 连接方式 表2 ON 连接条件;
#查询所有有部门的员工信息,显示部门名称(不包括没有部门的员工) SQL标准
SELECT * FROM t_employees
INNER JOIN t_departments
ON t_employees.`DEPARTMENT_ID` = t_departments.`DEPARTMENT_ID`;
#MYSQL标准
SELECT EMPLOYEE_ID,FIRST_NAME,DEPARTMENT_NAME FROM
t_employees,t_departments
WHERE t_employees.`DEPARTMENT_ID` = t_departments.`DEPARTMENT_ID`;
#1.两张表连接查询,要有关联条件。但是关联条件的列重复了。需要明确查询的是哪个表的列
#2.表名比较长,表名多次重复出现。容易混淆.可以给别名
SELECT EMPLOYEE_ID,FIRST_NAME,d.DEPARTMENT_ID,DEPARTMENT_NAME FROM t_employees AS e
INNER JOIN t_departments AS d
ON e.`DEPARTMENT_ID` = d.`DEPARTMENT_ID`;
#查询所有岗位的员工信息,显示岗位名称
SELECT EMPLOYEE_ID,FIRST_NAME,JOB_TITLE
FROM t_employees AS e
INNER JOIN t_jobs AS j
ON e.`JOB_ID` = j.`JOB_ID`;
#查询所有员工工号、名字、部门名称、部门所在城市的名称
SELECT EMPLOYEE_ID,FIRST_NAME,DEPARTMENT_NAME,CITY
FROM t_employees AS e
INNER JOIN t_departments AS d
ON e.`DEPARTMENT_ID` = d.`DEPARTMENT_ID`
INNER JOIN t_locations AS l
ON d.`LOCATION_ID` = l.`LOCATION_ID`;
#查询所有员工工号、名字、部门名称、部门城市名称、所在城市的国家
SELECT EMPLOYEE_ID,FIRST_NAME,DEPARTMENT_NAME,CITY,COUNTRY_NAME
FROM t_employees AS e
INNER JOIN t_departments AS d
ON e.`DEPARTMENT_ID` = d.`DEPARTMENT_ID`
INNER JOIN t_locations AS l
ON d.`LOCATION_ID` = l.`LOCATION_ID`
INNER JOIN t_countries AS c
ON l.`COUNTRY_ID` = c.`COUNTRY_ID`;
#查询所有员工信息,以及对应的部门名称(没有部门的员工,也在查询结果中,但是部门名称以NULL填充)
SELECT EMPLOYEE_ID,FIRST_NAME,DEPARTMENT_NAME
FROM t_employees AS e
LEFT JOIN t_departments AS d
ON e.`DEPARTMENT_ID` = d.`DEPARTMENT_ID`;
#查询所有部门信息,以及部门中的员工信息
#(没有员工的部门,也在查询结果中,员工信息以NULL填充)
SELECT EMPLOYEE_ID,FIRST_NAME,DEPARTMENT_NAME
FROM t_employees AS e
RIGHT JOIN t_departments AS d
ON e.`DEPARTMENT_ID` = d.`DEPARTMENT_ID`;
INSERT INTO 表名 (列1,列2,列3…) VALUES(值1,值2,值3…)
#添加一条员工信息
INSERT INTO t_employees
(EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL,PHONE_NUMBER,HIRE_DATE,JOB_ID,SALARY,COMMISSION_PCT,MANAGER_ID,DEPARTMENT_ID)
VALUES('209','Ya','Suo','[email protected]','515.123.6666','2010-03-18','Center',900,NULL,'123','50')
#多行添加,在值列表外边追加,再写一个值列表
,('208','Ya','Suo','[email protected]','515.123.6666','2010-03-18','Center',900,NULL,'123','50');
#添加一条城市信息
INSERT INTO t_countries(COUNTRY_ID,COUNTRY_NAME)VALUES('AL','阿尔巴尼亚');
SELECT * FROM t_departments;
#添加一条部门信息
INSERT INTO t_departments(DEPARTMENT_ID,DEPARTMENT_NAME,MANAGER_ID,LOCATION_ID)
VALUES('280','Teach','111','1500')
UPDATE 表名 SET 列名1=新值1,列名2 = 新值2… WHERE 条件
#修改员工编号为208的员工名字为TOM Jackson
UPDATE t_employees
SET FIRST_NAME='TOM', LAST_NAME = 'Jackson'
WHERE EMPLOYEE_ID = '208';
DELETE FROM 表名 WHERE 条件
#删除一条员工,编号为207的
DELETE FROM t_employees
WHERE EMPLOYEE_ID = '207'
TRUNCATE TABLE 表名;
#清空t2整张表
TRUNCATE TABLE t2;