create database `数据库名`;# 简单创建数据库 show databases;# 查看数据库 use `数据库名`;# 使用数据库 show tables;# 查看指定数据库下面的所有表 show tables from `数据库名`; # 查看指定数据库下面的所有表 select database(); # 查看当前处于哪个数据库中
# 简单创建表 createtable stu_info( id int, name varchar(20) );
# 查询表中的多个字段 SELECT last_name,email FROM employees;
# 查询表中的所有字段 SELECT*FROM employees;
# 查询常量值 SELECT100; SELECT'1000';
# 表达式查询 SELECT100*199;
# 查询函数 SELECT VERSION();# 查询数据库版本
# 方式一:使用 AS SELECT100*999AS 结果;
# 方式二:使用空格 SELECT100*999 结果;
# 字段去重:在字段前面加上 DISTINCT 编号,可以使查询出来的结果中,该字段不会出现重复的值 # 查询员工表中的涉及的所有的部门编号 SELECTDISTINCT department_id FROM employees;
# 查询员工和姓连接为一个姓名,使用CONCAT函数将字符串进行拼接 SELECT CONCAT(last_name,first_name) AS 姓名 FROM employees;
2、条件查询
语法
sql
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
# 进阶2:条件查询 /* 语法: SELECT 查询列表 FROM 表名 WHERE 筛选条件; 分类: 1、按条件表达式筛选 条件运算符: > < = !=(<>) >= <= 2、逻辑表达式筛选 逻辑运算符:&& || ! (and or not) 3、模糊查询 LIKE BETWEEN AND IN IS NULL 4、is null 和 <=> IS NULL:仅仅可以判断 NULL 值,可读性比较高,建议使用 <=>:既可以判断 NULL,也可以判断普通的数值,可读性比较低 */
# 进阶2:条件查询 /* 语法: SELECT 查询列表 FROM 表名 WHERE 筛选条件; 分类: 1、按条件表达式筛选 条件运算符: > < = !=(<>) >= <= 2、逻辑表达式筛选 逻辑运算符:&& || ! (and or not) 3、模糊查询 LIKE BETWEEN AND IN IS NULL 4、is null 和 <=> IS NULL:仅仅可以判断 NULL 值,可读性比较高,建议使用 <=>:既可以判断 NULL,也可以判断普通的数值,可读性比较低 */
# 1、按条件表达式查询
# 案例:查询工资>12000的员工信息 SELECT*FROM employees WHERE salary >12000
# 查询部门编号不等于90号的员工名和部门编号 SELECT last_name,department_id FROM employees WHERE department_id<>90;
# 2、逻辑表达式筛选
# 查询工资在10000到20000的员工名,工资及奖金 SELECT last_name , salary FROM employees WHERE salary >=10000AND salary <=20000;
# 查询工资低于10000或大于等于20000的员工名,工资及奖金 SELECT last_name , salary FROM employees WHERE salary <=10000OR salary >=20000;
# 3、模糊查询
# 查询员工张名字字符包含a的员工信息 SELECT*FROM employees WHERE last_name LIKE'%a%'
# 查询员工名中第三个字符为n,第五个字符为l的员工名和工资 SELECT last_name,salary FROM employees WHERE last_name LIKE'%__n_l%';
# 查询员工中第二个字符为_的员工名,使用 \ 进行转义 SELECT last_name FROM employees WHERE last_name LIKE'%_\_%';
# 查询员工工资在10000-20000之间的员工信息 SELECT last_name ,salary FROM employees WHERE salary BETWEEN10000AND20000; # 相当于 SELECT last_name ,salary FROM employees WHERE salary >=10000AND salary <=20000;
# in:查询员工编号在属于某个集合的员工信息 SELECT last_name , employee_id FROM employees WHERE employee_id IN (100,101,102,103,104);
# isnull:查询 没有/有 奖金的员工名 SELECT last_name , commission_pct FROM employees WHERE commission_pct ISNULL; SELECT last_name , commission_pct FROM employees WHERE commission_pct ISNOTNULL;
# 安全等于 <=>
# 查询没有奖金的员工名和奖金 SELECT last_name , commission_pct FROM employees WHERE commission_pct <=>NULL;
# 查询工资为12000的员工信息 SELECT last_name , salary FROM employees WHERE salary <=>12000;
3、排序查询
语法
sql
1 2 3 4 5 6 7 8
/* 进阶三:排序查询 语法: SELECT 查询列表 FROM 表 【WHERE 筛选条件】 ORDER BY 排序列表 【ASC / DESC】 ASC:升序。DESC:降序。如果不写,默认是升序 ORDER BY 子句中可以支持单个字段,多个字段,表达式,函数,别名来进行排序 ORDER BY 子句一般是放在查询语句的最后面,LIMIT子句放在 ORDER BY后面 */
/* 进阶三:排序查询 语法: SELECT 查询列表 FROM 表 【WHERE 筛选条件】 ORDER BY 排序列表 【ASC / DESC】 ASC:升序。DESC:降序。如果不写,默认是升序 ORDER BY 子句中可以支持单个字段,多个字段,表达式,函数,别名来进行排序 ORDER BY 子句一般是放在查询语句的最后面,LIMIT子句放在 ORDER BY后面 */
# 2、查询员工号、姓名、工资、以及工资提高20%之后的结果(new salary) SELECT employee_id,last_name,salary,salary*1.2 "new salary" FROM employees;
# 3、将员工的姓名按首字母排序,并写出姓名的长度(length) SELECT LENGTH(last_name),SUBSTR(last_name,1,1) 首字符 ,last_name FROM employees ORDERBY 首字符;
# 4、做一个查询,产生以下的结果 # <last_name> earns <salart> monthly but wants <salary*3> SELECT CONCAT(last_name,' earns ',salary,' monthly but wants ',salary*3) AS "Dream Salary" FROM employees;
# 5、使用case-when,按照下面的条件 SELECT job_id AS job, CASE job_id WHEN'AD_PRES'THEN'A' WHEN'ST_MAN'THEN'B' WHEN'IT_PR OG'THEN'C' WHEN'SA_PRE'THEN'D' WHEN'ST_CLERK'THEN'E' ENDAS Grade FROM employees;
# 进阶查询:分组查询 /* 语法 SELECT 分组函数 , 列(要求出现在group by的后面) from 表 【where 筛选条件】 group by 分组的列表 【order by 子句】 注意: 查询的列表必须特殊,要求是分组函数和group by 后出现的字段 特点: 1、分组查询中的筛选按条件分为两类 数据源 位置 关键字 分组前筛选: 原始表 GROUP BY 子句前面 WHERE 分组后筛选 分组后的结果集 GROUP BY 子句的后面 HAVING 分组函数做条件肯定是放在HAVING子句中 能用分组前筛选的,就优先考虑使用分组前筛选 2、GROUP BY 子句支持单个字段分组,多个字段分组(多个字段之间用逗号,没有顺序要求),表达式或函数(使用较少) 3、可以添加排序(排序放在整个分组查询的后面) */
# 1、查询每个工种的最高工资 SELECTMAX(salary),job_id FROM employees GROUPBY job_id;
# 2、查询每个位置上的部门个数 SELECTCOUNT(*),location_id FROM departments GROUPBY location_id;
# 3、添加筛选条件:
# 3.1、查询邮箱中包含a字符的,每个部门的平均工资 SELECTAVG(salary),department_id FROM employees WHERE email LIKE'%a%'GROUPBY department_id;
# 3.2、查询有奖金的每个领导手下员工的最高工资 SELECTMAX(salary),manager_id FROM employees WHERE commission_pct ISNOTNULLGROUPBY manager_id;
# (1)查询女生名和对应的男生名 SELECT `name`,boyName FROM boys,beauty WHERE boys.id = beauty.boyfriend_id;
# (2)查询员工名和对应的部门名 SELECT last_name,department_name FROM employees,departments WHERE employees.department_id=departments.department_id;
# 2、为表起别名【表名 [as] 别名】,提高语句的简洁度,区分多个重名字段
# (1)查询员工名,工种号。工种名 SELECT last_name,a.job_id,job_title FROM employees a,jobs b WHERE a.job_id=b.job_id;
# 3、添加筛选
# (1)查询有奖金的员工名,部门名 SELECT last_name,commission_pct,department_name FROM employees a,departments b WHERE a.department_id=b.department_id AND a.commission_pct ISNOTNULL;
# (2)查询城市名中第二个字符为o的部门名和城市名 SELECT department_name,city FROM departments d,locations l WHERE d.location_id = l.location_id AND city LIKE'_o%';
# 4、添加分组
# (1)查询每个城市的部门个数 SELECTCOUNT(*) 个数 , city FROM departments d,locations l WHERE d.location_id = l.location_id GROUPBY city;
# (2)查询有奖金的每个部门的部门名和部门的领导编号和该部门的最低工资 SELECT department_name,d.manager_id,MIN(salary) FROM departments d,employees e WHERE d.department_id=e.department_id AND commission_pct ISNOTNULLGROUPBY department_name,d.manager_id;
# 5、添加排序
# (1)查询每个工种的工种名和员工个数, 并且按员工个数降序 SELECT job_title,COUNT(*) FROM employees e,jobs j WHERE e.job_id=j.job_id GROUPBY job_title ORDERBYCOUNT(*) DESC;
# 6、实现三表连接
# (1)查询员工名、部门名和所在城市 SELECT last_name,department_name,city FROM employees e,departments d,locations l WHERE e.department_id=d.department_id AND d.location_id=l.location_id AND city LIKE's%'ORDERBY department_name DESC;
6.1.2、非等值查询
非等值查询一般为不是 = 来查询,使用 >、<等查询
sql
1 2 3 4
# 二、非等值查询
# 1、查询员工的工资和工资级别 SELECT e.salary,grade_level FROM employees e,job_grades g WHERE e.salary BETWEEN g.lowest_sal AND g.highest_sal AND g.grade_level='A';
6.1.3、自连接
和等值查询类似,自连接是自己连接自己,例如三级分类表
sql
1 2 3 4
# 自连接
# 1、查询员工名和上级 SELECT e.last_name ,m.last_name FROM employees e,employees m WHERE e.manager_id=m.employee_id;
# 1、内连接 /* 语法: SELECT 查询列表 FROM 表1 别名 INNER JOIN 表2 别名 ON 连接条件; 分类:等值、非等值、自连接 */
# (1)等值连接
# 1)查询员工名,部门名 SELECT last_name,department_name FROM employees e INNERJOIN departments d ON e.department_id=d.department_id;
# 2)查询名字中包含e的员工名和工种名(添加筛选) SELECT last_name,job_title FROM employees e INNERJOIN jobs j ON e.job_id=j.job_id WHERE e.last_name LIKE'%e%';
# 3)查询部门个数>3的城市名和部门个数,(添加分组+筛选) # ①查询每个城市的部门个数 # ②在①结果上筛选满足条件的 SELECT city,COUNT(*) 部门个数 FROM departments d INNERJOIN locations l ON d.location_id=l.location_id GROUPBY city HAVINGCOUNT(*)>3;
# 4)查询哪个部门的员工个数>3的部门名和员工个数,并按个数降序(添加排序) # ①查询每个部门的员工个数 # ②在①结果上筛选员工个数>3的记录,并排序 SELECTCOUNT(*) , department_name FROM employees e INNERJOIN departments d ON e.department_id=d.department_id GROUPBY department_name HAVINGCOUNT(*)>3ORDERBYCOUNT(*) DESC;
# 5)查询员工名、部门名、工种名,并按部门名降序 SELECT last_name,department_name,job_title FROM employees e INNERJOIN departments d ON e.department_id=d.department_id INNERJOIN jobs j ON e.job_id=j.job_id ORDERBY department_name DESC;
6.2.2、非等值查询
sql
1 2 3 4 5 6 7
# 非等值查询
# 1、查询员工的工资级别 SELECT salary,grade_level FROM employees e INNERJOIN job_grades j ON e.salary BETWEEN j.lowest_sal AND j.highest_sal;
# 2、查询每个工资级别的个数>20的个数,并且按工资级别降序 SELECTCOUNT(*),salary,grade_level FROM employees e INNERJOIN job_grades j ON e.salary BETWEEN j.lowest_sal AND j.highest_sal GROUPBY grade_level HAVINGCOUNT(*)>20ORDERBY grade_level DESC;
6.2.3、自连接
和等值查询类似,自连接是自己连接自己,例如三级分类表
sql
1 2 3 4
# 自连接
# 1、查询员工名和上级 SELECT e.last_name ,m.last_name FROM employees e INNERJOIN employees m ON e.manager_id=m.employee_id WHERE e.last_name LIKE'%k%';
# (1)左外连接 SELECT b.name,bo.*FROM beauty b LEFTOUTERJOIN boys bo ON b.boyfriend_id=bo.id WHERE bo.id ISNULL; # (2)右外连接 SELECT b.name,bo.*FROM boys bo RIGHTOUTERJOIN beauty b ON b.boyfriend_id=bo.id WHERE bo.id ISNULL;
6.2.5、全外连接
由于 MySQL 不支持全外连接,需要了结上网查询
6.2.6、交叉连接
交叉连接就是使用 sql99 语法实现了笛卡尔乘积的效果
sql
1 2
# 交叉连接——使用了sql99语法实现的笛卡尔乘积的效果 SELECT*FROM beauty b CROSSJOIN boys bo;
# (1)谁的工资比Abel高 # ①查询Abel的工资 SELECT salary FROM employees WHERE last_name ='Abel'; # 查询员工的信息,满足salary>①的结果 SELECT salary FROM employees WHERE salary > (SELECT salary FROM employees WHERE last_name ='Abel');
# (2)返回job_id与141号员工相同,salary比143号员工多的员工 姓名,job_id和工资 # ①查询141号员工的job_id SELECT job_id FROM employees WHERE employee_id=141; # ②查询143号员工的工资 SELECT salary FROM employees WHERE employee_id=143; # ③根据①和②的结果查询员工的姓名,job_id和工资 SELECT last_name,job_id,salary FROM employees WHERE job_id=(SELECT job_id FROM employees WHERE employee_id=141) AND salary>(SELECT salary FROM employees WHERE employee_id=143); # (3)返回公司工资最少的员工的last_name,job_id和salary # ①查询最低工资 SELECTMIN(salary) FROM employees; # ②根据①的结果查询需要的员工信息 SELECT last_name,job_id,salary FROM employees WHERE salary = (SELECTMIN(salary) FROM employees); # (4)查询最低工资大于50号部门最低工资的部门id和其最低工资 # ①查询50号部门的最低工资 SELECTMIN(salary) FROM employees WHERE department_id =50; # ②查询每个部门的最低工资 SELECTMIN(salary),department_id FROM employees GROUPBY department_id; # ③在②基础上,满足min(salary)>① SELECTMIN(salary),department_id FROM employees GROUPBY department_id HAVINGMIN(salary)>(SELECTMIN(salary) FROM employees WHERE department_id =50);
列子查询
sql
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
# 列子查询(多行子查询)【一列多行,比如id集合】
# (1)返回location_id是1400或1700的部门中的所有员工姓名 # ①查询location_id是1400或1700的部门编号 SELECTDISTINCT department_id FROM departments WHERE location_id IN(1400,1700); # ②查询员工姓名,要求部门是①列表中的某一个 SELECT last_name FROM employees WHERE department_id IN (SELECTDISTINCT department_id FROM departments WHERE location_id IN(1400,1700));
# (3)返回其他部门中比job_id为`IT_PROG`部门任一工资都低的员工的员工号、姓名、job_id以及salary # ①查询job_id为IT_PROG部门任一工资 SELECTDISTINCT salary FROM employees WHERE job_id='IT_PROG'; # ②查询员工工号、姓名、job_id以及salary,slary<①的任意一个 SELECT last_name,employee_id,job_id,salary FROM employees WHERE salary<ANY( SELECTDISTINCT salary FROM employees WHERE job_id='IT_PROG');
# (3)返回其他部门中比job_id为`IT_PROG`部门所有工资都低的员工的员工号、姓名、job_id以及salary SELECT last_name,employee_id,job_id,salary FROM employees WHERE salary<ALL( SELECTDISTINCT salary FROM employees WHERE job_id='IT_PROG');
行子查询
sql
1 2 3 4 5 6 7 8 9 10 11 12 13 14
# 3、行子查询
# (1)查询员工编号最小并且工资最高的员工信息
# 1)使用非行子查询 # ①查询最小员工编号 SELECTMIN(employee_id) FROM employees; # ②查询最高工资 SELECTMAX(salary) FROM employees; # ③查询员工信息 SELECT*FROM employees WHERE employee_id=(SELECTMIN(employee_id) FROM employees) AND salary=(SELECTMAX(salary) FROM employees);
# 2)使用行子查询【使用不多】 SELECT*FROM employees WHERE(employee_id,salary)=(SELECTMIN(employee_id),MAX(salary) FROM employees);
7.2、放在 select 后面
sql
1 2 3 4 5 6 7
# SELECT后面【仅仅支持标量子查询】
# 1、查询每个部门的员工个数 SELECT d.* , (SELECTCOUNT(*) FROM employees e WHERE d.department_id=e.department_id) FROM departments d;
# 2、查询员工号=102的部门名 SELECT (SELECT d.department_name FROM departments d INNERJOIN employees e ON d.department_id = e.department_id WHERE e.employee_id=102) 部门名;
# 分页查询 /* 应用场景:当要显示的数据,一页显示补全,需要分页提交sql请求 语法: SELECT 查询列表 FROM 表 【 JOIN TYPE JOIN 表2 ON 连接条件 WHERE 筛选条件 GROUP BY 分组字段 HAVING 分组后的筛选 ORDER BY 排序字段 】 LIMIT offset,size; offset:从第几条数据开始查询,0是第一条 size:查询几条数据 特点: ①LIMIT语句放在查询语句的最后 ②公式: 要显示的页数page,每页显示的条目数size LIMIT (page-1)*size , size */
# 联合查询(union) /* union:联合、合并。将多条查询语句的结果合并成一个结果 语法: 查询语句1 UNION 查询语句2 UNION ....... 应用场景: 要查询的结果来自多个表,且多个表没有直接的连接关系,但查询的信息一致时 特点: 1、要求多条查询语句的列数是一致的 2、要求多条查询语句的查询的每一列的类型和顺序最好一致 3、UNION关键字默认去重,如果使用 UNION ALL可以包含重复项 */
案例
sql
1 2 3 4 5 6 7 8 9 10 11 12
# 1、查询部门编号>90或邮箱中包含a的员工信息
#(1)非联合查询 SELECT*FROM employees WHERE email LIKE'%a%'OR department_id>90; #(2)联合查询——去重 SELECT*FROM employees WHERE email LIKE'%a%' UNION SELECT*FROM employees WHERE department_id>90; #(3)联合查询——非去重(UNION后面加上ALL关键字) SELECT*FROM employees WHERE email LIKE'%a%' UNIONALL SELECT*FROM employees WHERE department_id>90;
# ①创建视图 CREATEVIEW view1 ASSELECT last_name, department_name, job_title FROM employees e JOIN departments d ON e.department_id = d.department_id JOIN jobs j ON j.job_id = e.job_id; # ②使用视图 SELECT * FROM view1 WHERE last_name LIKE'%a%';
# 视图的修改 /* 语法: 方式一: CREATE OR REPLACE VIEW 视图名 AS 查询语句 方式二: ALTER VIEW 视图名 AS 查询语句; */# 1、创建视图 CREATEVIEW view1 ASSELECT last_name, department_name, job_title FROM employees e JOIN departments d ON e.department_id = d.department_id JOIN jobs j ON j.job_id = e.job_id;
# 2、查询视图 SELECT * FROM view1; # 3.1、方式一:修改视图 CREATE OR REPLACE VIEW view1 ASSELECT * FROM employees e WHERE employee_id <130; # 3.2、方式二:修改视图 ALTERVIEW view1 ASSELECT * FROM employees e WHERE employee_id <110;
删除视图
sql
1 2 3 4 5 6
# 删除视图 /* 语法: DROP VIEW 视图名,视图名,......; */ DROPVIEW view1;
#一、系统变量 /* 说明:变量由系统定义,不是用户定义,属于服务器层面 注意:全局变量需要添加global关键字,会话变量需要添加session关键字,如果不写,默认会话级别 使用步骤: 1、查看所有系统变量 show global|【session】variables; 2、查看满足条件的部分系统变量 show global|【session】 variables like '%char%'; 3、查看指定的系统变量的值 select @@global|【session】系统变量名; 4、为某个系统变量赋值 方式一: set global|【session】系统变量名=值; 方式二: set @@global|【session】系统变量名=值; */