MySql基础

、SQL语句介绍

1. MySql的数据库结构

目标
  • 理解MySql的结构
  • 了解MySql相关的概念
讲解

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sBlaMKjd-1579410985217)(img/1564493973153.png)]

  • 相关的概念:
    • database:数据库,MySql里可以有多个database
    • table:表,一个database里可以有多个table
      • 记录:表里每一行/每一条数据,称为一条记录
    • column:字段,一个table里可以有多个column
小结
  • 客户端:cmd、navicat、Java代码
    • 在客户端输入SQL语句:操作数据库
  • 服务端:
    • 数据库服务器:安装了数据库软件的电脑
    • DBMS:数据库管理系统,指的是MySql软件
    • database:存储数据的仓库,通常是每个系统有一个database
    • table:存储数据的表
    • column:字段,表里的每一列叫字段
    • 记录:表里的每一行叫一条记录
  • 一个DBMS可以管理多个database;一个database里可以有多张table;一张table里可以有多个 字段和多个记录

2. 什么是SQL

目标
  • 了解SQL的概念
  • 能说出SQL的分类
讲解
什么是SQL
  • SQL:Structure Query Language(结构化查询语言),通过sql操作数据库(操作数据库,操作表,
    操作数据)
  • SQL被美国国家标准局(ANSI)确定为关系型数据库语言的美国标准,后来被国际化标准组织
    (ISO)采纳为关系数据库语言的国际标准
  • SQL规范:各数据库厂商(MySql,oracle,sql server)都支持ISO的SQL标准。
  • SQL方言:各数据库厂商在标准的基础上做了自己的扩展。 各个数据库自己特定的语法
SQL分类
  • DDL:DataBase Definition Language,数据定义语言。用来定义数据库结构,比如:库、表等等
  • DML:DataBase Manipulation Lanaguage,数据操作语言。用来增、删、改数据的
  • DQL:DataBase Query Lanaguage,数据查询语言。用来查询数据的
  • DCL:DataBase Controll Lanaguage,数据控制语言。DBA使用的,进行权限管理
    • DBA:DataBase Aministrator,数据库管理员
小结
  • SQL:结构化查询语言,用于操作数据库的
  • 分类:
    • DDL:数据定义语言,用于定义database、table
    • DML:数据操作语言,用于增、删、改数据的
    • DQL:数据查询语言,用于查询数据的
    • DCL:数据控制语言,DBA使用进行权限控制的

二、SQL操作MySql【重点】

1 DDL语句

1.1 DDL操作库database
目标
  • 能够使用DDL管理database
分析
  • 管理database,常用的有:
    • 创建database
    • 查看database
    • 修改database
    • 使用database
    • 删除database
讲解
语法
  • 创建库:create database [if not exists] 库名称 [character set 字符集]
  • 查询所有库:show databases
  • 查看一个库的创建信息:show create database 库名称
  • 修改库:alter database 库名称 [default] character set 字符集
  • 切换库/使用库:use 库名称
  • 查看现在在哪个库里:select database()
  • 删除库:drop database 库名称
-- 1. 创建库:名称为day01,字符集为gbk的数据库
--    create database 库名称 charcter set 字符集
CREATE DATABASE day01 character set gbk;

-- 2. 查看库:
--    查询所有库:show databases;
show databases;
--    查看库的创建信息:show create database 库名称;
show create database day01;

-- 3. 修改库: 不建议修改字符集
--    修改库的字符集:alter database 库名称 character set 字符集;
alter database day01 character set utf8;

-- 4. 切换库/使用库
--     切换库:use 库名称;
use day01;
--     查看当前使用的哪个库:select database();
select database();

