任务一_MySQL基础&SQL入门
1.数据库的基本概念
1.1什么是数据库
1.数据库(DataBase) 就是存储和管理数据的仓库
2.其本质是一个文件系统, 还是以文件的方式,将数据保存在电脑上
1.2为什么使用数据库
数据存储方式的比较
存储方式 优点 缺点
内存 速度快 不能够永久保存,数据是临时状态的
文件 数据是可以永久保存的 使用IO流操作文件, 不方便
数据库 1.数据可以永久保存
2.方便存储和管理数据
3.使用统一的方式操作数据库
(SQL)
占用资源,有些数据库需要付费(比如Oracle数据库)
通过上面的比较,我们可以看出,使用数据库存储数据, 用户可以非常方便对数据库中的数据进行增加, 删除, 修改及查询操作。
1.3常见的数据库软件排行榜
2020年数据库排行
开发中常见的数据库
数据库名 介绍
MySql数据库 开源免费的数据库
因为免费开源、运作简单的特点,常作为中小型的项目的数据库首选。
MySQL1996年开始运作,目前已经被Oracle公司收购了. MySQL6.x开始收费
Oracle数据库 收费的大型数据库,Oracle公司的核心产品。安全性高
DB2 IBM公司的数据库产品,收费的超大型数据库。常在银行系统中使用
SQL Server MicroSoft 微软公司收费的中型的数据库。
C#、.net等语言常使用。
但该数据库只能运行在windows机器上,扩展性、稳定性、安全性、性能都表现 平平。
为什么选择MySQL ?
1.功能强大,足以应付web应用开发
2.开源, 免费
2.MySQL的安装及配置
2.1安装MySQL
详见 MySQL安装文档
2.2卸载MySQL
详见 MySQL卸载文档
2.3MySQL环境变量配置
详见 MySQL环境变量配置文档
2.4MySQL的启动与关闭
2.4.1方式一 : window服务启动 MySQL
1)右键此电脑 --> 管理
2)选择服务–> 找到MysQL服务
3)右键选择 --> 启动或停止
2.4.2方式二: DOS 命令方式启动
1)首先以管理员身份 打开命令行窗口
2)启动MySql
net start mysql57
3)关闭MySql
net stop mysql57
2.5命令行登录数据库
MySQL是一个需要账户名密码登录的数据库,登陆后使用,它提供了一个默认的root账号,使用安装 时设置的密码即可登录。
命令 说明
mysql -u 用户名 -p 密码 使用指定用户名和密码登录当前计算机中的MySQL数据库
mysql -h 主机IP -u 用户名 -p 密码 -h 指定IP 方式,进行 登录
命令演示:
mysql -uroot -p123456
mysql -h127.0.0.1 -uroot -p123456
退出命令
exit 或者 quit
2.6SqlYog的使用
1)简介
SQLyog是业界著名的Webyog公司出品的一款简洁高效、功能强大的图形化MySQL数据库管理工 具。使用 SQLyog 可以快速直观地让您从世界的任何角落通过网络来维护远端的 MySQL 数据库
2)具体安装教程 请查看
SQLyog安装教程
2.7MySql的目录结构
1)MySQL安装目录
MySql的默认安装目录在 C:\Program Files\MySQL\MySQL Server 5.7
目录 目录内容
bin 放置一些可执行文件
docs 文档
include 包含(头)文件
lib 依赖库
share 用于存放字符集、语言等信息。
2)MySQL配置文件 与 数据库及 数据表所在目录
my.ini 文件 是 mysql 的配置文件,一般不建议去修改
data<目录> Mysql管理的数据库文件所在的目录
几个概念
数据库: 文件夹表: 文件
数据: 文件中的记录
2.8数据库管理系统
1)什么是数据库管理系统 ?
数据库管理系统(DataBase Management System,DBMS):指一种操作和管理维护数据库的大型软件。
MySQL就是一个 数据库管理系统软件, 安装了Mysql的电脑,我们叫它数据库服务器.
2)数据库管理系统的作用
用于建立、使用和维护数据库,对数据库进行统一的管理。
3)数据库管理系统、数据库 和表之间的关系
MySQL中管理着很多数据库,在实际开发环境中 一个数据库一般对应了一个的应用,数据库当中保存着多张表,每一张表对应着不同的业务,表中保存着对应业务的数据。
2.9数据库表
数据库中以表为组织单位存储数据
表类似我们Java中的类,每个字段都有对应的数据类型
那么我们使用熟悉的Java程序来与关系型数据对比,就会发现以下关系:
类 -----> 表
类中属性 ----> 表中字段对象 —> 数据记录
3.SQL(重点)
3.1SQL的概念
1)什么是SQL ?
结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
2)SQL 的作用
是所有关系型数据库的统一查询规范,不同的关系型数据库都支持SQL 所有的关系型数据库都可以使用SQL
不同数据库之间的SQL 有一些区别 方言
3.2SQL通用语法
1)SQL语句可以单行 或者 多行书写,以分号 结尾 ; (Sqlyog中可以不用写分号)
2)可以使用空格和缩进来增加语句的可读性。
3)MySql中使用SQL不区分大小写,一般关键字大写,数据库名 表名列名 小写。
4)注释方式
注释语法 说明
– 空格 单行注释
/* */ 多行注释
MySql特有的单行注释
show databases; 单行注释
– show databases; 单行注释
/*
多行注释
show databases;
*/
3.3SQL的分类
分类 说明
数据定义语言 简称DDL(Data Definition Language),用来定义数据库对象:数据库,表,列等。
数据操作语言 简称DML(Data Manipulation Language),用来对数据库中表的记录进行更新。
数据查询语言 简称DQL(Data Query Language),用来查询数据库中表的记录。
数据控制语言 简称DCL(Date Control Language),用来定义数据库的访问权限和安全级别, 及创建用户。(了解)
注: 我们重点学习 DML 与 DQL!
3.4DDL操作 数据库
3.4.1创建数据库
命令 说明
create database 数据库名; 创建指定名称的数据库。
create database 数据库名 character set
字符集; 创建指定名称的数据库,并且指定字符集(一般都指定utf-8)
代码示例
/*
方式1 直接指定数据库名进行创建默认数据库字符集为:latin1
*/
CREATE DATABASE db1;
/*
方式2 指定数据库名称,指定数据库的字符集一般都指定为 utf8,与Java中的编码保持一致
*/
CREATE DATABASE db1_1 CHARACTER SET utf8;
3.4.2查看/选择数据库
命令 说明
use 数据库 切换数据库
select database(); 查看当前正在使用的数据库
show databases; 查看Mysql中 都有哪些数据库
show create database 数据库名; 查看一个数据库的定义信息
代码示例
– 切换数据库 从db1 切换到 db1_1 USE db1_1;
– 查看当前正在使用的数据库
SELECT DATABASE();
– 查看Mysql中有哪些数据库
SHOW DATABASES;
– 查看一个数据库的定义信息
SHOW CREATE DATABASE db1_1;
3.4.3修改数据库
修改数据库字符集
命令 说明
alter database 数据库名 character set 字符集; 数据库的字符集修改操作
– 将数据库db1 的字符集 修改为 utf8
ALTER DATABASE db1 CHARACTER SET utf8;
– 查看当前数据库的基本信息,发现编码已更改
SHOW CREATE DATABASE db1;
3.4.4删除数据库
命令 说明
drop database 数据库名 从MySql中永久的删除某个数据库
代码示例
– 删除某个数据库
DROP DATABASE db1_1;
3.5DDL 操作 数据表
3.5.1MySQL常见的数据类型
1)常用的数据类型:
类型 描述
int 整型
double 浮点型
varchar 字符串型
date 日期类型,给是为 yyyy-MM-dd ,只有年月日,没有时分秒
2)详细的数据类型(了解即可)
注意:MySQL中的 char类型与 varchar类型,都对应了 Java中的字符串类型,区别在于: char类型是固定长度的: 根据定义的字符串长度分配足够的空间。
varchar类型是可变长度的: 只使用字符串长度所需的空间
比如:保存字符串 “abc”
xchar(10) 占用10个字节
yvarchar(10) 占用3个字节
适用场景:
char类型适合存储 固定长度的字符串,比如 密码 ,性别一类
varchar类型适合存储 在一定范围内,有长度变化的字符串
3.5.2创建表
语法格式:
CREATE TABLE 表名(
字段名称1 字段类型(长度),
字段名称2 字段类型 注意 最后一列不要加逗号
);
需求1: 创建商品分类表
表名:category 表中字段:
分类ID :cid ,为整型
分类名称:cname,为字符串类型,指定长度20
SQL实现
– 切换到数据库 db1 USE db1;
– 创建表
CREATE TABLE category( cid INT,
cname VARCHAR(20)
);
需求2: 创建测试表
表名: test1
表中字段:
测试ID : tid ,为整型
测试时间: tdate , 为年月日的日期类型
SQL实现
– 创建测试表
CREATE TABLE test1(
tid INT, tdate DATE
);
需求3: 快速创建一个表结构相同的表(复制表结构) 语法格式:
create table 新表明 like 旧表名
代码示例
– 创建一个表结构与 test1 相同的 test2表CREATE TABLE test2 LIKE test1;
– 查看表结构
DESC test2;
3.5.3查看表
命令 说明
show tables; 查看当前数据库中的所有表名
desc 表名; 查看数据表的结构
代码示例
– 查看当前数据库中的所有表名
SHOW TABLES;
– 显示当前数据表的结构
DESC category;
– 查看创建表的SQL语句
SHOW CREATE TABLE category;
3.5.4删除表
命令 说明
drop table 表名; 删除表(从数据库中永久删除某一张表)
drop table if exists 表名; 判断表是否存在, 存在的话就删除,不存在就执行删除
代码示例
– 直接删除 test1 表
DROP TABLE test1;
– 先判断 再删除test2表
DROP TABLE IF EXISTS test2;
3.5.5修改表
1)修改表名语法格式
rename table 旧表名 to 新表名
需求: 将category表 改为 category1
RENAME TABLE category TO category1;
2) 修改表的字符集语法格式
alter table 表名 character set 字符集
需求: 将category表的字符集 修改为gbk
alter table category character set gbk;
3)向表中添加列, 关键字语法格式:
alert table 表名 add 字段名称 字段类型
需求: 为分类表添加一个新的字段为 分类描述 cdesc varchar(20)
为分类表添加一个新的字段为 分类描述 cdesc varchar(20) ALTER TABLE category ADD cdesc VARCHAR(20);
4)修改表中列的 数据类型或长度 , 关键字语法格式:
alter table 表名 modify 字段名称 字段类型
需求:对分类表的描述字段进行修改,类型varchar(50)
ALTER TABLE category MODIFY cdesc VARCHAR(50);
5)修改列名称 , 关键字语法格式
alter table 表名 change 旧列名 新列名 类型(长度);
需求: 对分类表中的 desc字段进行更换, 更换为 description varchar(30)
ALTER TABLE category CHANGE cdesc description VARCHAR(30);
6)删除列 ,关键字语法格式
alter table 表名 drop 列名;
需求: 删除分类表中description这列
ALTER TABLE category DROP description;
3.6DML 操作表中数据
SQL中的DML 用于对表中的数据进行增删改操作
3.6.1插入数据
语法格式:
insert into 表名 (字段名1,字段名2…) values(字段值1,字段值2…);
1)代码准备,创建一个学生表:
表名:student 表中字段:
学员ID, sid int
姓名, sname varchar(20)
年龄, age int
性别, sex char(1)
地址, address varchar(40)
创建学生表
CREATE TABLE student( sid INT,
sname VARCHAR(20),
age INT, sex CHAR(1),
address VARCHAR(40)
);
2)向 学生表中添加数据,3种方式
方式1: 插入全部字段, 将所有字段名都写出来
INSERT INTO student (sid,sname,age,sex,address) VALUES(1,‘孙悟空’,20,‘男’,‘花果山’);
方式2: 插入全部字段,不写字段名
INSERT INTO student VALUES(2,‘孙悟饭’,10,‘男’,‘地球’);
方式3:插入指定字段的值
INSERT INTO category (cname) VALUES(‘白骨精’);
注意:
1)值与字段必须要对应,个数相同&数据类型相同
2)值的数据大小,必须在字段指定的长度范围内
3)varchar char date类型的值必须使用单引号,或者双引号 包裹。
4)如果要插入空值,可以忽略不写,或者插入null
5) 如果插入指定字段的值,必须要上写列名
3.6.2更改数据
语法格式1:不带条件的修改
update 表名 set 列名 = 值
语法格式2:带条件的修改
update 表名 set 列名 = 值 [where 条件表达式:字段名 = 值 ]
1)不带条件修改,将所有的性别改为女(慎用!!)
UPDATE student SET sex = ‘女’;
2)带条件的修改,将sid 为3的学生,性别改为男
UPDATE student SET sex = ‘男’ WHERE sid = 3;
3)一次修改多个列, 将sid为 2 的学员,年龄改为 20,地址改为 北京
UPDATE student SET age = 20,address = ‘北京’ WHERE sid = 2;
3.6.3删除数据
语法格式1:删除所有数据
delete from 表名
语法格式2: 指定条件 删除数据
delete from 表名 [where 字段名 = 值]
1)删除 sid 为 1 的数据
DELETE FROM student WHERE sid = 1;
2)删除所有数据
DELETE FROM student;
3)如果要删除表中的所有数据,有两种做法
1.delete from 表名; 不推荐. 有多少条记录 就执行多少次删除操作. 效率低
2.truncate table 表名: 推荐. 先删除整张表, 然后再重新创建一张一模一样的表. 效率高
3.7DQL 查询表中数据
3.7.1准备数据
INSERT INTO emp VALUES(11,‘兔八哥’,‘女’, 300,‘2010-03-14’,财务部);
3.7.2简单查询
查询不会对数据库中的数据进行修改.只是一种显示数据的方式 SELECT
语法格式
select 列名 from 表名
需求1: 查询emp中的 所有数据
SELECT * FROM emp; – 使用 * 表示所有列
需求2: 查询emp表中的所有记录,仅显示id和name字段
SELECT eid,ename FROM emp;
需求3: 将所有的员工信息查询出来,并将列名改为中文别名查询,使用关键字
使用 AS关键字,为列起别名SELECT
eid AS ’ 编 号 ', ename AS ‘姓名’ , sex AS ’ 性 别 ', salary AS ‘薪资’,
hire_date ‘入职时间’, – AS 可以省略
dept_name ‘部门名称’ FROM emp;
需求4:查询一共有几个部门使用去重关键字
– 使用distinct 关键字,去掉重复部门信息
SELECT DISTINCT dept_name FROM emp;
需求5: 将所有员工的工资 +1000 元进行显示运算查询 (查询结果参与运算)
SELECT ename , salary + 1000 FROM emp;
3.7.3条件查询
如果查询语句中没有设置条件,就会查询所有的行信息,在实际应用中,一定要指定查询条件,对记录进行过 滤
语法格式
select 列名 from 表名 where 条件表达式
- 先取出表中的每条数据,满足条件的数据就返回,不满足的就过滤掉
运算符
1)比较运算符
运算符 说明
< <= >= = <> != 大于、小于、大于(小于)等于、不等于
BETWEEN …AND… 显示在某一区间的值
例如: 2000-10000之间: Between 2000 and 10000
IN(集合) 集合表示多个值,使用逗号分隔,例如: name in (悟空,八戒)
in中的每个数据都会作为一次条件,只要满足条件就会显示
LIKE ‘%张%’ 模糊查询
IS NULL 查询某一列为NULL的值, 注: 不能写 = NULL
2)逻辑运算符
运算符 说明
And && 多个条件同时成立
Or || 多个条件任一成立
Not 不成立,取反。
需求1:
查询员工姓名为黄蓉的员工信息
查询薪水价格为5000的员工信息
查询薪水价格不是5000的所有员工信息
查询薪水价格大于6000元的所有员工信息
查询薪水价格在5000到10000之间所有员工信息
查询薪水价格是3600或7200或者20000的所有员工信息
代码实现
查询薪水价格在5000到10000之间所有员工信息
SELECT * FROM emp WHERE salary BETWEEN 5000 AND 10000;
查询薪水价格是3600或7200或者20000的所有员工信息
– 方式1: or
SELECT * FROM emp WHERE salary = 3600 OR salary = 7200 OR salary = 20000;
– 方式2: in() 匹配括号中指定的参数
SELECT * FROM emp WHERE salary IN(3600,7200,20000);
需求2:
查询含有’精’字的所有员工信息
查询以’孙’开头的所有员工信息
查询第二个字为’兔’的所有员工信息
查询没有部门的员工信息
查询有部门的员工信息
模糊查询 通配符
通配符 说明
% 表示匹配任意多个字符串,
_ 表示匹配 一个字符
查询含有’精’字的所有员工信息
SELECT * FROM emp WHERE ename LIKE ‘%精%’;
查询以’孙’开头的所有员工信息
SELECT * FROM emp WHERE ename LIKE ‘孙%’;
查询第二个字为’兔’的所有员工信息
SELECT * FROM emp WHERE ename LIKE ‘_兔%’;
查询没有部门的员工信息
SELECT * FROM emp WHERE dept_name IS NULL;
– SELECT * FROM emp WHERE dept_name = NULL;
查询有部门的员工信息
SELECT * FROM emp WHERE dept_name IS NOT NULL;
任务二_MySQL单表&约束&事务
1.DQL操作单表
1.1创建数据库,复制表
1)创建一个新的数据库 db2
CREATE DATABASE db2 CHARACTER SET utf8;
2)将db1数据库中的 emp表 复制到当前 db2数据库
1.2排序
通过 ORDER BY 子句,可以将查询出的结果进行排序(排序只是显示效果,不会影响真实数据)
语法结构
SELECT 字段名 FROM 表名 [WHERE 字段 = 值] ORDER BY 字段名 [ASC / DESC]
ASC 表示升序排序(默认)
DESC 表示降序排序
1.2.1排序方式
1)单列排序
只按照某一个字段进行排序, 就是单列排序
需求1:
使用 salary 字段,对emp 表数据进行排序 (升序/降序)
– 默认升序排序 ASC
SELECT * FROM emp ORDER BY salary;
– 降序排序
SELECT * FROM emp ORDER BY salary DESC;
2)组合排序
同时对多个字段进行排序, 如果第一个字段相同 就按照第二个字段进行排序,以此类推
需求2:
在薪水排序的基础上,再使用id进行排序, 如果薪水相同就以id 做降序排序
– 组合排序
SELECT * FROM emp ORDER BY salary DESC, eid DESC;
1.3聚合函数
之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵 向查询,它是对某一列的值进行计算,然后返回一个单一的值(另外聚合函数会忽略null空值。);
语法结构
SELECT 聚合函数(字段名) FROM 表名;
我们来学习5个聚合函数
聚合函数 作用
count(字段) 统计指定列不为NULL的记录行数
sum(字段) 计算指定列的数值和
max(字段) 计算指定列的最大值
min(字段) 计算指定列的最小值
avg(字段) 计算指定列的平均值
需求1:
#1 查询员工的总数
#2 查看员工总薪水、最高薪水、最小薪水、薪水的平均值
#3 查询薪水大于4000员工的个数
#4 查询部门为’教学部’的所有员工的个数
#5 查询部门为’市场部’所有员工的平均薪水
SQL实现
#1 查询员工的总数
– 统计表中的记录条数 使用 count()
SELECT COUNT(eid) FROM emp; – 使用某一个字段
SELECT COUNT(*) FROM emp; – 使用 *
SELECT COUNT(1) FROM emp; – 使用 1,与 * 效果一样
– 下面这条SQL 得到的总条数不准确,因为count函数忽略了空值
– 所以使用时注意不要使用带有null的列进行统计
SELECT COUNT(dept_name) FROM emp;
#2 查看员工总薪水、最高薪水、最小薪水、薪水的平均值
– sum函数求和, max函数求最大, min函数求最小, avg函数求平均值SELECT
SUM(salary) AS ‘总薪水’, MAX(salary) AS ‘最高薪水’, MIN(salary) AS ‘最低薪水’, AVG(salary) AS ‘平均薪水’
FROM emp;
#3 查询薪水大于4000员工的个数
SELECT COUNT(*) FROM emp WHERE salary > 4000;
#4 查询部门为’教学部’的所有员工的个数
SELECT COUNT(*) FROM emp WHERE dept_name = ‘教学部’;
#5 查询部门为’市场部’所有员工的平均薪水
SELECT
AVG(salary) AS ‘市场部平均薪资’ FROM emp
WHERE dept_name = ‘市场部’;
1.4分组
分组查询指的是使用 GROUP BY 语句,对查询的信息进行分组,相同数据作为一组
语法格式
SELECT 分组字段/聚合函数 FROM 表名 GROUP BY 分组字段 [HAVING 条件];
需求1: 通过性别字段 进行分组
– 按照性别进行分组操作
SELECT * FROM emp GROUP BY sex; – 注意 这样写没有意义
分析: GROUP BY 分组过程
注意:
分组时可以查询要分组的字段, 或者使用聚合函数进行统计操作.
- 查询其他字段没有意义
需求: 通过性别字段 进行分组,求各组的平均薪资
SELECT sex, AVG(salary) FROM emp GROUP BY sex;
需求2:
#1.查询所有部门信息
#2.查询每个部门的平均薪资
#3.查询每个部门的平均薪资, 部门名称不能为null
SQL实现
#3.查询每个部门的平均薪资, 部门名称不能为null SELECT
dept_name AS ‘部门名称’, AVG(salary) AS ‘平均薪资’
FROM emp WHERE dept_name IS NOT NULL GROUP BY dept_name;
需求3:
查询平均薪资大于6000的部门.
分析:
1)需要在分组后,对数据进行过滤,使用 关键字
2)分组操作中的having子语句,是用于在分组后对数据进行过滤的,作用类似于where条件。
SQL实现:
查询平均薪资大于6000的部门
– 需要在分组后再次进行过滤,使用 having SELECT
dept_name , AVG(salary)
FROM emp WHERE dept_name IS NOT NULL GROUP BY dept_name HAVING AVG(salary) > 6000 ;
where 与 having的区别
过滤方式 特点
where where 进行分组前的过滤
where 后面不能写 聚合函数
having having 是分组后的过滤
having 后面可以写 聚合函数
1.5limit关键字
limit 关键字的作用
limit是限制的意思,用于 限制返回的查询结果的行数 (可以通过limit指定查询多少行数据) limit 语法是 MySql的方言,用来完成分页
语法结构
SELECT 字段1,字段2… FROM 表名 LIMIT offset , length;
参数说明
limit offset , length; 关键字可以接受一个 或者两个 为0 或者正整数的参数
offset 起始行数, 从0开始记数, 如果省略 则默认为 0.
length 返回的行数
需求1:
查询emp表中的前 5条数据
查询emp表中 从第4条开始,查询6条
SQL实现
查询emp表中的前 5条数据
– 参数1 起始值,默认是0 , 参数2 要查询的条数
SELECT * FROM emp LIMIT 5; SELECT * FROM emp LIMIT 0 , 5;
查询emp表中 从第4条开始,查询6条
– 起始值默认是从0开始的.
SELECT * FROM emp LIMIT 3 , 6;
需求2: 分页操作 每页显示3条数据
SQL实现
– 分页操作 每页显示3条数据
SELECT * FROM emp LIMIT 0,3; – 第1页
SELECT * FROM emp LIMIT 3,3; – 第2页 2-1=1 1*3=3 SELECT * FROM emp LIMIT 6,3; – 第三页
– 分页公式 起始索引 = (当前页 - 1) * 每页条数
– limit是MySql中的方言
2.SQL约束
1)约束的作用:
对表中的数据进行进一步的限制,从而保证数据的正确性、有效性、完整性. 违反约束的不正确数据,将无法插入到表中
2)常见的约束
约束名 约束关键字
主键 primary key
唯一 unique
非空 not null
外键 foreign key
2.1主键约束
特点 不可重复 唯一 非空
作用 用来表示数据库中的每一条记录
3.1.1添加主键约束
语法格式
字段名 字段类型 primary key
1)需求: 创建一个带主键的表
方式1 创建一个带主键的表
CREATE TABLE emp2(
– 设置主键 唯一 非空eid INT PRIMARY KEY, ename VARCHAR(20), sex CHAR(1)
);
– 删除表
DROP TABLE emp2;
– 方式2 创建一个带主键的表
CREATE TABLE emp2(
eid INT ,
ename VARCHAR(20), sex CHAR(1),
– 指定主键为 eid字段
PRIMARY KEY(eid)
);
– 方式3 创建一个带主键的表
CREATE TABLE emp2(
eid INT ,
ename VARCHAR(20), sex CHAR(1)
)
– 创建的时候不指定主键,然后通过 DDL语句进行设置ALTER TABLE emp2 ADD PRIMARY KEY(eid);
DESC 查看表结构
– 查看表的详细信息
DESC emp2;
2)测试主键的唯一性 非空性
正常插入一条数据
INSERT INTO emp2 VALUES(1,‘宋江’,‘男’);
插入一条数据,主键为空
– Column ‘eid’ cannot be null 主键不能为空
INSERT INTO emp2 VALUES(NULL,‘李逵’,‘男’);
插入一条数据,主键为 1
– Duplicate entry ‘1’ for key ‘PRIMARY’ 主键不能重复
INSERT INTO emp2 VALUES(1,‘孙二娘’,‘女’);
3)哪些字段可以作为主键 ?
通常针对业务去设计主键,每张表都设计一个主键id
主键是给数据库和程序使用的,跟最终的客户无关,所以主键没有意义没有关系,只要能够保证不重复 就好,比如 身份证就可以作为主键.
3.1.2删除主键约束
删除 表中的主键约束 (了解)
– 使用DDL语句 删除表中的主键
ALTER TABLE emp2 DROP PRIMARY KEY;
DESC emp2;
3.1.3主键的自增
注: 主键如果让我们自己添加很有可能重复,我们通常希望在每次插入新记录时,数据库自动生成主键字段的值.
关键字:
AUTO_INCREMENT 表示自动增长(字段类型必须是整数类型)
1)创建主键自增的表
– 创建主键自增的表
CREATE TABLE emp2(
– 关键字 AUTO_INCREMENT,主键类型必须是整数类型eid INT PRIMARY KEY AUTO_INCREMENT,
ename VARCHAR(20), sex CHAR(1)
);
2)添加数据 观察主键的自增
INSERT INTO emp2(ename,sex) VALUES(‘张三’,‘男’); INSERT INTO emp2(ename,sex) VALUES(‘李四’,‘男’); INSERT INTO emp2 VALUES(NULL,’ 翠 花 ‘,’ 女 '); INSERT INTO emp2 VALUES(NULL,‘艳秋’,‘女’);
3.1.4修改主键自增的起始值
默认地 AUTO_INCREMENT 的开始值是 1,如果希望修改起始值,请使用下面的方式
– 创建主键自增的表,自定义自增其实值
CREATE TABLE emp2(
eid INT PRIMARY KEY AUTO_INCREMENT, ename VARCHAR(20),
sex CHAR(1)
)AUTO_INCREMENT=100;
– 插入数据,观察主键的起始值
INSERT INTO emp2(ename,sex) VALUES(‘张百万’,‘男’); INSERT INTO emp2(ename,sex) VALUES(‘艳秋’,‘女’);
3.1.5DELETE和TRUNCATE对自增长的影响
删除表中所有数据有两种方式
清空表数据的方式 特点
DELETE 只是删除表中所有数据,对自增没有影