数据库MySQL DQL DML b站笔记自整 1-110

导出笔记百度云提取:

链接:https://pan.baidu.com/s/1JM7NjaxaiIlcCAAPREH6uQ
提取码:1vzn

数据库常见概念:

DB:数据库
DBMS:数据库管理系统,数据库软件,数据库产品用于管理DB
SQL:结构化查询语言。

MySQL的登录和退出

仅介绍在cmd中:mysql [-h主机名 -P端口号] -u用户名 -p密码
在本机登录:mysql -uroot -p
退出:ctrl+c 或者exit

可能出现问题:
在这里插入图片描述解决方法:
1.在C盘找到安装MySQL的bin文件,复制路径
2.打开计算机 ,右击属性(即控制面板)
3.点高级系统设置>高级>环境变量>path 将复制的路径复制的path最前面,用分号隔开。
4.重新打开cmd,输入mysq 即可。

mysql常见命令

1.show databases;查看所有数据库
2use 库名;:打开指定的库
3.show tables; : 打开当前库的所有表
4.查看其它库的所有表:show tables from 库名;
5.创建表:creat tables 表名(
列名 列类型,
列名 列类型,

);
6.查看表结构:desc 表名;
7.查看服务器版本
在mysql里:mysql version()
没在mysql里:mysql --V

DQL

1.基础查询

#进阶1:基础查询
/*
语法:select 查询列表 from 表名;
特点:1.查询列表可以是:字段,常量值。,表达式,函数
2.查询结果是虚拟的表格


*/
USE employees;
#查询表中的一个字段
SELECT job_id FROM employees;
#查询多个
SELECT email,salary,job_id FROM employees;
#查询所有字段
SELECT * FROM employees;
#查询常量值
SELECT 100#查询表达式
SELECT 10*99#查询函数
SELECT VERSION();

#起别名
SELECT 100 AS 结果;
SELECT salary AS 工资 FROM employees;
SELECT salary AS 工资,email AS 邮箱 FROM employees;
#方法2 使用空格
SELECT salary 工资,email 邮箱 FROM employees;
#案例查询salary,显示结果为 out put (带有空格的加引号)
SELECT salary AS "out put" FROM employees;

#查询没有重复的部门编号
SELECT DISTINCT department_id FROM employees;

#+ 的作用  
/*运算符 select 100+90
*/
#案例查询员工名和姓为一个字段,并显示为姓名
#concat
SELECT CONCAT(last_name,first_name) AS 姓名 FROM employees;

2.条件查询

/*
语法:
select
       查询列表
from
         表名
where   
         筛选条件;
         
         
  分类:
      1.按条件表达式筛选,
      2.按逻辑表达式筛选;
      3.模糊查询   like   between and   in   is null
*/
USE myemployees
#1.按条件表达式筛选,
#案例一:查询工资大于12000的员工信息
SELECT * FROM employees WHERE salary>12000;
#案例2:查询部门编号不等于90号的员工名和部门编号
SELECT `last_name`,`department_id` FROM empolyees WHERE department_id != 90;
#其中不等于!= 等价于<>;


#2.按逻辑表达式筛选,与或非  && 和and ;   ||和or;   !和 not;


#查询工资在一万到两万之前的员工名,工资以及奖金
SELECT`last_name`,`salary`,`commission_pct` FROM employees WHERE salary>10000 AND salary<20000;
#查询部门编号不是在90在110之间,或者工资高于15000的员工信息

SELECT * FROM employees WHERE `department_id`<90 OR`department_id`>110 OR`salary`>15000;
SELECT * FROM employees WHERE NOT(`department_id`>=90 AND`department_id`<=110 )OR`salary`>15000;

#模糊查询   like   between and   in   is null
#1。like
#案例一: 查询员工名中包含字符a的员工信息
SELECT * FROM employees WHERE last_name LIKE '%a%';

#案例二:查询员工名中第三个字符为e,第五个字符为a 的员工名和工资
SELECT `last_name`,`salary` FROM employees WHERE last_name LIKE '__e_a%';

#案例三:查询员工名中第二个字符为——的员工名
SELECT last_name FROM employees WHERE last_name LIKE '_\_%';
#or
SELECT last_name FROM employees WHERE last_name LIKE '_a_%' ESCAPE 'a';


