mysql 增删改查

朝上 2022-01-15 02:31:57 阅读数:384

Mysql CSDN 数据库/缓存 增删 删改

一.常见命令

  1. 查看此仓库中的数据库容器
    命令:show databases; 此命令可查看此仓库中的数据库容器

image-20211113110105894数据库容器 information_schema中,存放数据库服务端的基本信息数据;

数据库容器 mysql中,存放的是用户信息、时区信息、表信息、函数、事件、存储过程等;

数据库容器 performance_schema中,在新版本数据库中才存在,存放性能信息;

数据库容器 test中,默认里面是空的,可以在里面编写表信息,进行操作测试;

2.切换至mysql数据库容器
命令:use mysql; 此命令表示切换至mysql数据库容器

3.显示当前数据库中的所有表结构
命令:show tables; 此命令表示显示当前数据库中的所有表结构

4.查看指定数据库中的表结构信息
命令:show tables from test; 查看test数据库中的表结构信息,注意可以在没切换到test数据库时查看

5.查看当前正在使用的数据库容器
命令:select database(); 查看当前正在使用的数据库容器

6.DDL建表语句
命令:

create table student(
id int,

name varchar(20),

gender char,

birthday datetime
);
7.DDL查看表结构
命令:desc student; 查看表结构

8.DQL查看表中数据
命令:select * from student; 查看表中数据

9.DML插入数据
命令:insert into student values(1,‘张三’,‘男’,‘2019-01-01’); 插入数据

注意:此时可能会出现乱码,windows自带的客户端默认的字符集编码是GBK,而服务器端默认字符集编码是UTF-8,当出现字符集编码不一致问题,就会导致乱码。此时需要修改编码集,使用命令:set names utf8;

10.DML修改数据
命令:update student set birthday = ‘2019-02-02’ where id=2; 修改数据

11.DML删除数据
命令:delete from student where id = 2; 删除数据

12.DDL修改表结构
命令:alter table student add column email varchar(24); 修改表结构,添加一列

13.DDL删除表结构
命令:drop table student; 删除表结构

14.退出
命令:exit 退出

15.注意事项
1). 不区分大小写

2). 注释

第一种:当行注释 使用#,例如:#aaa

第二种:当行注释 使用-- ,例如:-- aaa ,注意空格

第三种:多行注释 使用/* */,例如:/**/,不可以在嵌套注释

3). 以 ; 结尾

二.SQL语句

  1. 什么是SQL
    SQL(Structured Query Language)是“结构化查询语言”,它是对关系型数据库的操作语言。它可以应用到所有关系型数据库中,例如:MySQL、Oracle、SQServer等。

SQL标准有:

1986年,ANSI X3.135-1986,ISO/IEC 9075:1986,SQL-86

1989年,ANSI X3.135-1989,ISO/IEC 9075:1989,SQL-89

1992年,ANSI X3.135-1992,ISO/IEC 9075:1992,SQL-92(SQL2)

1999年,ISO/IEC 9075:1999,SQL:1999(SQL3)

2003年,ISO/IEC 9075:2003,SQL:2003

2008年,ISO/IEC 9075:2008,SQL:2008

2011年,ISO/IEC 9075:2011,SQL:2011

2016年,ISO/IEC 9075:2016,SQL:2016

这些标准就与JDK的版本一样,在新的版本中总要有一些语法的变化。不同时期的数据库对不同标准做了实现。

虽然SQL可以用在所有关系型数据库中,但很多数据库还都有标准之后的一些语法,我们可以称之为“方言”。例如MySQL中的LIMIT语句就是MySQL独有的方言,其它数据库都不支持!当然,Oracle或SQLServer都有自己的方言。

  1. SQL语法要求
    SQL语句可以单行或多行书写,以分号结尾;

可以用空格和缩进来来增强语句的可读性;

关键字不区别大小写,建议使用大写;