-- 5. 删除库
--    删除库:drop database 库名称;
drop database day01;
练习
-- 1. 创建一个库,名称为:heima。字符集默认
create database heima;
-- 2. 如果库heima不存在,就创建。
create database if not exists heima;
-- 3. 创建一个库,名称为itheima,字符集gbk
create database itheima character set gbk;
-- 4. 如果库itheima不存在,就创建,并且指定字符集为gbk
create database if not exists itheima character set gbk;
-- 5. 查询有哪些库
show databases;
-- 6. 查看heima库的创建信息
show create database heima;
-- 7. 把itheima库的字符集修改为utf8(不建议修改字符集)
alter database itheima character set utf8;
-- 8. 删除库itheima
drop database itheima;
-- 9. 使用库heima
use heima;
-- 10. 查询现在使用的是哪个库
select database();
小结
  • 创建库:create database [if not exists] 库名称 [character set 字符集]
  • 查看库:
    • 查看所有库:show databases;
    • 查看库的创建信息:show create database 库名称;
  • 修改库:
    • 修改字符集:alter database 库名称 character set 字符集;
  • 切换库:
    • 切换库:use 库名称;
    • 查看当前库:select database()
  • 删除库:drop database 库名称;
1.2 DDL操作表table
目标
  • 能够使用DDL语句管理table
分析
  • MySql的数据类型介绍

  • 管理table,常用的有:

    • 创建table
    • 查看table
    • 修改table
    • 删除table
讲解
MySql的数据类型
数据类型说明对应Java类型
int整数类型,占4字节int, Integer
double(m,n)小数类型,占8字节。总长度m,小数长度n。double(5,2)double, Double
varchar(n)可变长度字符串。varchar(10),存储"ab",占2个字符String
char(n)固定长度字符串。char(10),存储"ab",占10个字符String
date日期类型。格式:yyyy-MM-ddDate
datetime日期时间类型。格式:yyyy-MM-dd HH:mm:ssjava.sql.Timestamp,Date
DDL操作table
  • 语法

    • 创建表:create table 表名称(字段名 类型 [约束], 字段名 类型 [约束], ...)
    • 查看所有表:show tables
    • 查看表结构:desc 表名称
    • 查看表创建信息:show create table 表名称
    • 修改表:
      • 重命名表:rename table 原名称 to 新名称
      • 添加字段:alter table 表名称 add 字段名 类型
      • 修改字段类型:alter table 表名称 modify 字段名 新类型
      • 修改字段名称:alter table 表名称 change 原字段名 新字段名 类型
      • 删除字段:alter table drop 字段名
    • 删除表:drop table 表名称
    --  一定要先选择一个库database之后,再操作table  ---
    
    -- 1. 创建表:创建用户表,编号、姓名、年龄、性别、生日
    --    create table 表名称(字段名 类型, 字段名 字段类型, ...)
    create table user(
    	id int,
    	name varchar(32),
    	age int,
    	sex char(1),
    	birthday date
    );
    
    -- 2. 查看表:
    --    查看所有表:show tables;
    show tables;
    --    查看表创建信息:show create table ;
    show create table user;
    --    查看表结构:desc 表名称;
    desc user;
    
    -- 3. 修改表
    --    重命名表:rename table 表名称 to 新名称;
    rename table user to users;
    --    增加字段:alter table 表名称 add 字段名 类型 [约束];
    alter table users add address varchar(50);
    desc users;
    --    修改字段类型:alter table 表名称 modify 字段名 新类型;
    alter table users modify sex varchar(1);
    --    修改字段名称:alter table 表名称 change 原字段名 新字段名 新类型;  gender
    alter table users change sex gender char(1);
    --    删除字段:alter table 表名称 drop 字段名;
    alter table users drop address;
    
    -- 4. 删除表:drop table 表名称;
    drop table users;
    
  • 练习

    -- 1. 在heima库里,创建一张表:student。要求有字段:学号、姓名、年龄、性别、生日、地址
    create table student(
    	id int,
    	name varchar(32),
    	age int,
    	sex char(1),
    	birthday date,
    	address varchar(64)
    );
    -- 2. 查询当前库里有哪些表
    show tables;
    -- 3. 查看表student的创建信息
    show create table student;
    -- 4. 查看表student的结构
    desc student;
    -- 5. 删除表student
    drop table student;
    -- 6. 给student表添加列:英语成绩 english  int,  工资 salary double
    alter table student add english int;
    alter table student add salary double;
    -- 7. 修改student表:把salary的类型改为int
    alter table student modify salary int;
    -- 8. 修改student表:把english重命名为math
    alter table student change english math int;
    -- 9. 修改student表:删除address列
    alter table student drop address;
    -- 10. 把student表重命名为:students
    rename table student to students;
    
