1、主键约束
-
主键的添加:
-
在创建时添加
create table 表名( 字段名 字段类型 primary key, 字段名 字段类型。。。。。 ); -
在创建表之后,再添加
alter table 表名 add primary key(主键字段);
-
-
主键的删除
alter table 表名 drop primary key; -
注意事项:
- 主键时非空的:不能为空
- 主键是唯一的:不能重复
- 主键被删除之后,该字段依然是非空的,不能传入null或者不赋值
# 查询当前使用的数据库
SELECT database();
# 查询category表中的主键约束
DESC category;
# 创建一个persons表,并设定id为主键
CREATE TABLE persons(
id INT PRIMARY KEY ,
last_name VARCHAR(20),
first_name VARCHAR(20),
address VARCHAR(20),
city VARCHAR(20)
);
# 查询persons表的结构
DESC persons;
# 主键非空
# Field 'id' doesn't have a default value (id没有默认值)
# 在使用主键时,必须给主键传值或者设置默认值,否则会报错
# INSERT INTO persons(last_name, first_name) VALUES ('san', 'zhang');
# 主键唯一
INSERT INTO persons(id, last_name, first_name) VALUES (1, 'san', 'zhang'), (2, 'si','li');
# 再插入一条信息,保证除主键外的其他内筒均不相同
# Duplicate entry '1' for key 'PRIMARY'
# 主键中不能插入重复值,如果插入的值在主键中已经存在,则会报错,无法插入成功
# INSERT INTO persons(id, last_name, first_name) VALUES (1, 'wu', 'wang');
# 创建表时,可以没有主键
CREATE TABLE persons1(
id INT ,
last_name VARCHAR(20),
first_name VARCHAR(20),
address VARCHAR(20),
city VARCHAR(20)
);
# 创表完成后,依然可以添加主键
ALTER TABLE persons1 ADD PRIMARY KEY (id);
# 查看表结构
DESC persons1;
# 一张表中不能出现两个主键,如果定义两个主键,会出现如下报错
# Multiple primary key defined
ALTER TABLE persons1 ADD PRIMARY KEY (first_name);
# 主键的删除
ALTER TABLE persons1 DROP PRIMARY KEY ;
# desc查看表结构
# 在删除主键之后,原主键字段依然不能为空.
DESC persons1;
# Column 'id' cannot be null
# INSERT INTO persons(id, last_name, first_name) VALUES (NULL, 'san', 'zhang'), (2, 'si','li');
2、自动增长
-
auto_increment:自动增长
- 只能对整型自动增长
- 只能修饰键(一般修饰主键)
# 创建一个新表persons2
CREATE TABLE person2(
id INT PRIMARY KEY AUTO_INCREMENT,
last_name VARCHAR(20),
first_name VARCHAR(20),
address VARCHAR(20),
city VARCHAR(20)
);
# 查看表结构
DESC person2;
# 怎样验证自动增长呢?
# 不给id传值,且表中无其他数据,则id自动增长为从1开始自增的整数序列
INSERT INTO person2(last_name, first_name) VALUES ('san', 'zhang'), ('si', 'li');
# 如果给id传值,则表中将记录传入的id值,不进行自增操作
INSERT INTO person2(id, last_name, first_name) VALUES (6, 'san', 'zhang');
# 给id 传值为null也可以进行自增操作
# 主键自增时,是按照当前id值的最大值+1进行计算
INSERT INTO person2(id, last_name, first_name) VALUES (NULL, 'xiaolong', 'li');
INSERT INTO person2(id, last_name, first_name) VALUES (NULL, 'qingxia', 'lin');
# 创建一个新表persons3,查看是否可以不修饰键
# 结论:如果修饰的字段不是键,则会报如下错误
# Incorrect table definition; there can be only one auto column and it must be defined as a key
# CREATE TABLE person3(
# id INT AUTO_INCREMENT,
# last_name VARCHAR(20),
# first_name VARCHAR(20),
# address VARCHAR(20),
# city VARCHAR(20)
# );
# 修饰的内容可否不为整型
# 如果修饰的内容不是整型,则报如下错误
# Incorrect column specifier(指示语) for column 'id'
# CREATE TABLE person3(
# id VARCHAR(20) PRIMARY KEY AUTO_INCREMENT,
# last_name VARCHAR(20),
# first_name VARCHAR(20),
# address VARCHAR(20),
# city VARCHAR(20)
# );
3、非空约束
- not null:非空约束修饰的字段,不接受null值,在数据处理时不用对null值进行判断
- 在定义时,可以在约束位置直接添加非空约束。
- 在一个表中可以有多个非空约束。
# 创建persons3
CREATE TABLE persons3(
id INT PRIMARY KEY AUTO_INCREMENT NOT NULL ,
last_name VARCHAR(20) NOT NULL ,
first_name VARCHAR(20),
address VARCHAR(20),
city VARCHAR(20)
);
# 查看表结构
# 通过表的查询,我们得知id 和 last_name是 非空约束
DESC persons3;
# 查看非空约束能否不传值
# 如果没有传值,且没有默认值,则会报如下错误.
# Field 'last_name' doesn't have a default value
INSERT INTO persons3(first_name, address, city) VALUES ('li', '天津', '滨海新区');
# 如果给非空约束的字段赋控制,则会报如下错误.
# Column 'last_name' cannot be null
INSERT INTO persons3(last_name, first_name, address, city) VALUES (NULL ,'li', '天津', '滨海新区');
# 在使用null时不能使用引号包裹,否则将会变为文本类型数据,不再是空值
INSERT INTO persons3(last_name, first_name, address, city) VALUES ('null' ,'li', '天津', '滨海新区');
# null是一种数据类型,是空值类型
# 为什么null不用加引号呢?
# null是关键字
# 关键字:系统定义的具有特殊功能或者含义的字符组合
# 定义的字段名 叫做标识符
# 标识符:程序员自己定义的,具有特殊功能或含义的字符组合
4、唯一约束
- unique : 保证数据的唯一性,如果被唯一约束修饰,则不能出现重复值。
- 主键自动拥有唯一约束,如果主键被删除,则唯一约束消失。
# 创建一个新的表persons4
CREATE TABLE persons4(
id INT PRIMARY KEY AUTO_INCREMENT,
last_name VARCHAR(20) UNIQUE ,
first_name VARCHAR(20) UNIQUE ,
address VARCHAR(20),
city VARCHAR(20)
);
# 查询表结构
DESC persons4;
# 通过查询表结构,我们得知,last_name不能重复, first_name也不能重复, id为主键,同样不能重复.
# 插入数据,查看是否可以重复
INSERT INTO persons4(id, last_name,first_name) VALUES (1,'san', 'zhang');
# last_name 字段不能重复,因为有唯一约束
# Duplicate entry 'san' for key 'last_name'
INSERT INTO persons4(id,last_name,first_name) VALUES (2, 'san', 'li');
# 唯一约束,不能存重复值,但是可以存空值
INSERT INTO persons4(id,last_name,first_name) VALUES (NULL, 'si', NULL);
# 唯一约束,只约束字段设定的数据类型不能重复,如果为空值,不进行校对
INSERT INTO persons4(id,last_name,first_name) VALUES (NULL, 'wu', NULL);
# 空格可以存入数据库
INSERT INTO persons4(id,last_name,first_name) VALUES (NULL, null, ' ');
# 但是空格是varchar类型数据,也参与非空校验.
# Duplicate entry ' ' for key 'first_name'
# INSERT INTO persons4(id,last_name,first_name) VALUES (NULL, null, ' ');
5、简单查询
- 格式:select 字段名 from 表名
- 字段名可以指定一个,也可以指定多个,使用*代表查询所有字段
- 表名必须存在
- select后边可以对指定字段进行数学运算
# 准备商品表
CREATE TABLE product
(
pid INT PRIMARY KEY,
pname VARCHAR(20),
price DOUBLE,
category_id VARCHAR(32)
);
# 查询product表结构
DESC product;
# 插入数据
INSERT INTO product(pid,pname,price,category_id) VALUES(1,'联想',5000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(2,'海尔',3000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(3,'雷神',5000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(4,'杰克琼斯',800,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(5,'真维斯',200,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(6,'花花公子',440,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(7,'劲霸',2000,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(8,'香奈儿',800,'c003');
INSERT INTO product(pid,pname,price,category_id) VALUES(9,'相宜本草',200,'c003');
INSERT INTO product(pid,pname,price,category_id) VALUES(10,'面霸',5,'c003');
INSERT INTO product(pid,pname,price,category_id) VALUES(11,'好想你枣',56,'c004');
INSERT INTO product(pid,pname,price,category_id) VALUES(12,'香飘飘奶茶',1,'c005');
INSERT INTO product(pid,pname,price,category_id) VALUES(13,'海澜之家',1,'c002');
# 简单查询,不包含条件
# 将所有商品进行查询,查询后展示所有商品信息
# select 要查询的字段名 from 表名 代表要从某个表中查询某个字段.
# 使用*可以查询到当前表中的所有字段
SELECT * FROM product;
# 查询所有商品的指定字段(商品名,商品价格)
SELECT pname, price FROM product;
# 将商品名称及商品价格互换位置,则输出的数据列位置同样进行更改
SELECT price, pname FROM product;
# 查询所有商品价格的同时对所有的商品价格+10后进行输出
# 在select后边可以进行数学运算
SELECT pname, price + 10 FROM product;
6、比较查询
- < > <= >= = != <>
# 条件查询
# 比较查询 > < >= <= = <> !=
# 需求:查询商品价格大于600的所有商品信息
SELECT * FROM product WHERE price > 600;
# 查询商品价格小于2000的所有商品信息
SELECT * FROM product WHERE price < 2000;
# 查询商品价格小于等于1000的所有商品的名称
SELECT pname FROM product WHERE price <= 1000;
# 查询 商品价格大于等于800的多有商品的名称和价格
SELECT pname, price FROM product WHERE price >= 800;
# 查询商品价格不等于800的所有商品的信息
SELECT * FROM product WHERE price != 800;
SELECT * FROM product WHERE price <> 800;
\