3.SQL分类
1). DQL(Data Query Language):数据查询语言,用来查询记录(数据) select

2). DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据) insert / update / delete

3). DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等 create / drop / alter/desc

4). DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别

5). TCL(Transaction Control Language) :事务控制语言 事务提交commit,事务回滚rollback,保存点savepoint

三.DQL数据查询语言

1 概念
DQL(Data Query Language):数据查询语言,用来查询记录(数据) 执行select操作

DQL就是数据查询语言,数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果集给客户端。

2 语法
SELECT

selection_list /要查询的列名称/

FROM

table_list /要查询的表名称/

WHERE

condition /行条件/

GROUP BY

grouping_columns /对结果分组/

HAVING

condition /分组后的行条件/

ORDER BY

sorting_columns /对结果排序/

LIMIT

offset_start, row_count /结果限定(分页)/
3.1.基础查询
select 查询列表 from 表名;

其中select后面跟的查询列表,可以有多个部分组成,中间用逗号隔开,例如:
select 字段1,字段2,表达式 from 表;
查询列表可以是:字段、表达式、常量、函数等

3.2.条件查询
select 查询列表 from 表名 where 筛选条件;
执行顺序

from子句
where子句
select子句
案例

– 一、按关系表达式筛选 关系运算符:> < >= <= = <> 补充:也可以使用!=,但不建议
#案例1:查询部门编号不是100的员工信息
select * from dept where dept_id <> 100;
#案例2:查询工资<15000的姓名、工资
select name ‘姓名’,salary ‘工资’ from emp where salary < 15000;

– 二、按逻辑表达式筛选 逻辑运算符:and or not 补充:也可以使用&& || ! ,但不建议
#案例1:查询部门编号不是 50-100之间员工姓名、部门编号、邮箱
select name ,dept_id , email from emp where dept_id not between 50 and 100;
#案例2:查询奖金率>0.03 或者 员工编号在60-110之间的员工信息
select * from emp where com_pct > 0.03 or id between 60 and 110 ;

– 三、模糊查询 like/not like
#案例1:查询姓名中包含字符a的员工信息
select * from emp where name like ‘%a%’;
#案例2:查询姓名中包含最后一个字符为e的员工信息
select * from emp where name like ‘%e’;
#案例3:查询姓名中包含第一个字符为e的员工信息
select * from emp where name like ‘e%’;
#案例4:查询姓名中包含第三个字符为x的员工信息
select * from emp where name like ‘__x%’;
#案例5:查询姓名中包含第二个字符为_的员工信息
– \斜杠可以转义后面的_下划线,代表此处_就是一个普通的下划线
select name , salary from emp where name like ‘_%’;
– escape 后面的字符,表示为此sql中使用的转义符号,代表此处_就是一个普通的下划线
select name , salary from emp where name like '
#_%’ escape ‘#’;


– 四、查询某字段的值是否属于指定的列表之内 in/not in


– 五、判断某个字段的值是否介于指定的区间范围 between and/not between and


– 六、查询是null字段 is null , 查询不是null字段 is not null

3.3 排序查询 order by
select 查询列表 from 表名 where 筛选条件 order by 排序列表
执行顺序

from子句
where子句
select子句
order by 子句
1、排序列表可以是单个字段、多个字段、表达式、函数、列数、以及以上的组合

2、升序 ,通过 asc ,默认行为
降序 ,通过 desc

3.4常见函数
函数:类似于java中学过的“方法”,为了解决某个问题,将编写的一系列的命令集合封装在一起,对外仅仅暴露函数名,供外部调用。