小结
  • 数据库类型:
    • 整数类型:int
    • 双精度:double(5, 2),长度是5,小数有2位
    • 固定长度字符串:char(10)
    • 可变长度字符串:varchar(10)
    • 日期类型:date
    • 日期时间类型:datetime
  • 操作table:
    • 创建tablecreate table 表名称(字段名 类型, 字段名 类型, ...)
    • 查看table
      • 查看所有表:show tables
      • 查看表创建信息:show create table 表名称
      • 查看表结构:desc 表名称
    • 修改table
      • 重命名表:rename table 表名称 to 新名称
      • 添加字段:alter table 表名称 add 字段名 类型;
      • 修改字段类型:alter table 表名称 modify 字段名 新类型
      • 修改字段名称:alter table 表名称 change 原字段 新字段名 新类型
      • 删除字段:alter table 表名称 drop 字段名
    • 删除表:drop table 表名称

2 DML语句【重点】

目标
  • 能够使用DML,管理table里的数据
分析
  • DML的操作包含:
    • 插入数据/记录
    • 修改数据/记录
    • 删除数据/记录
讲解
语法
  • 插入数据:MySql可以以字符串形式插入一切类型的数据

    • 插入所有字段:insert into 表名称 values (值1, 值2, ...)

      注意:

      • 值的个数必须等于表里字段的个数
      • 值的顺序必须和表里字段的顺序一样
    • 插入指定字段:insert into 表名称 (字段名1, 字段名2, ..., 字段名n) values (值1, 值2, ..., 值n)

      注意:

      • 值的个数 必须 和前边声明的字段的个数一样
      • 值的顺序 必须 和前边声明的字段的顺序一样
  • 修改数据

    • update 表名称 set 字段名1=值1, 字段名2=值2,..., 字段名n=值n [where 条件]
  • 删除数据

    • 删除符合条件的数据:delete from 表名称 [where 条件]
    • 摧毁重建表:truncate table 表名称
-- 1. 插入数据:向user表插入一条记录
--    向所有字段插入数据:insert into 表名称 values (值1, 值2,... 值n)
INSERT into user values (1, '大郎', 35, '男', '1985-02-02');
--    向指定字段插入数据:insert into 表名称(字段1, 字段2,..., 字段n) values (值1, 值2,..., 值n)
insert into user (id, name, sex) values (2, '金莲', '女');

-- 2. 修改数据:update 表名称 set 字段1=值1, 字段2=值2,.., 字段n=值n [where 条件]
update user set age = 18;
update user set sex = '女', birthday = '2000-02-02';
update user set sex = '男' where id = 1;

-- 3. 删除数据:delete from 表名称 [where 条件]
delete from user where name = '大郎';
练习
-- 1. 向students表里添加数据:给表所有字段都设置值
insert into students values(1, '二郎', 30, '男', '1990-10-21', 100, 100000);
-- 2. 向students表里添加数据:只插入id、name、age
insert into students (id, name, age) values (2, '庆庆', 40); 
-- 3. 修改students表里id为1的数据:修改salary为20000
update students set salary = 20000 where id = 1;
-- 4. 修改students表里id为1的数据:修改性别为女,修改math为60
update students set sex = '女', math = 60 where id = 1;
-- 5. 删除students表里id为1的数据
delete from students where id = 1;
-- 6. 删除students表里所有数据
TRUNCATE table students;
delete from students;
小结
  • 插入数据:
    • 插入所有字段:insert into 表名称 values (值1,值2,...,值n)
    • 插入指定字段:insert into 表名称 (字段1,字段2,..,字段n) values (值1,值2,...,值n)
  • 修改数据:
    • update 表名称 set 字段1=值1, 字段2=值2,..,字段n= 值n where 条件
  • 删除数据:
    • delete from 表名称 where 条件
    • truncate table 表名称

3 DQL语句【重点】

3.1 简单查询
目标
  • 能够使用DQL,简单查询table里的数据
讲解
语法
  • 基本语法:select [distinct] 字段1,字段2..|* from 表名称

    • 查询并处理Null值:ifnull(字段, 默认值)

    • 查询并进行运算:+,-,*,/

    • 查询并起别名:字段名 [as] 别名

    • 去重查询:distinct

      distinct后边所有的字段值都一样,才是重复值,是要去掉的。

  • 注意:查询操作,不会对表里的数据有任何的影响