#2. between and
#1.查询员工编号在100到120 之间的员工信息;包含临界值,120和100最好不颠倒
SELECT * FROM employees WHERE employee_id BETWEEN 100 AND 120;

# 3.in
#查询员工的工种编号是IT_PROG,AD_VP,AD_PRES中的一个员工名和工种编号;
SELECT job_id ,last_name FROM employees WHERE job_id ='IT_ PROG' OR job_id = 'AD_VP' OR job_id='AD_PRES' ;
#or
SELECT job_id ,last_name FROM employees WHERE job_id  IN('IT_ PROG' , 'AD_VP' ,'AD_PRES') ;
  #4. is null  is not null  <=> 
  #1.查询没有奖金的员工名和奖金率
SELECT `last_name`,`commission_pct` FROM employees WHERE commission_pct IS NULL ;

3. 排序查询

#排序查询
/*
语法:
select 
      查询列表
from   
        表
        (where 筛选条件)
order by 排序列表(asc\desc)

asc:升序
desc:降序
不写:升序
oreder by 支持一个多个字段,函数,表达式,别名等
*/

#案例:查询员工信息,要求工资从高到低排序
SELECT * FROM employees ORDER BY salary DESC;

SELECT * FROM employees ORDER BY salary;

#案例二:查询部门编号>=90的员工信息,按入职时间的先后进行排序
SELECT * FROM employees WHERE department_id>=90 ORDER BY hiredate;

#案例三:按年薪的高低显示员工的信息和年薪(按表达式排序)(别名);

SELECT *,salary*12*(1+ IFNULL (commission_pct,0)) AS 年薪 FROM employees ORDER BY 年薪 DESC ;

#案例四:按姓名的长度显示员工的姓名和工资(按函数排序)
SELECT LENGTH(last_name) 字节长度,last_name,salary FROM employees ORDER BY LENGTH(last_name) DESC;

#案例五:查询员工信息,先按工资排序,再按员工编号排序(按多个字段排序
SELECT * FROM employees ORDER BY salary ASC,employee_id DESC;

4. 常见函数

一.普通常见函数

length ,concat,upper,lower,substr,instr,trimlpad,rpad,replace

#1.
SELECT LENGTH();
#2.拼接
SELECT CONCAT();
#3.upper lower 变大写,变小写
SELECT UPPER();
#4.substr,substring  截取字符串
#索引从一开始,结果:olongnvbb
SELECT SUBSTR('xiaolongnvbb',3);
#表示截取从3开始所有字符
`#案例:substr截取从指定索引处指定长度的字符  结果:李莫愁
SELECT SUBSTR('李莫愁大坏蛋',1,3);`
```![在这里插入图片描述](https://img-blog.csdnimg.cn/20200219115321177.png)

```sql

