当前位置: 首页 > web >正文

MYSQL数据库

什么是数据库?

数据库 : 是统一管理的、长期储存在计算机内的、有组织的相关数据的集合。

数据库的特征? 

数据库的基本特征包括:数据按一定的数据模型组织、描述和储存;数据间联系密切、冗余度较小;数据独立性较高;易扩展;可为各种用户共享。

数据库可以做什么?

  1. 数据存储:数据库能够存储和管理大量的数据,将数据以一定的结构存储在计算机中,使得数据的存储、管理、检索更加高效和便捷。
  2. 数据管理:数据库可以对数据进行增加、删除、修改、查询等操作,并且可以对数据进行权限控制,保证数据的安全性和完整性。
  3. 数据分析:数据库可以连接各种数据源,对数据进行提取、转换、加载等操作,从而将数据转换成有用的信息,为决策提供支持。

 为什么要学习数据库?

应用程序产生的数据是在内存中的,如果程序退出或者是断电了,则数据就会消失。使用数据库是为了能够永久保存数据。

MySQLOracleSqlServer是什么?

MySQL Oracle SqlServer 都是数据库管理系统( DBMS Database Management System)是一种操纵和管理数据库的大型软件,例如建立、使用和维护数据库。

SQL是什么?

SQL 是结构化查询语言( Structure Query Language ),专门用来操作 / 访问数据库的通用语言。

 什么是关系型数据库和非关系数据库?

MySQL Oracle SqlServer 等是关系型数据库管理系统。
MongoDB Redis Elasticsearch 等是非关系型数据库管理系统。

 MySQL的优点有很多,其中主要的优势有如下几点:

  1. 可移植性:MySQL数据库几乎支持所有的操作系统,如LinuxSolarisFreeBSDMac和 Windows。
  2. 免费:MySQL的社区版完全免费,一般中小型网站的开发都选择 MySQL 作为网站数据库。
  3. 开源:2000 年,MySQL公布了自己的源代码,并采用GPLGNU General Public License)许可
  4. 协议,正式进入开源的世界。开源意味着可以让更多人审阅和贡献源代码,可以吸纳更多优秀人才
  5. 的代码成果。
  6. 关系型数据库:MySQL可以利用标准SQL语法进行查询和操作。
  1. 速度快、体积小、容易使用:与其他大型数据库的设置和管理相比,其复杂程度较低,易于学习。
  2. MySQL的早期版本(主要使用的是MyISAM引擎)在高并发下显得有些力不从心,随着版本的升级
  3. 优化(主要使用的是InnoDB引擎),在实践中也证明了高压力下的可用性。从2009年开始,阿里
  4. IOE”备受关注,淘宝DBA团队再次从Oracle转向MySQL,其他使用MySQL数据库的公司还有
  5. FacebookTwitterYouTube、百度、腾讯、去哪儿、魅族等等,自此,MySQL在市场上占据了
  6. 很大的份额。
  7. 安全性和连接性:十分灵活和安全的权限和密码系统,允许基于主机的验证。连接到服务器时,所
  8. 有的密码传输均采用加密形式,从而保证了密码安全。由于MySQL是网络化的,因此可以在因特网上的任何地方访问,提高数据共享的效率。
  9. 丰富的接口:提供了用于CC++JavaPHPPythonRubyEiffelPerl等语言的API
  10. 灵活:MySQL并不完美,但是却足够灵活,能够适应高要求的环境。同时,MySQL既可以嵌入到
  11. 应用程序中,也可以支持数据仓库、内容索引和部署软件、高可用的冗余系统、在线事务处理系统
  12. 等各种应用类型。
  13. MySQL最重要、最与众不同的特性是它的存储引擎架构,这种架构的设计将查询处理(Query
  14. Processing)及其他系统任务(Server Task)和数据的存储/提取相分离。这种处理和存储分离的
  15. 设计可以在使用时根据性能、特性,以及其他需求来选择数据存储的方式。MySQL中同一个数据
  16. 库,不同的表格可以选择不同的存储引擎。其中使用最多的是InnoDB MyISAMMySQL5.5之后
  17. InnoDB是默认的存储引擎。

 SQL语句

SQL的分类