-- 给user表增字段salary double
alter table user add salary double;
-- 给user表增加字段dept varchar(32)
alter table user add dept varchar(32);

-- 1. 查询user表里所有字段的值
select * from user;
-- 2. 查询user表里所有用户的姓名
select id,name from user;

-- 3. 查询user表里每个用户的姓名和工资。如果工资为null,按0处理
select name, ifnull(salary, 0) from user;

-- 4. 查询user表里每个用户的姓名和  总收入:工资+奖金5000
select name, ifnull(salary,0) + 5000 from user;

-- 5. 查询user表里每个用户的姓名和  总收入(字段显示成“总收入”)
select name as '姓名', ifnull(salary,0) + 5000 '总收入' from user;

-- 6. 去重查询user表里每个用户所属的部门
select distinct dept from user;
练习
-- 0. 准备表和数据:增加一个字段english int。设置条记录里的英语成绩
ALTER TABLE students ADD english INT;
insert into students values (1, '张三', 30, '男', '1990-01-01', 60, 10000, 80);
insert into students values (2, '张三3', 30, '男', '1990-01-01', 60, 20000, null);
insert into students values (3, '李四', 30, '男', '1990-01-01', 60, null, 80);
insert into students values (4, '王五', 30, '男', '1990-01-01', 60, 30000, 80);
insert into students values (5, '赵六', 30, '男', '1990-01-01', 60, 40000, 80);

-- 1. 查询students表里所有数据
select * from students;
-- 2. 查询students里所有的姓名和年龄 
select name, age from students;
-- 3. 查询并处理null值:查询每个学生的姓名 和 成绩(英语和数学成绩,如果成绩为null,认为是0)
select name, ifnull(english, 0), ifnull(math, 0) from students;
-- 4. 查询students里每个学生的总成绩(如果成绩为null,认为是0)
select name, ifnull(english, 0) + ifnull(math,0) from students;
-- 5. 查询并起别名
select name '姓名', ifnull(english, 0) + ifnull(math,0) '总成绩' from students;
-- 6. 查询students表里所有的性别
select DISTINCT sex from students;
小结
  • 查询所有字段的值:select * from 表名称
  • 查询指定字段的值:select 字段1,字段2,...,字段n from 表名称
  • 查询并处理null值:select ifnull(字段,默认值) from 表名称
  • 查询并进行运算:select 字段1+字段2, 字段3-字段4 from 表名称
  • 查询并起别名:select 字段1 别名1, 字段2 别名2,.., 字段n 别名n from 表名称
  • 查询并去重:select distinct 字段1,字段2,...,字段n from 表名称
3.2 条件查询
目标
  • 能够使用DQL进行条件查询
分析
  • 单条件查询
    • 范围查询
    • 模糊查询
  • 多条件查询
讲解
语法
  • 条件查询语法:select * from 表名称 where 条件
    • 条件运算符有:
      • >, <, >=, <=, =, <>
      • is nullis not null
    • 模糊查询:like '表达式'not like '表达式'。在表达式里可以写:
      • _:一个任意字符
      • %:任意个任意字符
    • 范围查询:
      • between 开始值 and 结束值,包含开始值和结束值
      • in(值1, 值2, ....)
    • 多条件连接符有:and, or not(条件)
-- 1. 判断条件:查询年龄大于25岁的用户
select * from user where age > 25;
-- 2. 判断条件:查询年龄大于等于20岁的用户
select * from user where age >= 20;
-- 3. 判断条件:查询工资不为空的用户
select * from user where salary is not null;
select * from user where salary is null;
-- 4. 模糊查询:查询姓名以“王”开头的用户
select * from user where name like '王%';
select * from user where name like '%王%';
-- 5. 模糊查询:查询姓名以“王”开头的,并且名称为两个字的用户
select * from user where name like '王_';
select * from user where CHAR_LENGTH(name) = 3;
-- 6. 范围查询:查询工资在10000到100000之间的用户
select * from user where salary between 10000 and 100000;
-- 7. 集合查询:查询财务部和销售部的用户
select * from user where dept in('财务部', '销售部');