`#案例:姓名中首字符大写,其他小写,然后用’——'拼接起来
SELECT CONCAT(UPPER(SUBSTR(last_name,1,1)),'_',LOWER(SUBSTR(last_name,2))) out_put FROM employees;
#5.instr 返回子串第一次出现的索引  结果:1
SELECT INSTR('abcdef','a');
#6.trim  去除a  结果:张翠山
SELECT TRIM('a' FROM 'aaaaaa张翠山aaaa')


#7.lpad  左填充指定长度的字符* 结果:*******abc
SELECT LPAD('abc',10,'*');


#8.rpad  右填充指定长度的   结果:abcacac
SELECT RPAD('abc',7,'ac');
#9.replace 替换  结果:张无忌爱上周芷若
SELECT REPLACE('张无忌爱上张敏','张敏','周芷若')


二、数学函数

  1. round :四舍五入
  2. ceil :向上取整 返回>=该参数的最小整数
  3. floor :向下取整
  4. truncate : 截断 select truncate (1.6999,1) 结果:1.6
  5. mod :取余

三、日期函数

1.now:返回当前系统日期加时间
2.curdata :返回当前日期,不加时间
3.curtime:返回时间,不包含日期
4.str_to_data: 将日期格式的字符转换成指定格式的日期
select str_to_data(‘1992-03-02’,’%Y-%m-%d’)

5.data_format: 将日期转化为字符
select data_format(‘2012/6/6’,’%Y/%m/%d‘)

6.datadiff:返回两个日期相差的天数月
7.monthname:以英文形式返回与

四、其他函数

select version()版本
select database() 当前数据库
user:当前用户
password(‘字符’):返回字符的密码形式 ,加密
md5(‘字符’):返回md5字符的密码形式

五、流程控制函数

1.if ifelse

SELECT last_name,commission_pct, IF(commission_pct IS NULL,"hehe",'xixi') 备注 FROM employees;

2.case:

  1. 语法:
    case 要判断的字段或表达式
    when 常量1 then 要显示的值1或语句1;
    when 常量2 then 要显示的值2或语句2;
    ……
    else 要显示的值n 或语句n
    end
/* 查询员工的工资
部门号=30 ,显示工资为1.2倍

部门号=40 ,显示工资为1.1倍
部门号=50 ,显示工资为1.3倍
其他部门,显示原工资

*/

SELECT salary ,department_id,
CASE department_id
WHEN 30 THEN salary*1.2
WHEN 40 THEN salary*1.1
WHEN 50 THEN salary*1.3
ELSE salary
END
FROM employees;



/*case

2 . case的 第二种用法,相当于if 不是等于

case
when 条件1 then 显示sth
when 条件2 then 显示sth
……
else 显示sth
end

*/
/*案例: 查询员工工资情况
如果工资>20000,显示a级
如果工资>15000,显示b级
如果工资>10000,显示c级
否则,显示d级
*/

SELECT salary,
CASE
WHEN salary >20000 THEN 'a'
WHEN salary>15000 THEN 'b'
WHEN salary>10000 THEN 'c'
ELSE 'd'
END

FROM employees;

分段函数

1.sum ,avg ,max, min ,count ,计算个数.

SELECT SUM(salary) ,MAX(salary) FROM employees;

2,sum,avg一般处理数值型
min,max,count 可以处理各种类型

3.以上函数都可以忽略了null;
4.与distinct搭配实现去重的运算
SELECT SUM(DISTINCT salary),SUM(salary) FROM employees;
5.count 的使用
计算行数

select count(*from employees;
select count(1from employees;  #写2也可以,写什么都可以

分组查询

group by:
/*
group by 支持单个字段和多个字段分组
语法:
select 分组函数,列(要求出现在group by的后面)
from 表
{where 分组前筛选条件}
group by 分组的列表
(having 分组后的筛选条件)
order by 子句
*/

#1111111.添加分组前的筛选条件
#1.查询每个工种的平均工资
SELECT AVG(salary),job_id FROM employees GROUP BY job_id;
#2.查询邮箱中包含a字符的,每个部门的平均工资
SELECT AVG(salary),department_id FROM employees WHERE email LIKE '%a%' GROUP BY department_id;
#2222222.添加分组后的筛选条件
#案例1. 查询哪个个部门的员工个数>2

SELECT COUNT(*),department_id FROM employees GROUP BY department_id HAVING COUNT(*)>2;


#33333333.按多个字段分组
#查询每个工种的每个部门的员工的平均工资,并且按平均工资的高低显示
SELECT AVG(salary),department_id,job_id FROM employees GROUP BY department_id,job_id ORDER BY AVG(salary) DESC;

连接查询

**

sql92:内连接

**

(1) 语法:select 查询列表
from 表1,表2
where 连接条件
(and 筛选条件)
(group by 分组字段)
(having 分组后的筛选条件)
(order by)
(2)连接类型:
等值连接
非等值连接 where 字段 between …and …
自连接

sql99

(1) 语法:
select 查询列表
from 表1 别名(连接类型)
jion 表2 别名
on 连接条件
(where 筛选条件)
(group by 分组)
(having 分组后的筛选条件)
(order by 排序列表)
(2)连接类型:

1.内连接 inner

内连接语法
SELECT 查询列表
FROM 表1 别名
INNER JOIN 表2
ON 连接条件
特点: INNER可以省略

#  等值连接
USE myemployees

案例一:查询员工名和部门名

SELECT last_name,department_name
FROM employees e
INNER JOIN departments d
ON e. department_id = d.department_id

三表连接
案例2 查询员工名,部门名,工种名,并按部门名降序

SELECT department_name,last_name,job_title
FROM employees e
INNER JOIN departments d ON e.department_id=d.department_id
INNER JOIN jobs j ON e.job_id = j.job_id
ORDER BY department_name DESC;

2.非等值连接 ON字段 BETWEEN 。。 AND。。
3.自连接

案例3查询员工的名字和上级的名字

SELECT e.last_name ,m.last_name
FROM employees e
JOIN employees m 
ON e.`manager_id`=m.employee_id;

2.外连接:

1.左外 left (outer)
2.右外 right(outer)
3.全外 full(outer)
特点
1.外连接的查询结果为主表中的所有记录
如果从表中有匹配的,则显示匹配的值
如果没有,显示NULL
外连接查询结果=内连接结果+主表中有而从表中没有的记录
2. 左外连接,LEFT JOIN 左边是主表
右外连接,RIGHT JOIN 右边是主表
3. 左外右外交换顺序,结果无差
案例一查询男朋友不在男神列表中的女神名
#左外连接 # 主要查询的女神类放在from后

SELECT b.name, bo.*
FROM beauty b
LEFT OUTER JOIN boys bo
ON b.boyfriend_id = bo.id
WHERE bo.id IS NULL

右外连接 :主要查询的女神类放在RIGHT OUTER JOIN后

SELECT b.name, bo.*
FROM boys bo
RIGHT OUTER JOIN  beauty b
ON b.boyfriend_id = bo.id
WHERE bo.id IS NULL

3.交叉连接 cross

(得到笛卡尔乘积)
语法案例:
.

select b.* ,bo.*  from beauty b cross join boys bo;

子查询

子查询含义:出现在其他语句中的select语句
分类:
子查询出现位置:
select后面支持标量子查询
from后面支持表子查询,
where having后面支持标量,行,列 子查询 ※※
exists后面 表子查询
按结果集的行列数不同:
标量子查询:结果只有一行一列
列子查询:结果一列多行)
行子查询:结果一行多列
表子查询:结果一般为多行

重点介绍:
(1)where或having后面
特点: 1.子查询放在小括号内
2.子查询一般放在条件的右侧
(一) 标量子查询:
案例:谁的工资比Abel高?
1.查询Abel的工资

SELECT salary FROM employees WHERE last_name = 'Abel'

2.查询员工信息,满足salary>1

SELECT * FROM employees WHERE salary>1

#总:

SELECT * FROM employees 
WHERE salary>(SELECT salary FROM employees WHERE last_name = 'Abel')

案例2;返回job_id与141号员工相同,salary比143号员工多的 员工姓名,job_id和工资

SELECT job_id FROM employees WHERE employee_id=141;
SELECT salary FROM employees WHERE employee_id=143
#总
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)

(二)列子查询(一列多行)
常用操作符
in /not in 等于列表中任意一个
any/some 和子查询返回的某一个值比较
all 和子查询返回的所有值比较
列子查询
案例1: 返回location_id是1400或1700的部门中的所有员工工资

#
SELECT department_id FROM departmrnts 
WHERE location_id IN(1400,1700)

#
SELECT salary FROM employees 
WHERE  department_id IN(
SELECT department_id FROM departments
WHERE location_id IN(1400,1700)
);

#案例2 返回其他工种中比job_id为‘IT_PROG’ 部门任意工资低的员工号,姓名,job_id,salary

# 
SELECT salary FROM employees
WHERE job_id = 'IT_PROG'

#zong

SELECT job_id,salary,last_name,employee_id FROM employees
WHERE salary < ANY(SELECT salary FROM employees
WHERE job_id =  'IT_PROG'
)AND job_id<>'IT_PROG'

3.行子查询 (不常用)

(2 ) select 后面
#查询每个部门的员工个数

SELECT d.*,(SELECT COUNT(*) FROM employees e WHERE e.`department_id`=d.department_id
)FROM departments d;

案例2 : 查询员工号=102 的部门名

SELECT 
(SELECT department_name FROM departments d 
INNER JOIN employees e ON e.department_id=d.department_id WHERE e.employee_id =102);
#等价于
SELECT 
(SELECT department_name FROM departments d 
, employees e WHERE e.department_id=d.department_id AND e.employee_id =102);

(3)from 后面
注:讲子查询结果充当一张表,必须起别名
查询每个部门的平均工资的工资等级

#1.查询每个部门的平均工资
SELECT AVG(salary) ag,department_id FROM employees GROUP BY department_id
 #2.连接表1,和job_grades表,筛选条件 between lowest_sal and highest_sal
 SELECT agv.*,g.grade_level
 FROM (SELECT AVG(salary),department_id FROM employees GROUP BY department_id
) agv 
INNER JOIN job_grades g 
ON agv.ag  BETWEEN lowest_sal AND highest_sal;

(4)相关子查询 exists 后面
语法:exists(完整查询语句) 结果:0或者1

查询有员工的部门名

#方法1
SELECT department_name FROM departments d
WHERE EXISTS(SELECT * FROM employees e WHERE e.department_id=d.department_id); 
#方法2 
SELECT department_name FROM departments d WHERE d.department_id IN(SELECT department_id FROM employees);

分页查询

语法: SELECT 查询列表
FROM 表
(inner JOIN表2
ON 连接条件
WHERE 筛选条件
GROUP BY 分组字段
HAVING 分组后的筛选条件
ORDER BY 排序的字段)
LIMIT OFFSET,size
OFFSET 要显示的起始索引 从0开始
size 要显示的条目个数
特点: 1.limit 放在最后
2.公式 有显示的页数page,每页的条目数size
SELECT 查询列表 FROM 表 LIMIT (page-1)*size,size;

案例一:查询前五条员工信息

 SELECT * FROM employees LIMIT 5;

案例二:查询第11条到第25条

 SELECT * FROM employees LIMIT 10,15;

联合查询

union 将多条查询语句的结果合并成一个结果
特点:1.要求 多条语句的查询列数一样
2.要求最好每一列的类型顺序相同

案例 查询部门编号>90或邮箱包含a的员工信息

SELECT * FROM employees WHERE department_id >90 OR email LIKE "%a%";

#等价
SELECT * FROM employees WHERE department_id >90 
UNION
SELECT * FROM employees WHERE email LIKE "%a%";

DML 语言 数据操作语言: 插入:insert 修改:updata 删除:delete

一、插入语句

方式一: 语法:insert into 表名(列名,……) values(值1……)

INSERT INTO beauty(id,NAME,phone,boyfriend_id)
VALUES (14,'shabi','12345678987',2)

特点:1.插入的值的类型要与列的类型一致
2.不可以为null的列必须插入值,可以为null的列如何插入值?
方式一:直接写null
方式二:直接不写 但必须保证列名和值都不写
3.列的顺序是否可以颠倒? 可以!
4.列数和值的个数必须一样
5. 可以省略列名,但列的顺序必须和表中一致。
方式二: 语法: insert into 表名 set 列名=值,列名=值,……

INSERT INTO beauty
SET id=13,NAME='shabi',phone='12345678987',boyfriend_id=2

两种方式大比拼:
1.方式1可以插入多行,方式二不可以

insert into 表(,,,)
values(,,,),
(,,,),
……;

2.方式1 支持子查询,方式2 不支持

二、修改语句

1.修改单表记录
语法: update 表名 set 列=新值,列=新值…… where 筛选条件
案例一修改 beauty表中姓唐 的女神的电话为12789990007

UPDATE beauty
SET phone=12789990007
WHERE NAME LIKE '唐%';

2.修改多表记录
语法:
(1)sql92语法:
update 表1 别名 , 表2 别名
set 列=值,……
where 连接条件
and 筛选条件;
(2)sql99语法:
update 表1 别名
inner、left、right join 表2
on 连接条件
set 列=值……
where 筛选条件;
案例: 修改张无忌女朋友手机号为123

UPDATE boys bo
JOIN beauty b
ON bo.id=b.boyfriend_id
SET b.phone='123'
WHERE bo.boyname='张无忌'

三、删除语句

方式1:语法:delete
1.单表删除****
delete from 表名 where筛选条件
2.多表删除(补充)
(1)sql92语法:
delete 表1的别名 , 表2的别名 #删除谁的信息,写哪个表的别名
from 表1 别名,表2 别名
where 连接条件
and 筛选条件;
(2)sql99语法:
delete 表1的别名,表2 的别名
inner、left、right join 表2 别名
on 连接条件
where 筛选条件;
单表删除
案例:删除手机号以9结尾的女神信息

DELETE FROM beauty WHERE phone LIKE '%9';

多表删除
删除张无忌的女朋友的信息

DELETE b
FROM boys bo
JOIN beauty b
ON b.id=b.boyfriend_id
WHERE bo.boyname='张无忌'
                   

方式2:truncate # 清空所有数据 不能加where 筛选条件
语法: truncate table 表名;

发布了31 篇原创文章 · 获赞 0 · 访问量 2682

猜你喜欢

转载自blog.csdn.net/kaxiaokui/article/details/104361731