3.4.1 字符串函数
字符串函数名 函数说明
CONCAT(S1,S2,…,Sn) 连接S1,S2,…,Sn为一个字符串
CONCAT(s, S1,S2,…,Sn) 同CONCAT(s1,s2,…)函数,但是每个字符串之间要加上s
CHAR_LENGTH(s) 返回字符串s的字符数
LENGTH(s) 返回字符串s的字节数,和字符集有关
INSERT(str, index , len, instr) 将字符串str从第index位置开始,len个字符长的子串替换为字符串instr
UPPER(s) 或 UCASE(s) 将字符串s的所有字母转成大写字母
LOWER(s) 或LCASE(s) 将字符串s的所有字母转成小写字母
LEFT(s,n) 返回字符串s最左边的n个字符
RIGHT(s,n) 返回字符串s最右边的n个字符
LPAD(str, len, pad) 用字符串pad对str最左边进行填充,直到str的长度为len个字符
RPAD(str ,len, pad) 用字符串pad对str最右边进行填充,直到str的长度为len个字符
LTRIM(s) 去掉字符串s左侧的空格
RTRIM(s) 去掉字符串s右侧的空格
TRIM(s) 去掉字符串s开始与结尾的空格
TRIM(【BOTH 】s1 FROM s) 去掉字符串s开始与结尾的s1
TRIM(【LEADING】s1 FROM s) 去掉字符串s开始处的s1
TRIM(【TRAILING】s1 FROM s) 去掉字符串s结尾处的s1
REPEAT(str, n) 返回str重复n次的结果
REPLACE(str, a, b) 用字符串b替换字符串str中所有出现的字符串a
STRCMP(s1,s2) 比较字符串s1,s2
SUBSTRING(s,index,len) 返回从字符串s的index位置其len个字符
3.4.2 数学函数
数学函数名 函数说明
ABS(x) 返回x的绝对值
CEIL(x) 返回大于x的最小整数值
FLOOR(x) 返回大于x的最大整数值
MOD(x,y) 返回x/y的模
RAND(x) 返回0~1的随机值
ROUND(x,y) 返回参数x的四舍五入的有y位的小数的值
TRUNCATE(x,y) 返回数字x截断为y位小数的结果
SQRT(x) 返回x的平方根
POW(x,y) 返回x的y次方
3.4.3 日期时间函数
日期时间函数 函数说明
CURDATE() 或 CURRENT_DATE() 返回当前日期
CURTIME() 或 CURRENT_TIME() 返回当前时间
NOW() 返回当前系统日期时间
SYSDATE()
CURRENT_TIMESTAMP()
LOCALTIME()
LOCALTIMESTAMP()
YEAR(date) 返回指定时间的年
MONTH(date) 返回指定时间的月
DAY(date) 返回指定时间的日
HOUR(time) 返回指定时间的小时
MINUTE(time) 返回指定时间的分钟
SECOND(time) 返回指定时间的秒
WEEK(date) 返回一年中的第几周
WEEKOFYEAR(date)
DAYOFWEEK() 返回当前是周几,注意:周日是1,周一是2,。。。周六是7
WEEKDAY(date) 返回指定的时间是周几,注意,周1是0,周2是1,。。。周日是6
DAYNAME(date) 返回指定的时间是星期几:MONDAY,TUESDAY…SUNDAY
MONTHNAME(date) 返回指定的时间的月份:January,。。。。。
DATEDIFF(date1,date2) 返回date1 - date2的日期间隔
TIMEDIFF(time1, time2) 返回time1 - time2的时间间隔
DATE_ADD(datetime, INTERVALE expr , type) 返回与给定日期时间相差INTERVAL时间段的日期时间
DATE_FORMAT(datetime ,fmt) 按照字符串fmt格式化日期datetime值
STR_TO_DATE(str, fmt) 按照字符串fmt对str进行解析,解析为一个日期
– 5、DATE_FORMAT(datetime ,fmt) 按照字符串fmt格式化日期datetime值
#案例:查看100号员工入职日期
select employee_id , hiredate , DATE_FORMAT(hiredate,’%y-%m-%d %H:%i:%s 星期%w’) from employees where employee_id=100;