-- 8. 查询年龄大于等于20,并且工资大于等于10000的用户
select * from user where age >= 20 and salary >= 10000;

-- 9. 查询年龄小于30岁,或者性别为男性的用户
select * from user where age < 30 or sex = '男';

-- 10. 查询不是财务部的用户
select * from user where not(dept = '财务部')
select * from user where dept <> '财务部'
练习
  • 单条件查询
alter table students add address varchar(64);

-- 1. 单条件查询
-- 1.1 查询所有的男同学
select * from students where sex = '男';
-- 1.2 查询年龄在25岁以上的同学
select * from students where age > 25;
-- 1.3 查询地址不是香港的同学
select * from students where address <> '香港';
-- 1.4 查询英语成绩为空的同学
select * from students where english is null;
  • 多条件
alter table students add address varchar(64);

-- 1. 单条件查询
-- 1.1 查询所有的男同学
select * from students where sex = '男';
-- 1.2 查询年龄在25岁以上的同学
select * from students where age > 25;
-- 1.3 查询地址不是香港的同学
select * from students where address <> '香港';
-- 1.4 查询英语成绩为空的同学
select * from students where english is null;

-- 2. 多条件查询
-- 2.1 查询年龄大于25岁的男同学
select * from students where age > 25 and sex = '男';
-- 2.2 查询年龄小于25岁的同学,或者英语成绩大于80的同学
select * from students where age < 25 or english > 80;
-- 2.3 查询年龄不大于25岁的同学
select * from students where age <= 25;
select * from students where not(age > 25);
  • 范围条件
-- 3. 范围查询
-- 3.1 查询年龄在20到50之间(包含20和50)
select * from students where age between 20 and 50;
-- 3.2 查询地址是深圳和香港的同学
select * from students where address in ('深圳', '香港');
  • 模糊查询
-- 4. 模糊查询
-- 4.1 查询所有姓王的同学
select * from students where name like '王%';
-- 4.2 查询姓王的、名称为两个字的同学
select * from students where name like '王_';
-- 4.3 查询姓名里含有“三”字的同学
select * from students where name like '%三%';
-- 4.4 查询姓名为两个字的同学
select * from students where name like '__';
-- 4.5 查询姓名里不包含“三”字的同学
select * from students where name not like '%三%';
小结
  • 单条件的:
    • 条件判断:>, <, >=, <=, =, <>
    • 判空:is null is not null
    • 模糊查询:like '张%'like '张_' not like '张%'not like '张_'
    • 范围查询:between 开始值 and 结束值in(值1, 值2,.., 值n)
  • 多条件的:
    • and:并且,所有条件都必须符合
    • or:或者,任意条件满足即可
    • not:非,排除结果不要
3.3 排序查询
目标
  • 掌握DQL的排序查询
讲解
语法
  • order by 排序字段 排序规则, 排序字段2 排序规则2, ...
  • 排序规则有:
    • ASC:升序,从小到大,默认的
    • DESC:降序,从大到小
-- 1. 排序查询:order by 排序字段 排序规则
select * from user order by age asc;
-- 2. 排序查询:按照年龄从小到大排序,如果年龄相同,就按照工资从高到低排序
select * from user order by age asc, salary desc;
练习
-- 5. 排序查询
-- 5.1 查询所有的同学,按照年龄从小到大排列显示
select * from students order by age asc;
-- 5.2 查询所有的同学,按照年龄从小到大排列显示;如果年龄相同,按照数学成绩从低到高排序
select * from students order by age asc, math asc;
-- 5.3 查询所有的男同学,按照年龄从小到大排列显示;如果年龄相同,按照数学成绩从高到低排序
select * from students where sex = '男' order by age asc, math desc;
小结
  • select *|字段 from 表名称 [where 条件] order by 排序字段 排序规则, 排序字段 排序规则
  • 排序规则:
    • asc:升序
    • desc:降序
3.4 聚合函数
目标
  • 掌握聚合函数的作用和使用
讲解
语法
  • 聚合函数:用于进行列数据统计的。常用的聚合函数有:
    • count(字段):统计数量
    • sum(字段):求和
    • avg(字段):求平均值
    • max(字段):求最大值
    • min(字段):求最小值
  • 注意:所有聚合函数会忽略null值
