MYSQL数据库
什么是数据库?
数据库 : 是统一管理的、长期储存在计算机内的、有组织的相关数据的集合。
数据库的特征?
数据库的基本特征包括:数据按一定的数据模型组织、描述和储存;数据间联系密切、冗余度较小;数据独立性较高;易扩展;可为各种用户共享。
数据库可以做什么?
- 数据存储:数据库能够存储和管理大量的数据,将数据以一定的结构存储在计算机中,使得数据的存储、管理、检索更加高效和便捷。
- 数据管理:数据库可以对数据进行增加、删除、修改、查询等操作,并且可以对数据进行权限控制,保证数据的安全性和完整性。
- 数据分析:数据库可以连接各种数据源,对数据进行提取、转换、加载等操作,从而将数据转换成有用的信息,为决策提供支持。
为什么要学习数据库?
应用程序产生的数据是在内存中的,如果程序退出或者是断电了,则数据就会消失。使用数据库是为了能够永久保存数据。
MySQL、Oracle、SqlServer是什么?
MySQL 、 Oracle 、 SqlServer 都是数据库管理系统( DBMS , Database Management System)是一种操纵和管理数据库的大型软件,例如建立、使用和维护数据库。
SQL是什么?
SQL 是结构化查询语言( Structure Query Language ),专门用来操作 / 访问数据库的通用语言。
什么是关系型数据库和非关系数据库?
MySQL 、 Oracle 、 SqlServer 等是关系型数据库管理系统。
MongoDB 、 Redis 、 Elasticsearch 等是非关系型数据库管理系统。
MySQL的优点有很多,其中主要的优势有如下几点:
- 可移植性:MySQL数据库几乎支持所有的操作系统,如Linux、Solaris、FreeBSD、Mac和 Windows。
- 免费:MySQL的社区版完全免费,一般中小型网站的开发都选择 MySQL 作为网站数据库。
- 开源:2000 年,MySQL公布了自己的源代码,并采用GPL(GNU General Public License)许可
- 协议,正式进入开源的世界。开源意味着可以让更多人审阅和贡献源代码,可以吸纳更多优秀人才
- 的代码成果。
- 关系型数据库:MySQL可以利用标准SQL语法进行查询和操作。
- 速度快、体积小、容易使用:与其他大型数据库的设置和管理相比,其复杂程度较低,易于学习。
- MySQL的早期版本(主要使用的是MyISAM引擎)在高并发下显得有些力不从心,随着版本的升级
- 优化(主要使用的是InnoDB引擎),在实践中也证明了高压力下的可用性。从2009年开始,阿里
- 的“去IOE”备受关注,淘宝DBA团队再次从Oracle转向MySQL,其他使用MySQL数据库的公司还有
- Facebook、Twitter、YouTube、百度、腾讯、去哪儿、魅族等等,自此,MySQL在市场上占据了
- 很大的份额。
- 安全性和连接性:十分灵活和安全的权限和密码系统,允许基于主机的验证。连接到服务器时,所
- 有的密码传输均采用加密形式,从而保证了密码安全。由于MySQL是网络化的,因此可以在因特网上的任何地方访问,提高数据共享的效率。
- 丰富的接口:提供了用于C、C++、Java、PHP、Python、Ruby和Eiffel、Perl等语言的API。
- 灵活:MySQL并不完美,但是却足够灵活,能够适应高要求的环境。同时,MySQL既可以嵌入到
- 应用程序中,也可以支持数据仓库、内容索引和部署软件、高可用的冗余系统、在线事务处理系统
- 等各种应用类型。
- MySQL最重要、最与众不同的特性是它的存储引擎架构,这种架构的设计将查询处理(Query
- Processing)及其他系统任务(Server Task)和数据的存储/提取相分离。这种处理和存储分离的
- 设计可以在使用时根据性能、特性,以及其他需求来选择数据存储的方式。MySQL中同一个数据
- 库,不同的表格可以选择不同的存储引擎。其中使用最多的是InnoDB 和MyISAM,MySQL5.5之后
- 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;
select的7大子句
7大子句顺序
- from:从哪些表中筛选
- on:关联多表查询时,去除笛卡尔积
- where:从表中筛选的条件
- group by:分组依据
- having:在统计结果中再次筛选(with rollup)
- order by:排序
- 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 ,新建一张,效率更高。就算在事务中,也无法回滚。