前言:
存储数据的容器
在内存中(数据存在易失性,断电即数据没了):
数组
集合
磁盘(永久存储):
文件(不易管理)
数据库(持久化,易管理)
一、数据库基础介绍:
1. 数据库基本概念:
数据库(DataBase/DB):
用于存储和管理数据的仓库。即保存一系列有组织的数据
其特点:
1.持久存储(持久存储-->存储于文件)-->数据库为文件系统;
2.方便存储和管理数据;
3.使用同一方式操作数据库-->SQL
DBMS(database management system)用于操作DB
DBMS分类:
基于共享文件系统的DBMS(Access)
基于客户机-服务器的DBMS
SQL(structure query language)用于和DB通信的语言,由DBMS支持
数据库(类)-->数据库软件(对象)
安装MySQL其实是安装MySQL的服务器软件,服务(没有界面的应用程序,属于后台)
MySQL服务器(MySQL服务器所在的软件):
数据库就是一个文件夹,数据库中可以存放多张表(文件)
SQL:
Structured Query Language:结构化查询语言(操纵所有关系型数据库的规则)
每一种数据库操纵的方式存在一些不一样的地方,成为“方言”
2. MySql的卸载:
1.在mysql的my.ini文件中找到datadir 字段的值
2.卸载mysql
3.删除G:下的mysql目录(文件夹)
3. MySQL服务启动:
1. 手动:任务管理器,点点戳戳
2. cmd-->service.msc 打开服务的窗口
3. 使用管理员身份打开cmd:
输入:net start mysql :启动mysql的服务
输入:net stop mysql : 停止mysql的服务
注:在linux环境下
tip1:查看MySQL服务是否开启,则有以下命令:
systemctl status mysql.service
tip2:查询MySQL端口号(其中默认netstat已安装):
netstat -anp|grep mysql
4. MySQL的登录与退出:
登录:
1.在cmd中输入:
mysql -uroot -hlocalhost –P端口号 –p密码
2.在cmd中输入:
mysql -hip -uroot -p连接目标的密码
3.在cmd中输入:
mysql --host=ip --user=root --password=连接目标的密码
4.在linux环境下登录:
(Ubuntu非root账户下)sudo mysql -u root(账号名称) -p 密码
(CentOS的root账户下)mysql -u账号名称 -p密码
5.自带客户端,输入root账号和密码
6.以管理员省份进入cmd-->mysql -h 主机名称 -P 端口号 -u 用户名 -p 密码
退出:
1.直接叉cmd
2.在cmd中输入:exit或者quit或ctrl+c
tip:二维表(字段{属性}+元组)-->数据库(二维表集合)
5.MySQL 数据库目录结构:
1.MySQL安装目录:
配置文件:my.ini
2.MySQL数据目录:
数据库:文件夹;
表:文件;
数据:数据记录
3.mysql数据库结构:
information_schema--保存源数据信息
mysql--保存用户信息
performance_schema--收集性能信息
6. SQL通用语法:
1. sql语句可以单行或多行书写,以分号结尾。
2. 可以是引用空格或者缩进来增强语句可读性
3. MySQL 数据库的 sql 语句不区分大小写,关键字建议使用大写
4. 注释:
a. 单行注释:(单个空格)--(单个空格)注释内容 或 (单个空格)#注释内容
b. 多行注释:/*注释*/
5.MySQL常用命令
查询列表可以是字段,常量,表达式,函数,也可以是组合
查询结果是一个虚拟的表
查看数据库中的数据库目录:
show databases;
使用指定数据库:
use 数据库名称;
查看数据库中存储的表:
show tables;
查看其他库的表:
方式一:use 其他数据库名称;show tables;
{此时所在库位置改变}
方式二:show tables from 其他数据库名称;
{此时所在库位置不变}
查看用户所在库:
select database();
建表:
creat table 表名称(
列名称 列类型,
列名称 列类型
);
查看表的结构:desc 表名称;
查看表信息:select * from 表名称;
在表中插入数据:insert into 表名称 (id,name) values(1,'john');
修改表中数据:update 表名称 set name='lilei' where id=1;
删除表中标数据:delete from 表名称 where id=1;
查看mysql数据库的版本:
方式一:在mysql客户端下,输入 select version();
方式二:在cmd下,输入 mysql --version 或 mysql -V
tip:MySQL语法规范
1.不区分大小写,但建议关键字大写,表名、列名小写
2.每条命令最好用分号结尾
3.每个关键字可以独占一行
4.注释:
单行注释:
#注释文字
-- 注释文字
多行注释:
/* 注释文字 */
SQL的分类:
1) DDL(Data Definition language)数据定义语言
用于定义数据库对象:数据库、表、列等。
关键字:create、drop、alter等
2)DML(Data Manipulation language)数据操作语言
用于对数据库中表的数据进行增删改查。
关键字:insert、delete、update等
3)DQL(Data Query Language)数据查询语言
用来查询数据库中表的记录(数据)。
关键字:select、where等
4)DCL(Data Control Language)数据控制语言
用于定义数据库的访问权限和安全级别,及创建用户。
关键字:GRANT,REVOKE 等
tip:在mysql中不区分字符串和字符,即""和''等价
二、数据库的增删改查基本操作(DDL操作数据库):
1. 操作数据库:CRUD
C(CREATE):创建;
R(RETRIEVE):查询
U(UPDATE):修改
D(DELETE):删除
使用数据库
R(RETRIEVE)查询:
查询所有数据库名称:
show databases;
查看某个数据库对应的字符集(查询某个数据库的创建语句):
show create database 数据库名称;
查询当前正在使用的数据库名称:
select database();
使用数据库:
use 数据库名称;
查看当前数据库设置的字符集:
show variables like 'character_set_database';
查看所有数据库设置的字符集:
show variables like '%char%';
C(CREAT)创建:
创建数据库:
create database 数据库名称
创建数据库,判断不存在,再创建:
create database if not exists 数据库名称
创建数据库,指定字符集
create database 数据库名称 character set 字符集名
练习:
创建DB0数据库,判断是否存在,并指定字符集为gbk
creat database if not exists db0 character set gbk
U(UPDATE):修改:
修改数据库的字符集
alter database 数据库名称 character set 字符集名称
D(DELETE):删除
删除数据库:
drop database 数据库名称
判断数据库存在,存在再删除:
drop database if exists 数据库名称;
三、数据库表格的基本操作(DDL操作表):
R(RETRIEVE)查询:
查询某个数据库中所有的表名称:
show tables;
查询表结构
desc 表名
创建表
语法:
creat table 表名称(列名1 数据类型1,列名2 数据类型2,。。。列名N 数据类型N)
注,最后一列无“,”号
实例{
创建表
creat table student(
id int,
name varchar(32),
age int,
score double(4,1),
birthday date,
insert_time timestamp
)
}
复制一张表:
create table 新表名 like 被复制的老表名
数据类型:
1.int:整数类型:
age int
2.double:小数类型:
score double(5,2) 5指一共5位数,其中小数占2位
3.date: 日期只含年月日,yyyy-MM-dd
4.datetime:日期,包含年月日时分秒 yyyy-MM-dd HH:mm:ss
5.timestamp:时间戳类型 包含年月日时分秒 yyyy-MM-dd HH:mm:ss
(若将来不给这个字段赋值或赋值为null,则默认使用当前的系统时间自动赋值)
6.varchar:字符串: name varchar(20) 姓名最大20个字符
删除表
删除表:
drop table 表名;
删除表:
drop table if exists 表名;
修改表
1.修改表名:
alter table 表名 remame to 新表名
2.修改表的字符集:
alter table 表名 character set 字符集名称
3.添加一列:
alter table 表名 add 列名 数据类型
4.修改列名称,类型:
alter table 表名 change 列名 新列名 数据类型
alter table 表名 modify 列名 新数据类型
5.删除列:
alter table 表名 drop 列名
四、对表中数据进行操作(
DML:增删改表中数据、
DQL查询表中记录、
DQL查询表中记录
)
DML:增删改表中数据
数据的添加:
语法:
insert into 表名(列名1,列名2,列名3....列名n);
注:
列名和值要一一对应;
若表名后不定义列名,则默认给所有列添加值;
除了数字类型,其他类型需要使用引号(单双均可)引起来
删除数据:
语法:
delete from 表名 [where 条件]
注:
若不加条件,则删除表中所有记录(表在,记录不在);
若要删除所有记录,可以采用:
1. delete from 表名;
-----不推荐,因为有多少条记录就会执行多少次操作,效率低下
2. truncate table 表名;
----先删除表然后再创建一张一模一样的空表
删除表:
truncate table 表名(表删除,记录不在,然后再创建一个一模一样的空表)
修改数据:
语法:
update 表名 set 列名1=值1,列名2=值2, ...,列名N=值N [where 条件]
若不加条件,则会将表中所有记录全部修改
DQL查询表中记录
语法:
select 字段列表(逗号隔开)
from 表名列表(逗号隔开)
where 条件列表(逗号隔开)
group by 分组字段
having 分组之后的条件
order by 排序
limit 分页限定
一、基础查询
0.在查询指定字段前,首先要确定使用的数据库,即在查询语句前加:
USE 数据库名称
1.多个字段的查询:
1.语法:
SELECT
查询列表
FROM
表名;
其中:
1.查询列表包含:表中字段、常量值、表达式、函数
2.查询结果是一个虚拟表格
3.“ * ”可以代表所有列
2.去除重复:
distinct
仅仅只有两个结果集完全一样才使用
3.计算列:
一般可以使用四则运算计算列的值(一般只会计算数据型计算)
ifnull(表达式1,表达式2):如果表达式1为空则用表达式2替代
4.起别名:
as :as也可以省略
5.判断某个字段或表达式是否为空,若不为空则返回其值,若为空则返回自己设定的预定值:
IFNULL(某个字段或表达式,自己设定的预定值)
6.判断某个字段或表达式的值是否为NULL,若是NULL则返回1,若不是NULL则返回0
ISNULL(某个字段或表达式)
7.实例:
{
1.查询表中的单个字段:
SELECT
属性名称
FROM
表名称;
2.查询表中多个字段(查询属性顺序与表中存储的属性顺序无关):
SELECT
属性名称1,
属性名称2,
属性名称3,
...
FROM
表名称;
3.查询表中所有字段:
SELECT
属性名称1,
属性名称2,
属性名称3,
...(所有属性)
FROM
表名称;
<==等价于==>
SELECT
*
FROM
表名称;
4.查询常量值(数值直接写,字符串和字符使用''将其引起来):
SELECT
常量;
5.查询表达式:
SELECT
表达式
6.查询函数(调用一个指定函数并显示其执行结果):
SELECT
函数(实参列表);
注:MySQL中的函数必须有返回值,调用的时候相当于执行了该函数的函数体,用时查询出对应的返回值
7.起别名(
1.好处易于理解;若查询字段有重名情况,可以看出此字段属于那张表格
2.当别名中存在关键字或注释符号是,使用""将别名引起来
):
SELECT
查询列表
AS
别名
FROM
表名;
<==等价于==>
SELECT
查询列表
别名
FROM
表名;
8.去重:
SELECT
DISTINCT
单个字段名称
FROM
表名;
9.+号的作用(在mysql中+号仅作为运算符):
SELECT 数值+数值
数值之和结果为数值
SELECT '数值'+数值
字符数值与数值之和结果为数值
SELECT '字符'+数值
字符与数值之和结果为数值,将字符转换为0
SELECT null+数值
只要见null,结果一定为null
10.concat的使用(用于连接字符串,属性拼接):
SELECT
CONCAT('属性1','属性1','属性1'...)
AS
别名
FROM
表名;
}
二、条件查询
特点:
where子句后跟条件
几个常用符号:
通配符(占位符):
%{任意多个字符}
_{任意单个字符}
转义符用于将目标字符中的特殊符号转换成普通字符串:
\
属性 LIKE '任意字符_目标字符' ESCAPE'任意字符'
1.语法:
SELECT
查询列表
FROM
表名
WHERE
筛选条件;
2.执行顺序:表名-->筛选条件-->查询
3.分类:
A、按条件表达式进行筛选
条件运算符:>,<,=,!=,<>,>=,<=,安全等于<=>
B、按逻辑表达式筛选
作用:用于连接条件表达式
逻辑运算符:
“&&”与“and”与“交”:交见假则假
“||”与“or”与“并”:并见真则真
“!”与“not”与“非”:非取反
C、模糊查询
like
特点:
1.一般和通配符搭配使用,既可以查字符型也可以判断数值型
实例一
{
SELECT
*(属性名称1,属性名称2...)
FROM
表名称
WHERE
属性 LIKE '%目标字符%'(或'_目标字符_');
}
between and
特点:包含临界值,两个临界值不能颠倒
实例一:查询属性值在属性1和属性2中的信息
{
SELECT
*(属性名称1,属性名称2...)
FROM
表名称
WHERE
属性名称 BETWEEN 数值1 AND 数值2;
}
实例二:查询属性值不在属性1和属性2中的信息
{
SELECT
*(属性名称1,属性名称2...)
FROM
表名称
WHERE
属性名称 NOT BETWEEN 数值1 AND 数值2;
}
in
含义:判断某字段的值是否属于in列表中的某一项
特点:
使用in提高语句简洁度
in列表值类型必须统一或兼容
由于IN等价于=,所以在IN修饰的语句中不能使用通配符
实例一
{
SELECT
*(属性名称1,属性名称2...)
FROM
表名称
WHERE
属性名称1=目标值1 OR 属性名称1=目标值2 OR ...;
或{
属性名称1 IN(目标值1,目标值2,...)
}
}
is null或is not null
判断属性是否为空或是否不为空(仅用于判断NULL值):
实例一
{
SELECT
*(属性名称1,属性名称2...)
FROM
表名称
WHERE
属性1 IS NULL(或 IS NOT NULL)
}
安全等于:
<=>意义上是“=”或“IS”
作用:
用于判断null值
用于判断普通值
小节is null和<=>
IS NULL:仅仅可以判断NULL值,可读性较高,建议使用
<=> :既可以判断NULL值,又可以判断普通数值,可读性较差
4.实例:
实例一:
查询符合某个条件的信息、案例一{
SELECT
*(属性名称1,属性名称2...)
FROM
表名称
WHERE
属性名称 >(>、<、=、!=、<>、>=、<=)条件;
或{
属性名称1 >(>、<、=、!=、<>、>=、<=)
AND(OR,NOT)
属性名称2 >(>、<、=、!=、<>、>=、<=);
}或{
属性名称 BETWEEN 数值1 AND 数值2;
}
}
实例二:
年薪的查询:{
SELECT
salary*12*(1+IFNULL(commission_pct,0)AS 年薪
}
DQL查询表中记录
三、排序查询
1、语法:
SELECT 查询列表
FROM 表
【WHERE 筛选条件】
ORDER BY 排序列表 【asc|desc】
order by 子句
order by 排序字段1 排序方式1,排序字段2, 排序方式2...
order by字句中可以支持单个字段、多个字段、表达式、函数、别名
order by字句一般放在查询预计最后面,但limit字句除外,
含有order by字句的简单查询中的执行顺序为,先找表,再按条件查表,查完表再进行排序
排序方式:
ASC:升序,默认的
DES:降序
若有多个排序条件,则满足第一个排序条件基础上才会进行后面条件的执行
按照A属性排名,若A属性值一样,则按照B属性排名
SELECT *
FROM 表
ORDER BY A ASC, B ASC
2、案例:
案例一
{
查询所有信息,要求数值属性1从高到低(从低到高)进行排序
SELECT *
FROM 表
ORDER BY 数值属性1 DESC(或ASC,若是采用ASC那么ASC可以省略不写)
}
案例二
{
含筛选条件查询
查询所有信息,要求数值属性1在目标数值之上,以属性2从小到大进行展示
SELECT *
FROM 表
WHERE 数值属性1>=目标数值
ORDER BY 属性2 ASC
}
案例三
{
按表达式排序
查询所有信息,按表达式进行排序
SELECT *,表达式 AS 别名
FROM 表
ORDER BY 表达式 DESC
}
案例四
{
按别名排序
查询所有信息,按表达式进行排序
SELECT *,表达式 AS 别名
FROM 表
ORDER BY 别名 DESC
}
案例五
{
#按函数排序:
#按照某一属性的长度进行排序
SELECT LENGTH(属性A) '属性A别名',查询列表
FROM 表
ORDER BY LENGTH(属性A) DESC;
}
案例六
{
#查询表中信息,要求先按照属性A升序排序,再按照属性B降序排序【按多个字段排序】
SELECT *
FROM 表
ORDER BY 属性A ASC,属性B DESC;
}
常见函数:
概念:类似java中的方法,C语言中的函数,将一组逻辑语句封装在方法体中,对外暴露方法名称
好处:1、隐藏实现细节、2.提高代码重用性
调用实例:
SELECT 函数名称(实参列表)
【FROM 表】
特点:只关心函数名称和函数功能
分类:
1.单行函数:如concat、length、ifnull等
2.分组函数:功能:做统计使用(又称统计函数、聚合函数、组函数)
常见函数小节:
一、单行函数
字符函数:{length,concat,substr,instr,trim,upper,lower,lpad,rpad,replace}
数学函数:{round,ceil,floor,truncate,mod}
日期函数:{now,curdate,curtime,year,month,monthname,day,hour,minute,second,str_to_date,date_format}
其他函数:{version,database,user}
控制函数:{if,case}
一、字符函数:
length 获取参数值的字节个数
统计目标字符串长度:SELECT LENGTH('目标字符串');
查看客户端字符集:SHOW VARIABLES LIKE '%char%';
concat 拼接字符串
查询全名:SELECT CONCAT(last_name,'_',first_name) 姓名 FROM 表;
upper、lower
将小写字符串转换为大写字符串:SELECT UPPER('小写目标字符串');
将大写字符串转换为小写字符串:SELECT LOWER('小写目标字符串');
substr、substring 截取特定字符串
索引从1开始
截取从指定索引处后面的所有字符{输出“倚天屠龙记”中的“屠龙记”}:SELECT SUBSTR('倚天屠龙记',3) out_put;
截取从指定索引处指定字符长度的字符{输出“倚天屠龙记”中的“倚天”}:SELECT SUBSTR('倚天屠龙记',1,2) out_put;
instr返回子串第一次出现的索引,如果找不到返回0
返回子串第一个字符在父字符串中的位置: SELECT INSTR('小明考上大学','大学') AS out_put;
trim删除前后指定空格或字符
删除字符串“ 张三丰 ”中多余的空格:SELECT TRIM(' 张三丰 ')AS out_put;
保留字符串“aaa张aa三丰aaa”中“张aa三丰”:SELECT TRIM('a' FROM 'aaa张aa三丰aaa')AS out_put;
lpad用指定的字符实现左填充指定长度
SELECT LPAD('章程',10,'*') AS out_put;
rpad用指定的字符实现右填充指定长度
SELECT RPAD('章程',10,'*') AS out_put;
replace替换
SELECT REPLACE('小明用败家之眼','败家之眼','外星人') AS out_put
二、数学函数:
round 四舍五入(不计正负号条件下)
SELECT ROUND(1.45)
SELECT ROUND(1.567,2)
ceil 向上取整,返回>=该参数的最小整数
SELECT CEIL(1.02)
floor 向下取整,返回=<该参数的最大整数
SELECT CEIL(-1.02)
truncate 截断
小数点后保留1位:SELECT TRUNCATE(1.69,1)
mod 求余{mod(a,b)=a-a/b*b}
SELECT MOD(10,3)
三、日期函数:
now 返回当前系统日期+时间
SELECT NOW();
curdate 返回当前系统日期不包含时间
SELECT CURDATE();
curtime 返回当前时间不含日期
SELECT CURTIME();
获取指定的年、月、日、时、分、秒
SELELCT YEAR(NOW()) 年;
SELELCT MONTH(NOW()) 月;
SELELCT MONTHNAME(NOW()) 月;
...
str_to_date将日期各式的字符串转换成指定格式的日期
SELECT STR_TO_DATE('9_13_1999','%m-%d-%Y') AS out_put;
date_format:将日期转换成字符
SELECT DATE_FOEMAT('2022/6/6','%Y年%m月%d日') AS out_put;
四、其他函数
SELECT VERSION();版本号
SELECT DATABASE();查询当前使用的数据库
SELECT USER();查询当前用户
五、流程控制函数
if函数(实现if else的效果)
SELECT IF(10>5,'大','小');
case函数的使用:
1、与switch case等效{
case 要判断的字段或表达式
when 常量1 then 要显示的值1或语句1;
when 常量2 then 要显示的值2或语句2;
...
else 要显示的值N或语句N;
end
实例一{
查询员工工资,要求
部门号=30,显示工资为1.1倍
部门号=40,显示工资为1.2倍
部门号=50,显示工资为1.3倍
SELECT salary 原始工资 department_id,
CASE department_id
WHEN 30 THEN salary*1.1
WHEN 40 THEN salary*1.2
WHEN 50 THEN salary*1.3
ELSE salary
END AS 新工资
FROM employees;
}
}
2、类似于多重if{
case
when 条件1 then 要显示的值1或语句1;
when 条件2 then 要显示的值2或语句2;
。。。
else 要显示的值n琥珀语句n
end
实例一{
查询员工的新工资情况
如果工资>2w,显示A级别
若工资>1.5w,显示B级别
若工资>1w,显示C级别
否则显示D级别
SELECT salary,
CASE
WHEN salary>20000 THEN 'A'
WHEN salary>15000 THEN 'B'
WHEN salary>10000 THEN 'C'
ELSE 'D'
END AS 工资级别
FROM employees;
}
}
二、分组函数
分类:sum 求和;avg 均值;max 最大值;min 最小值;count 计算个数
1.简单使用
SELECT 聚合函数(列名) FROM 表
注:
聚合函数的计算会排除NULL的值
SELECT SUM(字段1) FROM 表1;
SELECT AVG(字段1) FROM 表1;
SELECT MAX(字段1) FROM 表1;
SELECT MIN(字段1) FROM 表1;
SELECT COUNT(字段1) FROM 表1;
SELECT SUM(字段1),AVG(字段1),MAX(字段1),MIN(字段1),COUNT(字段1) FROM 表1;
2.参数支持哪些类型:
1.sum、avg一般用于处理数值型
2.max、min、count可以处理任何类型
3.5个分组函数均忽略null值
3.可以和distinct搭配实现去重运算
SELECT SUM(DISTINCT 字段1),SUM(字段1) FROM 表1;
SELECT COUNT(DISTINCT 字段1),COUNT(字段1) FROM 表1;
4.count函数的单独介绍:
计算字段1这一列中所有值:SELECT COUNT(字段1) FROM 表1
统计表1中不为空的总行数:{SELECT COUNT(*) FROM 表1}或{SELECT COUNT(1) FROM 表1}
效率:
myisam存储引擎下,count(*)的效率最高
innodb存储引擎下,count(*)和count(1)的效率差不多,比count(字段)要高一些
一般使用count(*)作为统计行数
5.和分组函数一同查询的字段要求是group by后的字段
tip1:查看日期间的差值(以天为单位):DATEIFF(MAX(日期字段1),MIN(日期字段1))
tip2:若出现null还要将其记录则可以:
1.选择非空列(主键) ;
2.SELECT 聚合函数(IFNULL(列名,0)){
其中聚合函数为count时,可以写为count(*)
} FROM 表
分组查询
语法:
group by 分组字段
注:
1.分组之后查询的字段:
分组字段,聚合函数
2.where和having的区别:
where{
在分组之前进行限定,
如果不满足条件,
则不参与分组。where后不更聚合函数
}
having{
在分组之后进行限定,
如果不满足结果,
则不会被查询出来。
having后可以跟着聚合函数的判断
}
分组查询实例:
按照性别分组,分别查询男、女同学平均分:
SELECT 性别,
AVG(学科属性) FROM 表 GROUP BY 性别属性
按照性别分组,分别查询男、女同学平均分,人数:
SELECT 性别,
AVG(学科属性),
COUNT(主键) FROM 表 GROUP BY 性别属性
按照性别分组,分别查询男、女同学平均分,人数 要求:分数低于70分的人数不参与分组:
SELECT 性别,
AVG(学科属性),
COUNT(主键) FROM 表 WHERE 学科属性 > 70 GROUP BY 性别属性
按照性别分组,分别查询男、女同学平均分,人数 要求:分数低于70分的人数不参与分组,分组之后人数要大于两个人:
SELECT 性别,
AVG(学科属性),
COUNT(主键) FROM 表 WHERE 学科属性 > 70 GROUP BY 性别属性 HAVING COUNT(主键) >2
按照性别分组,分别查询男、女同学平均分,人数 要求:分数低于70分的人数不参与分组,分组之后人数要大于两个人:
SELECT 性别,
AVG(学科属性),
COUNT(主键) 人数{在聚合函数后起名字} FROM 表 WHERE 学科属性 > 70 GROUP BY 性别属性 HAVING 人数{利用名字做判断} >2
分页查询
语法:
limit 开始的索引(可以从0开始),每页查询的条数
公式:
开始的索引=(当前页码-1)*页面显示的条数
分页操作是一个“方言”
实例:
表中每页显示3条记录
SELECT * FROM 表 LIMIT 开始的索引(可以从0开始),3
五、约束
约束
概念:
对表中的数据进行限定,保证数据的正确性、有效性和完整性
保证数据是合理的
约束分类:
1.主键约束:primary key
2.非空约束:not null
3.唯一约束:unique
4.外键约束:foreign key
非空约束(非空列的值不能为空):not null
添加方式
1. 创建表时添加非空约束
CREATE TABLE 表( 属性1 类型1, 属性2 类型2 NOT NULL -- 属性2是非空
2. 创建完表后添加非空约束
ALTER TABLE 表 MODIFY 指定属性 属性类型 NOT NULL
删除非空约束:
ALTER TABLE 表 MODIFY 原有非空属性 新类型
唯一约束:UNIQUE -- 唯一属性列其值不能重复,但在mysql中NULL可以在UNIQUE限定下出现多个
唯一约束的添加:
1.创建表时添加唯一约束
CREATE TABLE 表(属性1 类型1,属性2 类型2 UNIQUE
在创建表之后添加唯一约束(先查看目标属性列中是否有(在mysql中除了NULL)重复值,有则处理重复值,再进行):
ALTER TABLE 表 MODIFY 非唯一约束属性列 UNIQUE
删除唯一约束:ALTER TABLE 表 DROP INDEX 含有唯一约束的属性列
主键约束
1.注意:
1.含义:非空且唯一;
2. 一张表只能有一个字段为主键;
3。 主键就是表中记录的唯一标识
2.主键的添加:
A.在创建表时,添加主键约束:
CREATE TABLE 表( 属性1 类型1 PRIMARY KEY, {-- 给属性1添加主键} 属性2 类型2)
B.表创建完后,添加主键:
ALTER TABLE 表 MODIFY 属性1,类型1 PRIMARY KEY
主键的删除:
ALTER TABLE 表 DROP PRIMARY KEY
自动增长:
1. 概念:
若某一列是数值类型的,使用AUTO_INCREMENT可以读取上一个值来完成值的自动增长,常和主键一起使用
2. 主键的添加:
A.在创建表时,添加自动增长:
CREATE TABLE 表1( 属性1 类型1 PRIMARY KEY AUTO_INCREMENT, {-- 给属性1添加主键} 属性2 类型2);
INSERT INTO 表1 VALUES(NULL{属性1的值},属性2的值)
B.表创建完后,添加自动增长:
ALTER TABLE 表 MODIFY 属性1,类型1 AUTO_INCREMENT
删除自动增长:
ALTER TABLE 表 MODIFY {含有自动增长的}属性 类型
数据冗余,常见表现为:
在一张表中非主键的单个属性列中,重复的部分太多,从而造成在若要修改重复的内容,只能一条记录一条记录地修改这样十分不方便。为解决此问题,要做一个表的拆分,将表拆分之后,将拆分的表通过外键进行关联。因此在创表的时候先创外键表,再建主键表外键约束:foreign key让表与表产生关系,从而保证数据的正确性(完整性)
1. 在创建表时可以添加外键
语法:
CREATE TABLE 表(
...,
外键列,
CONSTRAINT 外键名称 FOREIGN KEY (外键列名称) REFERENCE 主表名称(主表列名称)
);
2. 在创建完表后添加外键:
ALTER TABLE 表 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键列名称) REFERENCE 主表名称(主表列名称)
删除外键: ALTER TABLE 表 DROP FOREIGN KEY 外键名称
外键值可以为NULL但不可以为不存在的值。
存在一个主表,一个外表,主表中的外键为外表中的主键。当外表中的主键值要进行修改时,直接对外表进行操作是不可以的,首先要将主表中的外键值设置为NULL,然后再对外表直接进行修改,当外表中的主键值修改完毕后,再将主表中的外键值从NULL修改为相应值。但这一操作十分麻烦,为解决这一麻烦,引入级联操作(但要谨慎使用)
级联操作
1.添加级联操作(在创建时添加级联更新和删除,其中更新或删除可以单独使用):
语法:
ALTER TABLE 表
ADD CONSTRAINT 外键名称
FOREIGN KEY (外键字段名称)
REFERENCES 主表名称(主表列名称)
ON UPDATE CASCADE ON DELETE CASCADE
2.分类:
A.级联更新:ON UPDATE CASCADE
B.级联删除:ON DELETE CASCADE
以上是今日小节,不喜勿喷,感谢理解
相关链接:
【SQL基础学习】----基础篇(2)_lixxkv的博客-CSDN博客