练习
-- 6. 聚合函数
-- 6.1 查询学生表里的数量
select count(*) from students;
-- 6.2 查询所有学生的年龄总和
select sum(age) from students;
-- 6.3 查询所有学生的平均年龄
select avg(age) from students;
-- 6.4 查询最大年龄
select max(age) from students;
-- 6.5 查询最小年龄
select min(age) from students;
小结
  • 统计数量:count()
  • 求和:sum()
  • 求平均数:avg()
  • 求最大值:max()
  • 求最小值:min()
  • 注意:所有聚合函数会忽略null值
3.5 分组查询
目标
  • 能够实现分组查询
  • 理解where和having的区别
讲解
语法
  • 语法:group by 分组字段 [having 分组后的过滤条件]
  • 注意:select后边,只能跟分组的字段,或者聚合函数。不能查询与分组无关的字段
  • where和having的区别:
    • where在分组前执行;having在分组后执行
    • where过滤原始表的数据;having过滤分组后的数据
    • where里不要写聚合函数;having里可以写聚合函数
  • 分组查询的顺序:
    • 使用where对原始表进行过滤
    • 根据分组字段进行分组统计,得到分组后的结果
    • 使用having对分组后的结果进行过滤
-- 1. 分组查询
--    分别统计男性用户的数量,和女性用户的数量
select sex, count(*) from user group by sex;
--    分别统计每个部门的用户数量
select dept, count(*) from user group by dept;

--    分别统计每个部门的男性用户数量
select dept, count(*) from user where sex = '男' group by dept;
--    分别统计每个部门的用户数量,只要数量大于2的
select dept, count(*) from user group by dept having count(*) > 2;


-- where 和having的区别
-- 过滤的内容不一样:where过滤的是原始表; having过滤的是分组统计后的结果
-- 写法不一样:where里只能写原始字段的条件,不能跟聚合函数; having 可以有聚合函数
-- 过滤的时机不一样:where先过滤;having后过滤

-- 分组查询执行的过程:
-- 1. 先用where条件对原始表过滤
-- 2. 使用group by进行分组统计
-- 3. 再用having条件对分组统计后的结果过滤 

-- 注意:分组查询的select,只能select 分组字段,或者聚合函数;不能select 和分组无关的字段
练习
-- 7. 分组查询
-- 7.1 分组统计男生和女生的数量
select sex, count(*) from students group by sex;
-- 7.2 分组统计每个地方的学生数量
select address, count(*) from students group by address;
-- 7.3 分组统计每个地方的学生数量,只要数量大于1的
select address, count(*) from students group by address having count(*) > 1;
-- 7.4 分组统计每个地方的男生数量
select address, count(*) from students where sex = '男' group by address;
-- 7.5 分组统计每个地方的男生数量,只要数量大于1的
select address, count(*) from students where sex = '男' group by address having count(*) > 1;
小结
  • select 分组字段,聚合函数 from 表名称 where 过滤 group by 分组字段 having 分组后的过滤条件
  • where和having的区别
    • 过滤的内容:where过滤原始表;having过滤分组后的结果
    • 过滤的时机:where先过滤(在分组前);having后过滤(在分组后)
    • 过滤的写法:where 不能跟聚合函数;having后可以跟聚合函数
3.6 分页查询
目标
  • 能够实现分页查询
讲解
语法
  • 语法:limit 起始索引,查询数量
-- 1. 分页查询  limit 起始索引, 查询数量。  起始索引 = 每页几条 * (页码-1)
--    查询用户,每页3条,要查询第一页
select * from user limit 0, 3;
--    查询用户,每页3条,要查询第二页
select * from user limit 3, 3;
--    查询用户,每页3条,要查询第三页
select * from user limit 6, 3;
练习
-- 8. 分页查询:每页3条
-- 8.1 查询第1页的数据  
-- 8.2 查询第2页的数据  
小结
  • select * from 表名称 limit 起始索引, 查询数量