– 6、STR_TO_DATE 按指定格式解析字符串为日期类型
#案例:查看1998年6月以前入职的员工信息
select employee_id , hiredate
from employees
where hiredate < STR_TO_DATE(‘1998年6月’,’%Y年%m月’);
3.4.4流程控制函数
流程控制函数 函数说明
IF(value,t ,f) 如果value是真,返回t,否则返回f
IFNULL(value1, value2) 如果value1不为空,返回value1,否则返回value2
CASE WHEN 条件1 THEN result1 WHEN 条件2 THEN result2…[ELSE resultn] END 相当于Java的if…else if…
CASE expr WHEN 常量值1 THEN 值1 WHEN 常量值1 THEN 值1…[ELSE 值n] END 相当于Java的switch
– 1、IF函数
– 需求:如果有奖金,则显示最终奖金,如果没有,则显示0
– IF(expr1,expr2,expr3) expr1条件,expr1成立则显示expr2的值,否则显示expr3的值
select first_name , salary , if(salary>10000,‘白领’,‘蓝领’) from employees;
– IFNULL(expr1,expr2) 若expr1为null,则显示expr2值,若不为null则显示自身的值
select commission_pct , IFNULL(commission_pct,0) from employees;
select manager_id , IFNULL(manager_id,‘Boss’) from employees;

– 2、CASE函数
/*
情况1 :类似于switch语句,可以实现等值判断
CASE 表达式
WHEN 值1 THEN 结果1
WHEN 值2 THEN 结果2

ELSE 结果n
END
/
– 案例:部门编号是30,工资显示为2倍;部门编号是50,工资显示为3倍;部门编号是60,工资显示为4倍;否则不变;
– 显示部门编号,新工资,旧工资
select
department_id ‘部门编号’ ,
salary ‘旧工资’ ,
case department_id
when 30 then salary
2
when 50 then salary3
when 60 then salary
4
else salary
end as ‘newSalary’
from employees;

/*
情况2:类似于多重IF语句,实现区间判断
CASE
WHEN 条件1 THEN 结果1
WHEN 条件2 THEN 结果2

ELSE 结果n
END
*/
– 案例:如果工资>20000,显示级别A;工资>15000,显示级别B;工资>10000,显示级别C;否则,显示D
select
salary as ‘工资’,
case
when salary>20000 then ‘级别A’
when salary>15000 then ‘级别B’
when salary>10000 then ‘级别C’
else ‘级别D’
end as ‘level’
from employees;


3.4.5 分组(聚合)函数
分组函数往往用于实现将一组数据进行统计计算,最终得到一个值,又称为聚合函数或统计函数,聚合函数是用来做纵向运算的函数。


COUNT():统计指定列不为NULL的记录行数;

MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;

MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;

SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;

AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;

– 1、以上五个分组函数都忽略null值,除了count()
– 2、sum和avg一般用于处理数值型 , max、min、count可以处理任何数据类型
– 3、都可以搭配distinct使用,用于统计去重后的结果
– 4、count的参数可以支持:字段、常量值,一般放1
聚合函数无法用在WHERE中


– 错误用法
SELECT MIN(salary),manager_id
FROM employees
WHERE manager_id IS NOT NULL and MIN(salary)>=6000
GROUP BY manager_id;


– 正确用法
SELECT MIN(salary),manager_id
FROM employees
WHERE manager_id IS NOT NULL
GROUP BY manager_id
HAVING MIN(salary)>=6000;
3.5分组查询
当需要分组查询时需要使用GROUP BY子句,例如查询每个部门的平均工资,这说明要使用部门来分组。

语法

select 查询列表

from 表名

where 筛选条件

group by 分组列表

having 分组后筛选

order by 排序列表;
执行顺序

from 子句

where 子句

group by 子句

having 子句

select 子句

order by 子句
用法

查询列表往往是,分组函数和被分组的字段

分组查询中的筛选分为两类:

