MySQL 数据库 查 续

MySQL 增删查改 必知必会

4.1.13 使用 like 关键字进行模糊查询

-- 说明:模糊查询,使用查询关键字like,like意思是类似于,像...的意思

-- 模糊查询,支持两种字符匹配符号:

-- 下划线_:下划线可以代替单个字符

-- 百分号%:可以代替任意个任意字符(0个、1个或者多个字符)

-- 举例:查询员工表中员工编号第二位为2的员工的编号、姓名
SELECT employee_id,first_name,last_name
FROM hrdb.`employees`
WHERE employee_id LIKE "_2%";

4.1.14 查询关键字 distinct 的用法

-- 说明:distinct意思是有区别的,这里用于在查询时过滤掉重复数据

-- 举例:查询员工表中有哪些职位分类,要求查询结果不显示重复数据
SELECT
DISTINCT job_id FROM hrdb.`employees`;
-- 举例:查询员工表中不同职位的个数
SELECT
COUNT(DISTINCT job_id) FROM hrdb.`employees`;
 -- distinct 和count()函数配合使用

4.1.15 多字段排序

-- 多字段排序,就是排序时,可以同时使用多个字段对查询结果数据先后进行排序,“排序字段”之间使用逗号隔开

语法:

ORDER BY 字段1 [[DESC]|[ASC]] ,字段2  [[DESC]|[ASC]] 

4.1.16 查询的优先级

优先级顺序:

高:()>NOT>AND>OR 低

-- 举例:查询工资低于8000或者高于12000,员工编号大于120的人员的工资、部门编号、员工编号
SELECT salary,department_id,employee_id
FROM hrdb.`employees`
WHERE (salary <8000 OR salary>12000) AND employee_id>120;

4.2 查询多个表中的数据

 

4.2.1 跨表查询步骤

步骤一:分析需要查询的数据和给出的条件相关数据分布在哪些表中

步骤二:分析需要查询的数据所在表和所给条件相关数据所在表之间有哪些联系(找两个表的相同字段,存在,即表示两个表有直接关系)

直接关系:两个表之间有数据引用(相同字段)

间接关系:两个表之间通过其他表有数据引用关系(两两之间有共同字段)

步骤三:结合其他所给条件,写查询需要的 SQL 语句

-- 说明:在 sql 语句中,表的别名可以代替对应表,字段的别名可以代替对应字段,

-- 函数的别名可以代替对应函数

-- 别名作用:可以减少 sql 语句编写的工作量,标识数据来源

-- 举例:查看员工表中,员工编号为 100 的员工所在的部门的部门名称
SELECT e.employee_id,d.department_name,d.department_id
FROM hrdb.`employees` AS e,departments AS d
WHERE e.`department_id`=d.`department_id` 
AND employee_id=100;

4.2.2 子查询(嵌套查询)

子查询是一个嵌套在另一个查询【主查询】内部中的查询,子查询可以达到的查询目的,使用其他多表连接查询同样可以实现,但子查询更容易阅读和编写;

4.2.2.1 子查询出现在 from 子句中

-- 说明:把内层的子查询查询结果当成临时表,供外层 sql 语句再次查询

-- 语法:

Select 查询列表1

from(

select查询列表2

from 库名.表名

where 条件表达式

);

-- 外部查询的查询列表需要和子查询的查询列表相同或者为其子集

 1 -- 举例:查询hrdb数据库employees表工资大于7000的名字包括字母c的员工的first_name,salary
 2 -- 方法一
 3   SELECT first_name,salary
 4   FROM hrdb.`employees`
 5   WHERE salary>7000 AND first_name LIKE "%c%";
 6 -- 方法二、子查询写法
 7   SELECT x.first_name,x.salary
 8   FROM (SELECT first_name,salary FROM hrdb.`employees` WHERE salary>7000) X
 9   WHERE x.first_name LIKE "%c%";
10 -- 给子查询加一个别名

4.2.2.2 子查询出现在where子句中:

-- 说明:指把内层查询的结果作为外层查询的比较条件.

-- 语法:

SELECT 字段1

FROM 库名.表名

WHERE 字段1 关系运算符

(

SELECT 字段1

FROM 库名.表名

WHERE 字段2 关系运算符 字段值

);

1 -- 举例:查询员工表中工资比“员工编号为104的员工的工资”低的员工的姓名、员工编号、工资
2 SELECT first_name,last_name,employee_id,salary
3 FROM hrdb.`employees`
4 WHERE salary<
5 (
6   SELECT salary 
7   FROM hrdb.`employees` 
8   WHERE employee_id=104
9 );