DDL 语句:数据定义语句( Data Define Language ),例如:创建( create ),修改( alter ),删除(drop )等
DML 语句:数据操作语句,例如:增( insert) ,删( delete ),改( update ),查( select
因为查询语句使用的非常的频繁,所以很多人把查询语句单拎出来一类, DQL (数据查询语言), DR(获取)L
DCL 语句:数据控制语句,例如: grant commit rollback
其他语句: USE 语句, SHOW 语句, SET 语句等。这类的官方文档中一般称为命令。

 SQL语法规范

1 mysql sql 语法不区分大小写
A :数据库的表中的数据是否区分大小写。这个的话要看表格的字段的数据类型、编码方式以及校对规则。
ci (大小写不敏感), cs (大小写敏感), _bin (二元,即比较是基于字符编码的值而与 language 无关,区分大小写)
B sql 中的关键字,比如: create,insert 等,不区分大小写。但是大家习惯上把关键字都 大写
2 )命名时:尽量使用 26 个英文字母大小写,数字 0-9 ,下划线,不要使用其他符号
3 )建议不要使用 mysql 的关键字等来作为表名、字段名、数据库名等,如果不小心使用,请在 SQL 语句中使用` (飘号)引起来
4 )数据库和表名、字段名等对象名中间不要包含空格
5 )同一个 mysql 软件中,数据库不能同名,同一个库中,表不能重名,同一个表中,字段不能重名

SQL脚本中如何加注释 

SQL脚本中如何加注释

单行注释:#注释内容(mysql特有的)

单行注释:--空格注释内容 其中--后面的空格必须有

多行注释: /* 注释内容 */

mysql脚本中的标点符号

mysql 脚本中标点符号的要求如下:
本身成对的标点符号必须成对,例如: () '' ""
所有标点符号必须英文状态下半角输入方式下输入。

DQL

SELECT语句

SELECT 语句是用于查看计算结果、或者查看从数据表中筛选出的数据的。
SELECT 语句的基本语法:
SELECT 常量;
SELECT 表达式;
SELECT 函数;
如果要从数据表中筛选数据,需要加 FROM 子句。 FROM 指定数据来源。字段列表筛选列。
SELECT 字段列表 FROM 表名称;
如果要从数据表中根据条件筛选数据,需要加 FROM WHERE 子句。 WHERE 筛选行。
SELECT 字段列表 FROM 表名称 WHERE 条件;

使用别名

在当前 select 语句中给某个字段或表达式计算结果,或表等取个临时名称,便于当前 select 语句的编写和理解。这个临时名称称为别名。
select 字段名1 as "别名1", 字段名2 as "别名2" from 表名称 as 别名;
列的别名有空格时,请加双引号。 列的别名中没有空格时,双引号可以加也可以不加
表的别名 不能 加双引号 ,表的别名中间不能包含空格。
as 大小写都可以, as 也完全可以省略。
#查询薪资高于15000的员工姓名和薪资
select ename,salary from t_employee where salary>15000;
mysql> select ename,salary from t_employee where salary>15000;#查询薪资正好是9000的员工姓名和薪资
select ename,salary from t_employee where salary = 9000;
select ename,salary from t_employee where salary == 9000;#错误,不支持== #注意Java
中判断用==,mysql判断用=mysql> select ename,salary from t_employee where salary == 9000;
ERROR 1064 (42000): You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right
syntax to use near '== 9000' at line 1

区间或集合范围比较运算符

区间范围:between x and y
not between x and y
集合范围:in (x,x,x)
not in(x,x,x)
#查询薪资在[10000,15000]
select * from t_employee where salary>=10000 && salary<=15000;
select * from t_employee where salary between 10000 and 15000;
#查询籍贯在这几个地方的
select * from t_employee where native_place in ('北京', '浙江', '江西');
#查询薪资不在[10000,15000]
select * from t_employee where salary not between 10000 and 15000;
#查询籍贯不在这几个地方的
select * from t_employee where native_place not in ('北京', '浙江', '江西');

模糊匹配比较运算符

 %:代表任意个字符

_ :代表一个字符,如果两个下划线代表两个字符

#查询名字中包含'冰'字
select * from t_employee where ename like '%冰%';
#查询名字以‘雷'结尾的
select * from t_employee where ename like '%雷';
#查询名字以’李'开头
select * from t_employee where ename like '李%';
#查询名字有冰这个字,但是冰的前面只能有1个字
select * from t_employee where ename like '_冰%';#查询当前mysql数据库的字符集情况
show variables like '%character%';

逻辑运算符

逻辑与:&& 或 and
逻辑或:|| 或 or
逻辑非:! 或 not#查询薪资高于15000,并且性别是男的员工
select * from t_employee where salary>15000 and gender='男';select * from t_employee where salary>15000 && gender='男';
select * from t_employee where salary>15000 & gender='男';#错误 &按位与
select * from t_employee where (salary>15000) & (gender='男');#查询薪资高于15000,或者did为1的员工
select * from t_employee where salary>15000 or did = 1;
select * from t_employee where salary>15000 || did = 1;
#查询薪资不在[15000,20000]范围的
select * from t_employee where salary not between 15000 and 20000;
select * from t_employee where !(salary between 15000 and 20000);

关于null值的问题

#(1)判断时
xx is null
xx is not null
xx <=> null
#(2)计算时
ifnull(xx,代替值) 当xx是null时,用代替值计算#查询奖金比例为null的员工
select * from t_employee where commission_pct = null; #失败
select * from t_employee where commission_pct = NULL; #失败
select * from t_employee where commission_pct = 'NULL'; #失败
select * from t_employee where commission_pct is null; #成功
select * from t_employee where commission_pct <=> null; #成功 <=>安全等于#查询员工的实发工资,实发工资 = 薪资 + 薪资 * 奖金比例
select ename , salary + salary * commission_pct "实发工资" from t_employee; #失败,
当commission_pct为null,结果都为null
select ename ,salary , commission_pct, salary + salary *
ifnull(commission_pct,0) "实发工资" from t_employee;

关联查询(联合查询)

什么是关联查询

关联查询:两个或更多个表一起查询。
前提条件:这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段,这个关联字段可能建立了外键,也可能没有建立外键。
比如:员工表和部门表,这两个表依靠 部门编号 进行关联

关联查询结果分为几种情况

关联查询的SQL有几种情况

1 、内连接: inner join ... on
结果: A B
#演示内连接,结果是A∩B
/*
观察数据:
t_employee 看成A表
t_department 看成B表
此时t_employee (A表)中有 李红和周洲的did是NULL,没有对应部门,
t_department(B表)中有 测试部,在员工表中找不到对应记录的。
*/
#查询所有员工的姓名,部门编号,部门名称
#如果员工没有部门的,不要
#如果部门没有员工的,不要
/*
员工的姓名在t_employee (A表)中
部门的编号,在t_employee (A表)和t_department(B表)都有
部门名称在t_department(B表)中
所以需要联合两个表一起查询。
*/
SELECT ename,did,dname
FROM t_employee INNER JOIN t_department;
#错误Column 'did' in field list is ambiguous
#因为did在两个表中都有,名字相同,它不知道取哪个表中字段了
#有同学说,它俩都是部门编号,随便取一个不就可以吗?
#mysql不这么认为,有可能存在两个表都有did,但是did的意义不同的情况。
#为了避免这种情况,需要在编写sql的时候,明确指出是用哪个表的did
SELECT ename,t_department.did,dname
FROM t_employee INNER JOIN t_department;
#语法对,结果不太对
#结果出现“笛卡尔积”现象, A表记录 * B表记录
/*
(1)凡是联合查询的两个表,必须有“关联字段”,
关联字段是逻辑意义一样,数据类型一样,名字可以一样也可以不一样的两个字段。
比如:t_employee (A表)中did和t_department(B表)中的did。
发现关联字段其实就是可以建外键的字段。当然联合查询不要求一定建外键。
(2)联合查询必须写关联条件,关联条件的个数 = n - 1.n是联合查询的表的数量。
如果2个表一起联合查询,关联条件数量是1,
如果3个表一起联合查询,关联条件数量是2,
如果4个表一起联合查询,关联条件数量是3,
。。。。
否则就会出现笛卡尔积现象,这是应该避免的。
(3)关联条件可以用on子句编写,也可以写到where中。
但是建议用on单独编写,这样呢,可读性更好。
每一个join后面都要加on子句
A inner|left|right join B on 条件
A inner|left|right join B on 条件 inner|left|right jon C on 条件
*/
SELECT ename,t_department.did,dname
FROM t_employee INNER JOIN t_department
ON t_employee.did = t_department.did;
SELECT *
FROM t_employee INNER JOIN t_department
ON t_employee.did = t_department.did;
#查询部门编号为1的女员工的姓名、部门编号、部门名称、薪资等情况
SELECT ename,gender,t_department.did,dname,salary
FROM t_employee INNER JOIN t_department
ON t_employee.did = t_department.did
WHERE t_department.did = 1 AND gender = '女';
#查询部门编号为1的员工姓名、部门编号、部门名称、薪资、职位编号、职位名称等情况
SELECT ename,gender,t_department.did,dname,salary,job_id,jname
FROM t_employee INNER JOIN t_department ON t_employee.did = t_department.did
INNER JOIN t_job ON t_employee.`job_id` = t_job.`jid`
WHERE t_department.did = 1;
2 、左连接: A left join B on
2 A 表全部
3 A - A B
#演示左连接
/*
(2)A
(3)A-A∩B
*/
/*
观察数据:
t_employee 看成A表
t_department 看成B表
此时t_employee (A表)中有 李红和周洲的did是NULL,没有对应部门,
t_department(B表)中有 测试部,在员工表中找不到对应记录的。
*/
#查询所有员工,包括没有指定部门的员工,他们的姓名、薪资、部门编号、部门名称
SELECT ename,salary,t_department.did,dname
FROM t_employee LEFT JOIN t_departmentON t_employee.did = t_department.did;
#查询的是A结果 A left join B
#查询没有部门的员工信息
SELECT ename,salary,t_department.did,dname
FROM t_employee LEFT JOIN t_department
ON t_employee.did = t_department.did
WHERE t_employee.did IS NULL;
#查询的结果是A - A∩B
#此时的where条件,建议写子表的关联字段is null,这样更准确一点。
#如果要建外键,它们肯定有子表和父表的角色,写子表的关联字段is null
#因为父表中这个字段一般是主键,不会为null。
3 、右连接: A right join B on
4 B 表全部
5 B -A B
/*
右连接
(4)B
(5)B - A∩B
*/
#演示右连接
/*
观察数据:
t_employee 看成A表
t_department 看成B表
此时t_employee (A表)中有 李红和周洲的did是NULL,没有对应部门,
t_department(B表)中有 测试部,在员工表中找不到对应记录的。
*/
#查询所有部门,包括没有对应员工的部门,他们的姓名、薪资、部门编号、部门名称
SELECT ename,salary,t_department.did,dname
FROM t_employee RIGHT JOIN t_department
ON t_employee.did = t_department.did;
#查询的是B结果 A RIGHT join B
#查询没有员工部门的信息
SELECT ename,salary,t_department.did,dname
FROM t_employee RIGHT JOIN t_department
ON t_employee.did = t_department.did
WHERE t_employee.did IS NULL;
#查询的结果是B - A∩B
#此时的where条件,建议写子表的关联字段is null,这样更准确一点。
#如果要建外键,它们肯定有子表和父表的角色,写子表的关联字段is null
#因为父表中这个字段一般是主键,不会为null。
#查询所有员工,包括没有指定部门的员工,他们的姓名、薪资、部门编号、部门名称
SELECT ename,salary,t_department.did,dname
FROM t_department RIGHT JOIN t_employee
ON t_employee.did = t_department.did;
#查询的是B结果 A RIGHT join B
#查询没有部门的员工信息
SELECT ename,salary,t_department.did,dnameFROM t_department RIGHT JOIN t_employee
ON t_employee.did = t_department.did
WHERE t_employee.did IS NULL;
#查询的结果是B - A∩B A right join B
#此时的where条件,建议写子表的关联字段is null,这样更准确一点。
#如果要建外键,它们肯定有子表和父表的角色,写子表的关联字段is null
#因为父表中这个字段一般是主键,不会为null。
4 、全外连接: full outer join ... on ,但是 mysql 不支持这个关键字, mysql 使用 union (合并)结果的方式代替
6 A 表∪ B 表: 2 A 表结果 union 4 B 表的结果
7 A B - A B 3 A - A B 结果 union 5 B -A B 结果
/*
union实现
(6)A∪B
(7)A∪B - A∩B
A-A∩B ∪ B-A∩B
*/
#演示用union合并两个查询结果实现A∪B 和A∪B - A∩B
/*
union合并时要注意:
(1)两个表要查询的结果字段是一样的
(2)UNION ALL表示直接合并结果,如果有重复的记录一并显示
ALL去掉表示合并结果时,如果有重复记录,去掉。
(3)要实现A∪B的结果,那么必须是合并 查询是A表结果和查询是B表结果的select语句。
同样要实现A∪B - A∩B的结果,那么必须是合并查询是A-A∩B结果和查询是B-A∩B的select语句。
*/
#查询所有员工和所有部门,包括没有指定部门的员工和没有分配员工的部门。
SELECT *
FROM t_employee LEFT JOIN t_department
ON t_employee.did = t_department.did
UNION
SELECT *
FROM t_employee RIGHT JOIN t_department
ON t_employee.did = t_department.did;
#以下union会报错
SELECT * FROM t_employee
UNION
SELECT * FROM t_department;
/*
错误代码: 1222
The used SELECT statements have a different number of columns
两个Select语句的列数是不同的。
column:列,表中的字段。
columns:很多的字段,即字段列表
select 字段列表 from 表名称;
*/
#联合 查询结果是A表的select 和查询结果是A∩B的select语句,是得不到A∪B
SELECT *
FROM t_employee LEFT JOIN t_department
ON t_employee.did = t_department.did
UNION
SELECT *
FROM t_employee INNER JOIN t_department
ON t_employee.did = t_department.did;
#查询那些没有分配部门的员工和没有指定员工的部门,即A表和B表在对方那里找不到对应记录的数据。
SELECT *
FROM t_employee LEFT JOIN t_department
ON t_employee.did = t_department.did
WHERE t_employee.did IS NULL
UNION
SELECT *
FROM t_employee RIGHT JOIN t_department
ON t_employee.did = t_department.did
WHERE t_employee.did IS NULL;

联合查询字段列表问题

#查询字段的问题
#查询每一个员工及其所在部门的信息
#要求:显示员工的编号,姓名,部门编号,部门名称
SELECT eid,ename,did,dname
FROM t_employee INNER JOIN t_department
ON t_employee.did = t_department.did;
/*
错误代码: 1052
Column 'did' in field list is ambiguous(模糊不清的;引起歧义的)
*/
SELECT eid,ename,t_employee.did,dname
FROM t_employee INNER JOIN t_department
ON t_employee.did = t_department.did;
#查询每一个员工及其所在部门的信息
#要求,显示员工的编号,姓名,部门表的所有字段
SELECT eid,ename,t_department.*
FROM t_employee INNER JOIN t_department
ON t_employee.did = t_department.did;

 select7大子句

7大子句顺序

  1. from:从哪些表中筛选
  2. on:关联多表查询时,去除笛卡尔积
  3. where:从表中筛选的条件
  4. group by:分组依据
  5. having:在统计结果中再次筛选(with rollup)
  6. order by:排序
  7. limit:分页

 演示

from 子句
#1、from子句
SELECT *
FROM t_employee; #表示从某个表中筛选数据
on 子句
#2、on子句
/*
(1)on必须配合join使用
(2)on后面只写关联条件
所谓关联条件是两个表的关联字段的关系
(3)有n张表关联,就有n-1个关联条件
两张表关联,就有1个关联条件
三张表关联,就有2个关联条件
*/
SELECT *
FROM t_employee INNER JOIN t_department
ON t_employee.did = t_department.did; #1个关联条件
#查询员工的编号,姓名,职位编号,职位名称,部门编号,部门名称
#需要t_employee员工表,t_department部门表,t_job职位表
SELECT eid,ename,t_job.job_id,t_job.job_name,
`t_department`.`did`,`t_department`.`dname`
FROM t_employee INNER JOIN t_department INNER JOIN t_job
ON t_employee.did = t_department.did AND t_employee.job_id = t_job.job_id;
where 子句
#3、where子句,在查询结果中筛选
#查询女员工的信息,以及女员工的部门信息
SELECT *
FROM t_employee INNER JOIN t_department
ON t_employee.did = t_department.did
WHERE gender = '女';
group by 子句
#4、group by分组
#查询所有员工的平均薪资
SELECT AVG(salary) FROM t_employee;
#查询每一个部门的平均薪资
SELECT did,ROUND(AVG(salary),2 )
FROM t_employee
GROUP BY did;
#查询每一个部门的平均薪资,显示部门编号,部门的名称,该部门的平均薪资
SELECT t_department.did,dname,ROUND(AVG(salary),2 )
FROM t_department LEFT JOIN t_employee
ON t_department.did = t_employee.did
GROUP BY t_department.did;
#查询每一个部门的平均薪资,显示部门编号,部门的名称,该部门的平均薪资
#要求,如果没有员工的部门,平均薪资不显示null,显示0
SELECT t_department.did,dname,IFNULL(ROUND(AVG(salary),2),0)
FROM t_department LEFT JOIN t_employee
ON t_department.did = t_employee.did
GROUP BY t_department.did;
#查询每一个部门的女员工的平均薪资,显示部门编号,部门的名称,该部门的平均薪资
#要求,如果没有员工的部门,平均薪资不显示null,显示0
SELECT t_department.did,dname,IFNULL(ROUND(AVG(salary),2),0)
FROM t_department LEFT JOIN t_employee
ON t_department.did = t_employee.did
WHERE gender = '女'
GROUP BY t_department.did;
having 子句
#5、having
/*
having子句也写条件
where的条件是针对原表中的记录的筛选。where后面不能出现分组函数。
having子句是对统计结果(分组函数计算后)的筛选。having可以加分组函数。
*/
#查询每一个部门的女员工的平均薪资,显示部门编号,部门的名称,该部门的平均薪资
#要求,如果没有员工的部门,平均薪资不显示null,显示0
#最后只显示平均薪资高于12000的部门信息
SELECT t_department.did,dname,IFNULL(ROUND(AVG(salary),2),0)
FROM t_department LEFT JOIN t_employee
ON t_department.did = t_employee.did
WHERE gender = '女'
GROUP BY t_department.did
HAVING IFNULL(ROUND(AVG(salary),2),0) >12000;
#查询每一个部门的男和女员工的人数
SELECT did,gender,COUNT(*)
FROM t_employee
GROUP BY did,gender;
#查询每一个部门的男和女员工的人数,显示部门编号,部门的名称,性别,人数
SELECT t_department.did,dname,gender,COUNT(eid)
FROM t_employee RIGHT JOIN t_department
ON t_employee.did = t_department.did
GROUP BY t_department.did,gender;
#查询每一个部门薪资超过10000的男和女员工的人数,显示部门编号,部门的名称,性别,人数
#只显示人数低于3人
SELECT t_department.did,dname,gender,COUNT(eid)
FROM t_employee RIGHT JOIN t_department
ON t_employee.did = t_department.did
WHERE salary > 10000
GROUP BY t_department.did,gender
HAVING COUNT(eid) < 3;
order by 子句
#6、排序 order by
/*
升序和降序,默认是升序
asc代表升序
desc 代表降序
*/
#查询员工信息,按照薪资从高到低
SELECT * FROM t_employee
ORDER BY salary DESC;
#查询每一个部门薪资超过10000的男和女员工的人数,显示部门编号,部门的名称,性别,人数
#只显示人数低于3人,按照人数升序排列
SELECT t_department.did,dname,gender,COUNT(eid)
FROM t_employee RIGHT JOIN t_department
ON t_employee.did = t_department.did
WHERE salary > 10000
GROUP BY t_department.did,gender
HAVING COUNT(eid) < 3
ORDER BY COUNT(eid);
#查询员工的薪资,按照薪资从低到高,薪资相同按照员工编号从高到低
SELECT *
FROM t_employee
ORDER BY salary ASC , eid DESC;
limit 子句
#演示limit子句
/*
limit子句是用于分页显示结果。
limit m,n
n:表示最多该页显示几行
m:表示从第几行开始取记录,第一个行的索引是0
m = (page-1)*n page表示第几页
每页最多显示5条,n=5
第1页,page=1,m = (1-1)*5 = 0; limit 0,5
第2页,page=2,m = (2-1)*5 = 5; limit 5,5
第3页,page=3,m = (3-1)*5 = 10; limit 10,5
*/
#查询员工表的数据,分页显示,每页显示5条记录
#第1页
SELECT * FROM t_employee LIMIT 0,5;
#第2页
SELECT * FROM t_employee LIMIT 5,5;
#第3页
SELECT * FROM t_employee LIMIT 10,5;
#第4页
SELECT * FROM t_employee LIMIT 15,5;
#第5页
SELECT * FROM t_employee LIMIT 20,5;
智榜样
第8章 子查询
8.1 SELECT的SELECT中嵌套子查询
8.2 SELECT的WHERE或HAVING中嵌套子查询
#第6页
SELECT * FROM t_employee LIMIT 25,5;
#查询所有的男员工信息,分页显示,每页显示3条,第2页
#limit m,n n=3,page=2,m=(page-1)*n=3
SELECT *
FROM t_employee
WHERE gender ='男'
LIMIT 3,3
#查询每一个编号为偶数的部门,显示部门编号,名称,员工数量,
#只显示员工数量>=2的结果,按照员工数量升序排列,
#每页显示2条,显示第1页
SELECT t_department.did,dname,COUNT(eid)
FROM t_employee RIGHT JOIN t_department
ON t_employee.did = t_department.did
WHERE t_department.did%2=0
GROUP BY t_department.did
HAVING COUNT(eid)>=2
ORDER BY COUNT(eid)
LIMIT 0,2;

添加语句

添加一条记录到某个表中

insert into 表名称 values(值列表); #值列表中的值的顺序、类型、个数必须与表结构一一对应insert into teacher values(1,'张三',15000,120.5,'1990-5-1','男','O','13789586859');
insert into teacher values(2,'李四',15000,'1990-5-1','男','O','13789586859'); #缺体重weight的值
ERROR 1136 (21S01): Column(列) count(数量) doesn't match(不匹配) value(值)count(数量) at row 1

添加多条记录到某个表中

insert into 表名称 values(值列表),(值列表),(值列表); #值列表中的值的顺序、类型、个数必须与表结构一一对应insert into 表名称 (字段列表) values(值列表),(值列表),(值列表); #值列表中的值的顺序、类型、个数必须与(字段列表)一一对应insert into teacher (tid,tname,salary,phone)
values(4,'赵六',16000,'15789546586'),
(5,'汪飞',18000,'15789548886'),
(6,'天琪',19000,'15909546586');

修改语句

修改所有行

update 表名称 set 字段名 = 值, 字段名 = 值; #给所有行修改#修改所有人的薪资,都涨了1000
update teacher set salary = salary + 1000 ;

修改部分行

update 表名称 set 字段名 = 值, 字段名 = 值 where 条件; #给满足条件的行修改#修改天琪的薪资降低5000
update teacher set salary = salary-5000 where tname = '天琪';

删除

删除部分行的数据

delete from 表名称 where 条件;delete from teacher where tname = '天琪';

删除整张表的数据,但表结构留下

delete from 表名称;delete from teacher;

截断表,清空表中的数据,只有表结构

truncate 表名称;truncate teacher;
truncate 表和 delete 表的区别:
delete 是一条一条删除记录的。如果在事务中,事务提交之前支持回滚。(后面会讲事务)
truncate 是把整个表 drop ,新建一张,效率更高。就算在事务中,也无法回滚。
http://www.xdnf.cn/news/13053.html

相关文章:

  • LeetCode 高频 SQL 50 题(基础版)之 【高级字符串函数 / 正则表达式 / 子句】· 下
  • VSCode 使用CMake 构建 Qt 5 窗口程序
  • 【C++特殊工具与技术】优化内存分配(四):定位new表达式、类特定的new、delete表达式
  • [论文阅读]人工智能 | CoMemo:给大视觉语言模型装个“图像记忆”
  • (37)课56--??:建立保存点 SAVEPOINT spA,回滚(至保存点) ROLLBACK (to spA)及综合举例。
  • 记录:RK3588 PWM调试
  • Unity UGUI Button事件流程
  • AlgorithmVisualizer项目改进与部署-网页算法可视化
  • 【学习记录】使用 Kali Linux 与 Hashcat 进行 WiFi 安全分析:合法的安全测试指南
  • ConcurrentModificationException 并发修改异常详解
  • 用递归算法解锁「子集」问题 —— LeetCode 78题解析
  • 代码随想录算法训练营第60期第六十三天打卡
  • 华硕a豆14 Air香氛版,美学与科技的馨香融合
  • vue+cesium示例:3D热力图(附源码下载)
  • pycharm 设置环境出错
  • matlab时序预测并绘制预测值和真实值对比曲线
  • 浏览器指纹科普 | Do Not Track 是什么?
  • 2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
  • (14)-java+ selenium->元素定位大法之By xpath上卷
  • aurora与pcie的数据高速传输
  • 【从零学习JVM|第三篇】类的生命周期(高频面试题)
  • 自然语言处理——卷积神经网络
  • 你应该使用的 php 加解密函数
  • ELK实现nginx、mysql、http的日志可视化实验
  • centos7部署AWStats日志分析系统
  • java中word快速转pdf
  • Linux系统:进程间通信-匿名与命名管道
  • 离线语音识别方案分析
  • python3基础语法梳理
  • 行列视:企业数据分析新时代的利器(一)——深度解读与应用场景分析