筛选的基表 使用的关键词 位置
分组前筛选 原始表 where group by的前面
分组后筛选 分组后的结果集 having group by的后面
顺序:where——group by ——having

总结:1.分组函数做条件只可能放在having后面

 2.一旦分组后,select查询列表只能出现group by后的分组字段,或者分组函数

3.6连接查询
连接查询又称多表查询,当查询语句涉及到的字段来自于多个表时,就会用到连接查询

直接多表查询,会出现问题: 笛卡尔乘积现象,记录数是 表1 有m行,表2有n行,结果=m*n行

#查看新建的表数据
select count() from girl; – 12
select count(
) from boy; – 6

#出现笛卡尔乘积现象
select girl.name ‘女’ , boy.name ‘男’ from girl , boy; – 72
发生原因:没有有效的连接条件,所有表中的所有行互相连接

如何避免:为了避免笛卡尔集, 可以在 WHERE 加入有效的连接条件

#解决方案:添加有效的连接条件
select girl.name ‘女’ , boy.name ‘男’ from girl , boy where girl.boyfriend_id = boy.id;
分析:

那么多表查询产生这样的结果并不是我们想要的,那么怎么去除重复的,不想要的记录呢,当然是通过条件过滤。通常要查询的多个表之间都存在关联关系,那么就通过关联关系去除笛卡尔积。

一、传统模式下的连接 :等值连接——非等值连接

1.等值连接的结果 = 多个表的交集
2.n表连接,至少需要n-1个连接条件
3.多个表不分主次,没有顺序要求
4.一般为表起别名,提高阅读性和性能


二、sql99语法:通过join关键字实现连接

含义:1999年推出的sql语法
支持: 内连接:等值连接 非等值连接 自连接
外连接: 左外连接 右外连接 全外连接(不支持)
交叉连接 :笛卡尔积
自然连接
– SQL92和SQL99的区别:
SQL99,使用 JOIN 关键字 代替了之前的逗号,并且将连接条件和筛选条件进行了分离,提高阅读性。!
3.6.1内连接
1). 语法
SELECT 查询列表

FROM 表名1 别名 [INNER] JOIN 表名2 别名

ON 连接条件

WHERE 筛选条件

GROUP BY 分组列表

HAVING 分组后筛选

ORDER BY 排序列表;
2). 等值连接
– 1.简单连接
#案例:查询员工名和部门名
select e.first_name ‘员工名’, d.department_name ‘部门名’
from employees e inner join departments d
on e.department_id = d.department_id;

– 2.添加筛选条件
#案例:查询部门编号>100的部门名和所在的城市名
select d.department_name ‘部门名’, l.city ‘所在城市名’
from departments d join locations l
on d.location_id = l.location_id
where d.department_id > 100;

– 3.添加分组
#案例:查询每个城市的部门个数
select l.city ‘城市’ , count(d.department_id) ‘部门个数’
from departments d join locations l
on d.location_id = l.location_id
group by l.city;

– 4.添加分组+排序
#案例:查询部门中员工个数>10的部门名,并按员工个数降序
select d.department_name ‘部门名’ , count(e.employee_id) ‘员工个数’
from employees e join departments d
on e.department_id = d.department_id
group by d.department_name
having count(e.employee_id)>10
order by count(e.employee_id) desc;

3). 非等值连接
#案例:查询部门编号在10-90之间的员工的工资级别,并按级别进行分组
select e.salary , e.department_id , g.grade_level ‘工资级别’
from employees e join job_grades g
on e.salary BETWEEN g.lowest_sal and g.highest_sal
where e.department_id BETWEEN 10 and 90;
4). 自连接
#3)、自连接
#案例:查询员工名和对应的领导名
select e.first_name ‘员工’ , m.first_name ‘领导’
from employees e join employees m
on e.manager_id = m.employee_id;
3.6.2外连接
1). 说明
查询结果为主表中所有的记录,如果从表有匹配项,则显示匹配项;如果从表没有匹配项,则显示null