4.2.2.3 子查询出现在having子句中

-- 语法

SELECT 查询列表

FROM 库名.表名

GROUP BY 字段1

HAVING 字段1 比较运算符(SELECT 字段1 FROM 库名.表名 WHERE 条件);

 1 -- 举例:查询员工表中"部门编号大于|first_name为Bruce的员工所在部门的部门编号|",的部门的编号
 2 SELECT department_id
 3 FROM hrdb.`employees` 
 4 GROUP BY department_id
 5 HAVING department_id>
 6 (
 7   SELECT department_id 
 8   FROM hrdb.`employees`
 9   WHERE first_name="Bruce"
10  );

4.2.2.4 子查询操作符ALL的用法

-- 说明:

ALL操作符有三种用法:

-- <>ALL:等价于 NOT IN

-- >ALL :比子查询中最大的值还要大

-- <ALL :比子查询中最小的值还要小

-- 特别说明:“= All”不存在

语法:

SELECT 字段1

FROM 库名.表名

WHERE 字段1 关系运算符 ALL

(

SELECT 字段1

FROM 库名.表名

WHERE 字段2 关

系运算符 字段值

);

1 -- 举例:查询工资与"job_id为IT_PROG的职位中所有人工资"都不同的人员姓名、工资
2 方法一、
3   SELECT first_name,last_name,salary
4   FROM hrdb.`employees`
5   WHERE salary NOT IN(SELECT salary FROM hrdb.`employees` WHERE job_id="IT_PROG");
6 方法二、
7   SELECT first_name,last_name,salary
8   FROM hrdb.`employees`
9   WHERE salary <>ALL(SELECT salary FROM hrdb.`employees` WHERE job_id="IT_PROG");

4.2.2.5 子查询操作符any的用法

-- = ANY:与子查询中的数据任何一个相等

-- >ANY : 比子查询中的数据最低的高

-- <ANY : 比子查询中的数据最高的低

1 -- 举例:查询工资与job_id为IT_PROG的职位中所有人工资相等的人员姓名、工资(=ANY 与任何一个相等)
2 SELECT first_name,last_name,salary
3 FROM hrdb.`employees`
4 WHERE salary=ANY(
5     SELECT salary 
6     FROM hrdb.`employees` 
7     WHEREjob_id="IT_PROG"
8 );
1 -- 举例:查询工资比job_id为IT_PROG的职位中最低工资高的人员姓名、工资(>ANY 比最低的高)
2 SELECT first_name,last_name,salary
3 FROM hrdb.`employees`
4 WHERE salary>ANY(
5     SELECT salary 
6     FROM hrdb.`employees` 
7     WHEREjob_id="IT_PROG"
8 );

4.2.3内连接&外连接查询

 4.2.3.1内连接【等值连接】查询

-- 说明:
  在进行跨表内连接查询数据时,查询结果只返回符合查询条件的数据;
  跨表内连接查询的结果和使用where的多表查询结果相同。

-- 语法:
  SELECT 别名1.字段名1,别名2.字段名2
  FROM 库名.表名1 [AS] 别名1
  INNER JOIN 库名.表名2 [AS] 别名2
  ON 别名1.字段名3=别名2.字段名3;

 1 -- 举例:查询员工表中,员工编号为100的员工所在部门的部门名称,查询结果显示员工编号、部门名称
 2 -- 方法一、
 3     SELECT e.employee_id,d.department_name
 4     FROM hrdb.`employees` e,hrdb.`departments` d
 5     WHERE e.department_id=d.department_id
 6     AND e.employee_id=100;
 7 -- 方法二、内连接写法
 8     SELECT e.employee_id,d.department_name
 9     FROM hrdb.`employees` e
10     INNER JOIN hrdb.`departments` d
11     ON e.department_id=d.department_id
12     AND e.employee_id=100;
1 -- 举例:查询在城市Seattle中工作的人员有哪些(跨三个表查询数据)
2 SELECT l.city,e.employee_id
3 FROM hrdb.`locations` l
4 INNER JOIN hrdb.`departments` d
5 ON l.location_id=d.location_id
6 INNER JOIN hrdb.`employees` e
7 ON d.department_id=e.department_id
8 AND l.city="Seattle";

4.2.3.2外连接((左外连接、右外连接、全连接)查询)

 4.2.3.2.1左外连接(简称左连接)

-- 左表:进行左连接查询时,在你写的sql语句中首先(第一个)出现的表,称为左表;

-- 说明:使用多表查询时,如果某个表中的数据需要全部显示,

-- 查询时,如果使用左连接进行查询,需要将这个表作为左表,