3.7 综合查询
-- 9. 综合查询
-- 9.1 分组统计每个地方的男生数量,只要数量大于等于1的。查询结果按照数量升序显示。 每页2条,显示第1页
select address, count(*) from students where sex = '男' group by address having count(*) >= 1 order by count(*) asc limit 0,2;
  • select 字段|聚合 from 表名称 where 条件 group by 分组字段 having 分组后过滤 order by 排序字段 排序规则 limit 起始索引,查询数量

五、MySql约束

目标

  • 理解数据库约束的概念
  • 能说出MySql的约束及其作用

分析

  • MySql中约束有:
    • 主键约束
    • 唯一性约束
    • 非空约束
    • 默认值约束
    • 外键约束(明天讲)

讲解

1. 主键约束
  • 主键:一张表里数据的唯一标识。原则上:每张表必须有主键,且只能有一个主键

  • 主键约束:

    • 作用:被主键约束的字段,值必须是非空、唯一

    • 语法:primary key [auto_increment]

      • 如果主键字段是整数,可以增加auto_increment,MySql会自动生成主键值:1,2,3, ... +1
      • 如果不是数字,不要增加auto_increment
  • 主键字段效果演示:

    -- 主键约束:被约束的字段值,必须非空、唯一
    
    -- 创建一张商品信息表。有字段:编号,名称,价格
    create table product(
    	id int PRIMARY key auto_increment,
    	pname varchar(100),
    	price double
    );
    
    -- 向product表里插入数据 
    insert into product values (1, '水杯', 59);
    -- 向product表里再插入数据:主键值还指定为1, 能否成功?不能  Duplicate entry '1' for key 'PRIMARY'
    insert into product values (1, '咖啡', 129);
    -- 向product表里插入数据:主键值指定为null,能否成功?能   因为主键设置了自增
    insert into product values (null, '香蕉', 20);
    
2. 唯一性约束
  • 作用:唯一性约束的字段,值不能重复,但是可以为null
  • 语法:字段名 类型 unique
  • 唯一性约束效果演示:
-- 唯一性约束:被唯一性约束的字段,值必须是唯一的,可以为null
drop table product;
create table product(
	id int primary key auto_increment,
	pname varchar(100) unique,
	price double
);
-- 向product表里插入数据
insert into product values (null, '键盘', 159);
-- 向product表里插入数据:商品名称还是 键盘,能否成功?不能。 Duplicate entry '键盘' for key 'pname'
insert into product values (null, '键盘', 159);
-- 向product表里插入数据:商品名称还是 空的,能否成功?能。唯一性约束允许null值
insert into product values (null, null, 159);
insert into product values (null, null, 159);
3. 非空约束
  • 作用:非空约束的字段,值不能为null
  • 语法:字段名 类型 not null
  • 非空约束效果演示:
-- 非空约束
drop table product;
create table product(
	id int primary key auto_increment,
	pname varchar(100) unique not null,
	price double
);
-- 向product表里插入数据:商品名称是null,能否成功?不能。 Column 'pname' cannot be null
insert into product values (null, null, 159);
insert into product values (null, '键盘', 159);
insert into product values (null, '键盘', 159);
4. 默认值约束
  • 作用:默认值约束的字段,如果不指定值,取默认值(如果指定null值,值就是null,不取默认值)
  • 语法:字段名 类型 default 默认值
  • 默认值约束效果演示:
-- 默认值约束
drop table product;
create table product(
	id int primary key auto_increment,
	pname varchar(100) unique not null,
	price double default 0
);
-- 向product表里插入数据:价格为null,有没有默认值?没有。因为指定了值是null
insert into product values (null, '鼠标', null);
-- 向product表里插入数据:不插入价格,有没有默认值?有。
insert into product(id,pname) values (null, '鼠标垫');

小结

  • 主键约束:
    • 作用:主键是一张表里数据的唯一标识,原则上每张表都要有一个主键。被主键约束的字段:非空唯一
    • 语法:primary key auto_increment
      • 如果主键字段是数字,可以加auto_increment。我们不指定主键值,MySql会自动生成主键值
  • 唯一性约束:
    • 作用:被唯一性约束的字段,值不能重复,但可以为null
    • 语法:unique
  • 非空约束:
    • 作用:被非空约束的字段,值不能为null
    • 语法:not null
  • 默认值约束:
    • 作用:被默认值约束的字段,如果不指定值,会取默认值
    • 语法:default 默认值
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值