2). 应用场景
一般用于查询主表中有但从表没有的记录

3). 用法
左连接的话,left join左边为主表;

右连接的话,right join右边为主表;

左/右外连接 = 内连接查询的结果 + 主表中有而从表中没有的记录

全外连接 = 内连接查询的结果 + 表1中有但表2中没有的记录 + 表2中有但表1中没有的记录

4). 语法
select 查询列表

from 表1 别名

left | right | full [outer] join 表2 别名

on 连接条件

where 筛选条件;
5). 左外连接 left outer join
SELECT FROM emp e LEFT OUTER JOIN dept d ON e.deptno=d.deptno;
注意:OUTER可以省略

左连接是先查询出左表(即以左表为主),然后查询右表,右表中满足条件的显示出来,不满足条件的显示NULL。

6). 右外连接 right outer join
SELECT FROM emp e RIGHT OUTER JOIN dept d ON e.deptno=d.deptno;
右连接就是先把右表中所有记录都查询出来,然后左表满足条件的显示,不满足显示NULL。例如在dept表中的40部门并不存在员工,但在右连接中,如果dept表为右表,那么还是会查出40部门,但相应的员工信息为NULL。

左/右外连接 = 内连接查询的结果 + 主表中有而从表中没有的记录

7). 全外连接 full outer join
全连接就是将表中所有记录都查询出来,且不允许重复。注:mysql 不支持。

全外连接 = 内连接查询的结果 + 表1中有但表2中没有的记录 + 表2中有但表1中没有的记录

#全外连接(不支持)
SELECT g.name , b.name
FROM boy b
FULL OUTER JOIN girl g ON g.boyfriend_id = b.id;
– mysql可以用如下方式实现全外连接
– UNION 联合查询
– 全外连接
/*
select 查询列表 from 表1 where 筛选条件
union
select 查询列表 from 表2 where 筛选条件

1、多条待联合的查询语句的查询列数必须一致,查询类型、字段意义最好一致
2、union实现去重查询
union all 实现全部查询,包含重复项

*/

查询出所有女神及男神信息
SELECT * FROM girl g RIGHT JOIN boy b on g.boyfriend_id = b.id
UNION
SELECT * FROM girl g LEFT JOIN boy b on g.boyfriend_id = b.id
3.6.3 交叉连接(笛卡尔乘积) CROSS JOIN
#交叉连接
SELECT g.name , b.name
FROM boy b
CROSS JOIN girl g ;
3.6.4 自然连接(不常用) NATURAL JOIN
大家也都知道,连接查询会产生无用笛卡尔积,我们通常使用主外键关系等式来去除它。

而自然连接无需你去给出主外键等式,它会自动找到这一等式:

两张连接的表中字段名称和类型完全一致的列作为条件,例如emp和dept表都存在deptno列,并且类型一致,所以会被自然连接找到!

当然自然连接还有其他的查找条件的方式,但其他方式都可能存在问题!

SELECT FROM emp NATURAL JOIN dept; – 内

SELECT FROM emp NATURAL LEFT JOIN dept; – 左外

SELECT FROM emp NATURAL RIGHT JOIN dept; – 右外
3.7子查询
概念

出现在其他语句的内部的select语句,称为子查询或内查询

里面嵌套其他select语句的查询语句,称为主查询或外查询

子查询不一定必须出现在select语句内部,只是出现在select语句内部的时候较多!

分类

按子查询出现的位置进行分类:

 1、select后面

​ 要求:子查询的结果为单行单列(标量子查询)

 2、from后面

​ 要求:子查询的结果可以为多行多列

 3、where或having后面

​ 要求:子查询的结果必须为单列;单行子查询;多行子查询

 4、exists后面

​ 要求:子查询结果必须为单列(相关子查询)

其中where或having后面是重点:

单行子查询
特点:子查询的结果集只有一行一列
多行子查询
特点:子查询的结果集有多行一列