-- 查询完成后,左表的数据都全部显示在结果中,

-- 右表【除第一个表以外的表都称为右表】中符合查询条件的数据显示在查询结果中,

-- 右表中不符合查询条件的数据,也显示在结果中,不符合条件的数据以null填充。

-- 语法:
SELECT 别名1.字段名1,别名2.字段名2
FROM 库名.表名1 [AS] 别名1
LEFT JOIN 库名.表名2 [AS] 别名2
ON 别名1.字段名3=别名2.字段名3 ;

1 --举例:查询部门表中哪些部门没有员工、哪些部门有员工,查询结果显示部门名称、员工编号
2 SELECT department_name,employee_id
3 FROM hrdb.`departments` d
4 LEFT JOIN hrdb.`employees` e
5 ON d.department_id=e.department_id;

 4.2.3.2.2右外连接(简称右连接)查询

-- 右表:右连接查询中,进行多表连接查询时,最后出现的表,称为右表;
-- 说明:进行多表查询时,如果某个表中的数据需要全部显示,
-- 如果使用右连接查询时,需要将这个表作为右表,查询后,右表中的数据全部显示,左表【除右表以外的表都称为左表】中符合条件的数据显示在查询结果中,左表中不符合条件的数据,也显示在结果中,但相关数据以null填充。
语法:
SELECT 别名1.字段名1,别名2.字段名2
FROM 库名.表名1 [AS] 别名1
RIGHT JOIN 库名.表名2 [AS] 别名2
ON 别名1.字段名3=别名2.字段名3; -- 连接条件

1 -- 举例:查询部门表中哪些部门没有员工,哪些部门有员工,查询结果显示部门名称、员工编号
2 -- 右连接写法
3 SELECT d.department_name,e.employee_id
4 FROM hrdb.`employees` e
5 RIGHT JOIN hrdb.`departments` d
6 ON e.department_id=d.department_id;

4.2.3.2.1联合查询关键字UNION的用法

 1 举例:查询员工表中员工编号分别为110和115的人员的工资、入职日期
 2 -- 方法一
 3 SELECT salary,hire_date
 4 FROM hrdb.`employees` 
 5 WHERE employee_id=110
 6 OR employee_id=115;
 7 -- 方法二 联合查询写法
 8 SELECT salary,hire_date
 9 FROM hrdb.`employees` 
10 WHERE employee_id=110 
11 UNION
12 SELECT salary,hire_date
13 FROM hrdb.`employees` 
14 WHERE employee_id=115;

5、用户及权限管理

5.1 mysql用户分类角度1(权限不同):

(1) 管理员用户:root,具有最高权限,具有创建用户的权限,可以为其他用户授权

(2) 普通用户:普通用户由root用户创建,权限由root用户分配

5.2 mysql用户分类角度2(访问主机不同)

(1)本地用户

-- 只能在安装mysql的机器上访问mysql数据库的用户,在创建用户时,使用的IP地址为localhost

(2)远程访问用户

-- 在安装mysql的机器以外的机器上访问mysql数据库的相关用户

2.1 只能在指定IP对应的机器上访问远程mysql数据库的用户,创建用户时,只能使用指定的具体IP地址:如172.30.70.149所在的机器访问远程数据库

2.2 在除安装mysql数据库对应机器以外的任何一台机器上可以访问远程mysql数据库的用户 ,在创建用户时,使用的IP地址为百分号%(常用)

5.3 MySQL添加新用户

-- 在mysql中,添加一个可用的新用户,共分为三步:
  步骤一:添加用户
  步骤二:为用户授权
  步骤三:使授权生效

5.3.1、用户创建

语法:
INSERT INTO mysql.`user`(HOST,USER,PASSWORD) VALUES("IP地址","用户名",PASSWORD("密码")); -- 创建用户
-- PASSWORD() 加密函数

举例:创建远程访问用户test1,
为该用户在数据库hrdb中的所有表上授予select、insert权限,
使该用户在远程任何一台主机上可以访问数据库,该用户的密码为123456

-- 步骤一、创建用户
INSERT INTO mysql.user(HOST,USER,PASSWORD)
VALUES("%","test1",PASSWORD("123456"));
-- 步骤二、 为新用户授权
GRANT SELECT,INSERT ON hrdb.* TO "test1"@"%" IDENTIFIED BY "123456";
-- 步骤三、使授权生效
FLUSH PRIVILEGES; -- 刷新授权表,效果相当于重启mysql服务

SHOW GRANTS;

原文地址:https://www.cnblogs.com/hereisdavid/p/13492457.html