特点

1、子查询语句需要放在小括号内,提高代码的阅读性

2、子查询先于主查询执行,一般来讲,主查询会用到子查询的结果

3、如果子查询放在条件中,一般来讲,子查询需要放在条件的右侧

 示例:where job_id>(子查询)
不能写成:where (子查询)<job_id

4、单行子查询对应的使用单行操作符: > < >= <= = <>

 多行子查询对应的使用多行操作符: in 、any 、all 、not in
in : 判断某字段是否在指定列表内 x in(10,30,50)
any : 判断某字段的值是否满足其中任意一个
x>any(10,30,50) x>min() x=any(10,30,50) x in(10,30,50)
all : 判断某字段的值是否满足里面所有的 x >all(10,30,50) x >max()

3.8分页查询
应用场景

当页面上的数据,一页显示不全,则需要分页显示

分页查询的sql命令请求数据库服务器——>服务器响应查询到的多条数据——>前台页面

语法

 select 查询列表
from 表1 别名
join 表2 别名
on 连接条件
where 筛选条件
group by 分组
having 分组后筛选
order by 排序列表
limit 起始条目索引,显示的条目数

其中 LIMIT 用来限定查询结果的起始行,以及每页显示行数。

MySQL limit关键字

Oracle rownum关键字

特点

 ①起始条目索引如果不写,默认是0

​ ②limit后面支持两个参数
​ 参数1:显示的起始条目索引
​ 参数2:条目数

公式
假如要显示的页数是page,每页显示的条目数为size

select *
from employees
limit (page-1)*size , size;


例如:
page size=10
1 limit 0,10
2 limit 10,10
3 limit 20,10
4 limit 30,10
3.9联合查询
应用场景

当查询结果来自于多张表,但多张表之间没有关联,这个时候往往使用联合查询,也称为union查询

1、多条待联合的查询语句的查询列数必须一致,查询类型、字段意义最好一致
2、union实现去重查询
union all 实现全部查询,包含重复项

总结:经常出现的查询顺序
from 子句

 join 子句
on 子句
where 子句
group by 子句
having 子句
select 子句
distinct 子句
order by 子句
limit 子句

四.DML 数据操作

1.1 指定插入的字段
语法

INSERT INTO 表名(列名1,列名2, …) VALUES(值1, 值2)

INSERT INTO stus(sid, sname,age,gender) VALUES(‘s_1001’, ‘zhangSan’, 23, ‘male’);

INSERT INTO stus(sid, sname) VALUES(‘s_1001’, ‘zhangSan’);
1.2 插入全部字段
语法

INSERT INTO 表名 VALUES(值1,值2,…)

因为没有指定要插入的列,表示按创建表时列的顺序插入所有列的值

INSERT INTO stus VALUES(‘s_1002’, ‘liSi’, 32, ‘female’);
注意:所有字符串数据必须使用单引号

2.修改数据
UPDATE 表名 SET 列名1=值1, … 列名n=值n [WHERE 条件]

UPDATE stus SET sname=‘zhangSanSan’, age=‘32’, gender=‘female’ WHERE sid=‘s_1001’;

UPDATE stus SET sname=‘liSi’, age=‘20’ WHERE age>50 AND gender=‘male’;

UPDATE stus SET sname=‘wangWu’, age=‘30’ WHERE age>60 OR gender=‘female’;

3.删除数据
DELETE FROM 表名 [WHERE 条件]

DELETE FROM stus WHERE sid=‘s_1001’;

DELETE FROM stus WHERE sname=‘chenQi’ OR age > 30;

DELETE FROM stus;
DELETE FROM stus WHERE sid=‘s_1001’;

DELETE FROM stus WHERE sname=‘chenQi’ OR age > 30;

DELETE FROM stus;
TRUNCATE TABLE 表名

TRUNCATE TABLE stus;
/*
面试题
delete
1. DML操作 表中数据
2. 删除时可以携带where条件
3. DELETE FROM 表名 WHERE 条件;
4. 会返回删除之后受影响的行数
5. 支持TCL操作,删除后的数据,可以根据事务回滚rollback,进行恢复
6. 删除所有数据之后,自增长的值会紧跟着继续向下增长

 truncate
1. 表中数据
2. 删除是不可以携带where条件
3. 语法 : truncate table 表名;
4. 删除后不返回受影响的行数
5. 不支持TCL操作
6. 删除所有数据化,自增长的值会恢复起始值继续往下增长
7. 直接删除整张表的结构,不会影响表的数据
8. 执行效率比delete高
drop
1. DDL操作表
2. 删除是不可以携带where条件
3. 语法:drop table [if exists] 表名;
4. 删除后不返回受影响的行数
5. 不支持TCL操作
6. 删除表结构,将同时释放创建表时的分配的一切资源

*/

五.DDL数据定义语言

数据类型:
数值型,字符型,时间类型,二进制类型

1.数值型
– int:整型 , 默认值是11 ,此处11为允许写的数值长度 Int占4个字节
– double/float:浮点数类型,例如double(5,2)表示最多5位,其中必须有2位小数,即最大值为999.99;
– decimal:定点数类型,在表示钱方面使用该类型,因为不会出现精度缺失问题;

2.字符型
/*
char:
1.固定长度字符串类型;char(n) n范围是0-255之间的整数
2. 实际分配多长,就占多长 ,
3.可以不指定长度 ,默认是1 ,
4.存储性别,标记
5.在查询数据时,会删除末尾空格
6.效率高
varchar:
1.可变长度字符串类型;varchar(n) n范围是0~65535之间的整数
2.实际使用多长,则占多长 ,
3.必须指定长度 ,
4.存储 姓名,密码,手机号,家庭地址
5.在查询数据时,会保留末尾空格
6.效率比 char 低
text:
1.字符串类型;表示存储较长文本 存储商品描述
/

3 时间类型
/

date:日期类型,格式为:yyyy-MM-dd;

time:时间类型,格式为:hh:mm:ss

timestamp/datetime:时间戳类型;日期+时间 此种类型yyyyMMddhhmmss也可
/

4.二进制类型
/

类型 大小(字节)
TinyBlob 255
Blob 65k
MediumBlob 16m
LongBlob 4G
*/

约束条件

#约束条件
/*
1.主键约束
primary key 表示当前字段唯一且非空,整张表只有一个主键,但是可以有联合主键

2.外键约束
foreign key 当前字段的值一定来源于某张表中的主键值 , 整张表允许设置多个外键约束

3.非空约束
not null 当前字段不能为空,必填,允许多设置
4.默认约束
default 当前字段可以不填写值,会有默认值,需要时插入使用defaut关键字,允许设置多个


5.唯一约束
unique 当前字段不允许重复,可以用于昵称,手机号,唯一字段,允许多个唯一约束

6.检查约束:MYSQL不支持 Oracle支持
check 当插入的值必须在我们的范围之内

/

#面试题:主键约束和唯一约束的区别?
/

关键字 意义 出现的次数 联合键
主键约束 PRIMARY KEY 非空且唯一 仅有一个 支持
唯一约束 UNIQUE 唯一 允许有多个 支持
/

#面试题:列级约束和表级约束的区别?
/

列级约束:
1.直接在声明字段之后 字段名 数据类型 约束条件
2.支持主键约束、默认约束、唯一约束、检查约束、非空约束
3.不能自定义约束名称,一般默认使用字段名作为约束名称

表级约束
1.在所有字段声明结束之后
2.支持主键约束、唯一约束、检查约束、外键约束
3.若使用constraint,自定义约束名称

*/

版权声明:本文为[朝上]所创,转载请带上原文链接,感谢。 https://blog.csdn.net/m0_51051154/article/details/121303398