1、sql通用数据类型
整型:
tinyint (-128---127)
smallint(-65536-----65535)
==int(-21亿----21亿)==
bigint(-2等64次方 ----- 2的64次方-1)
浮点型:
float 单精度浮点型
double 双精度浮点型
==decimal 精确控制数字及小数位数量 decimal(10, 2)一共有10个数位,2个小数位,如果源数据多余该小数位数,会自动四舍五入==
日期类型:
date:日期类型 YYYY-MM-DD
==datetime:日期时间类型 YYYY-MM-DD hh:mm:ss==
文本类型:
char:定长字符:char(10)占用10个字符的空间
如果char(10)保存了两个字符的数据,那么空余字符用空格补齐。占用空间大小不变
char的检索速度和查询效率远高于varchar
==varchar:变长字符varchar(10)最多占用10个字符的空间==
如果varchar(10)保存了两个字符的数据,那么就占用两个字符的空间大小
2、数据库的创建
创建数据库
create database 数据库名称
create database if not exists 数据库名称
在创建数据库时可以指定字符集,一般指定字符集可以防止中文乱码。
# 创建数据库
CREATEDATABASE BigData_DB;
# 如果当前数据库不存在则创建,如果存在,则什么也不做
CREATEDATABASE IFNOTEXISTS BigData_DB;
# ctrl + d 可以进行整行复制
# 在linux中mysql 的数据库名称严格区分大小写,一般情况下定义数据库名称我们使用小写
CREATEDATABASE IFNOTEXISTS bigdata_db;
# 在定义数据库时可以指定字符集
# 指定字符集的作用
# gbk 国标编码 (不支持Ascii)
# Unicode编码 (前128位是ASCII,后边是扩展编码)
# 一般我们使用utf-8编码格式,兼容性好,空间占用率小
# 既包含了中文编码,又包含了ASCII码表
# 如果不设置utf8字符集,在插入中文信息时会报错,在读取中文信息时会乱码
CREATEDATABASE IFNOTEXISTS bigdata_db1 CHARACTERSETutf8;
3、数据库的展示、删除和使用
数据库展示:show databases;
数据库删除:drop database 要删除的数据库名称;
数据库使用:use 要使用的数据库名称;
查询当前正在使用的数据库:select database();
# 数据库的展示
SHOW DATABASES;
# 删除数据库
# 如果删除的数据库已经不存在,则会报错
# [HY000][1008] Can't drop database 'BigData_DB'; database doesn't exist
DROPDATABASE BigData_DB;
# 使用数据库
USE bigdata_db;
# 查询当前使用的数据库
SELECTdatabase();
4、数据表的创建,删除 和查看
数据表的创建
create table 表名(字段名 类型 约束, 字段名2 类型 约束 。。。。。。);
在创建表时,最少有一个字段,不然无法创建
删除数据表
drop table 表名;
查看表
show tables; 查看当前数据库中所有表的名称列表。
desc 表名;查看指定表的表结构。
# 要创建数据表之前一定要使用一个数据库(USE)
USE bigdata_db;
# 创建数据表
/*
格式:
create table 表名(
字段名1 类型 (约束),
字段名2 类型 (约束),
......
);
*/
CREATETABLEcategory1 # 创建表,并定义表名
(
cidINTPRIMARY KEY, # 插入的字段,和类型,以及约束
cnameVARCHAR(100) # 约束为可选,可以在定义字段时不添加约束
);
# 查看当前数据库中所有的表的名称列表(在这之前一定要use数据库)
SHOW TABLES;
# 查询指定的表的结构
DESCcategory;
# 删除表
# [42S02][1051]Unknowntable'bigdata_db.category1'
# 如果删除不存在的表,将会报错
DROPTABLEcategory1;
5、字段的相关操作
字段的增加:
alter table 表名 add 新字段名 数据类型 (约束);
字段的修改:
alter table 表名 change 旧字段名 新字段名 数据类型 (约束);
字段的删除:
alter table 表名 drop 字段名称;
表名的修改:
rename table 旧表名 to 新表名;
# use数据库
USE bigdata_db;
# 对数据表的结构进行查询
DESCcategory;
# 增加一个字段,字段名称为desc 字段类型为varchar(100),没有约束
#desc是用来查询表结构的关键字,且关键字不区分大小写,所以会报错
# 要么改名,要么使用esc下边的点,将其包裹起来则可以正常使用,指明其为字段名称,并不是关键字
ALTERTABLEcategory ADD `desc`VARCHAR(100);
# 如果字段名称不与关键字重名,则不需要使用``进行包裹
ALTERTABLEcategory ADD numINT;
# 修改字段
# 使用change可以对字段的名称和类型以及约束同时进行修改
ALTERTABLEcategory CHANGE `desc` descriptionVARCHAR(255);
# 使用change将num字段的数据类型改为varchar类型
# 如果需要修改其类型或者约束,不修改名称,名称也需要再书写一遍
# 如果修改的字段不存在,则报错[42S22][1054]Unknowncolumn'num'in'category'
ALTERTABLEcategory CHANGE num numVARCHAR(100);
# 删除字段
# 如果删除的字段不存在则报错
# [42000][1091] Can't DROP 'num'; check that column/key exists
ALTER TABLE category DROP num;
# 修改表名
RENAME TABLE category TO category2;
# 查看所有的表
SHOW TABLES;
# 修改为category之后原表消失
DESC category2;
# [42S02][1146] Table 'bigdata_db.category' doesn't exist
DESCcategory;
# 将category2 修改为 category
RENAMETABLEcategory2 TO category;
6、插入记录
插入记录(方式1):insert into 表名(字段名1, 字段名2) values(值1, 值2),(值1, 值2)。。。。。。
插入记录(方式2):insert into 表名 values (值1,值2,值3....),(值1,值2,值3....),(值1,值2,值3....)。。。。。。。
如果使用不指定字段的形式,必须将所有字段都进行赋值,否则会报错
如果使用指定字段的形式,则必须讲指定的字段都进行赋值,否则会报错
# 使用数据库
USE bigdata_db;
# 查看category表中的结构
DESCcategory;
# 插入数据
# 指定字段后只对被指定的字段赋值,其余字段自动置为null(null代表空值)
# 在sql中字符型数据(文本型数据)必须使用''(引号)包裹起来,才能储存,(了解:日期数据,也要使用''包裹起来)
INSERTINTO
category(cid, cname)
VALUES
(1,'电器');
# 插入数据时不指定字段
# 如果传入数据的数量和字段数不相等则会报错
# Columncountdoesn't match value count at row 1
# INSERT INTO category VALUES (2, '水果');
INSERT INTO
category
VALUES
(2, '水果', '真的很甜');
# 一次性插入多条数据
INSERT INTO
category(cid, cname)
VALUES
(3, '图书'),
(4, '服装');
# 使用完全插入的方式插入多条数据
INSERT INTO
category
VALUES
(5, '房产', '又升值了'),
(6, '生活', '生活真好呀'),
(7, '数码类', '买个照相机,就是cgx');
7、记录的更新
update更新数据:update 表名 set 字段名 = 值 (where 条件)
如果使用where就可以控制要修改的行
如果不适用where则对所有的行进行修改
被修改后,数据类型不能发生改变
不能超过原有数据的最大长度
除了数值型数据之外(整型,浮点型)省下的数据都需要使用引号包裹起来
# 更新记录信息update
# 需求,将cid=5的房产信息中descripton中的'又升值了', 改为,'房价已经腰斩了'
# 使用update进行更新,set后边控制要更新的列,where控制要更新的行
UPDATEcategorySETdescription ='房价已经腰斩了'WHEREcid =5;
# 如果不指定where 就要对整列数据进行修改.
UPDATEcategorySETdescription='好开心呀,又下课了,可以给男朋友打电话';
# 修改后的数据类型,一定要和修改前一致
#varchar类型中,可以存储数值型数据,但是不能超长,否则会出现问题
#UPDATEcategorySETcname =2135678901WHEREcid =2;
#int类型的字段内不能存放字符型(文本型)数据
# Incorrectintegervalue:'c001'for column'cid'at row1
UPDATEcategorySETcid ='c001'WHEREcname ='服装';
8、删除记录
delete 删除记录:delete from 表名 where 条件筛选;
如果使用where没有筛选到任何数据信息,删除操作不会报错,但是什么都不会执行
如果where筛选出对应的数据,则将 数据删除
# 删除记录
# 如果经过条件筛选,未找到满足条件的数据,则不进行任何删除动作,同时也不报错
DELETEFROMcategoryWHEREcid =10;
# 如果删除的记录存在则将其删除
DELETEFROMcategoryWHEREcid =7;
# 如果在删除表的时候,不添加where进行条件筛选,则将删除所有的数据
DELETEFROMcategory;
# 使用truncate清空表,也可以将数据全部清空,但是不能使用条件过滤
TRUNCATETABLEcategory;
9、主键约束
主键的添加:
在创建时添加
createtable表名(
字段名 字段类型 primary key,
字段名 字段类型。。。。。
);
在创建表之后,再添加
altertable表名 add primary key(主键字段);
主键的删除
altertable表名dropprimary key;
注意事项:
主键时非空的:不能为空
主键是唯一的:不能重复
主键被删除之后,该字段依然是非空的,不能传入null或者不赋值
# 查询当前使用的数据库
SELECTdatabase();
# 查询category表中的主键约束
DESCcategory;
# 创建一个persons表,并设定id为主键
CREATETABLEpersons(
idINTPRIMARY KEY ,
last_nameVARCHAR(20),
first_nameVARCHAR(20),
addressVARCHAR(20),
cityVARCHAR(20)
);
# 查询persons表的结构
DESCpersons;
# 主键非空
# 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');
10、自动增长
auto_increment:自动增长
只能对整型自动增长
只能修饰键(一般修饰主键)
# 创建一个新表persons2
CREATETABLEperson2(
idINTPRIMARY KEY AUTO_INCREMENT,
last_nameVARCHAR(20),
first_nameVARCHAR(20),
addressVARCHAR(20),
cityVARCHAR(20)
);
# 查看表结构
DESCperson2;
# 怎样验证自动增长呢?
# 不给id传值,且表中无其他数据,则id自动增长为从1开始自增的整数序列
INSERTINTOperson2(last_name, first_name)VALUES('san','zhang'), ('si','li');
# 如果给id传值,则表中将记录传入的id值,不进行自增操作
INSERTINTOperson2(id, last_name, first_name)VALUES(6,'san','zhang');
# 给id 传值为null也可以进行自增操作
# 主键自增时,是按照当前id值的最大值+1进行计算
INSERTINTOperson2(id, last_name, first_name)VALUES(NULL,'xiaolong','li');
INSERTINTOperson2(id, last_name, first_name)VALUES(NULL,'qingxia','lin');
# 创建一个新表persons3,查看是否可以不修饰键
# 结论:如果修饰的字段不是键,则会报如下错误
# Incorrecttabledefinition; there can be only one auto columnandit must be definedasa key
#CREATETABLEperson3(
# idINTAUTO_INCREMENT,
# last_nameVARCHAR(20),
# first_nameVARCHAR(20),
# addressVARCHAR(20),
# cityVARCHAR(20)
# );
# 修饰的内容可否不为整型
# 如果修饰的内容不是整型,则报如下错误
# Incorrect column specifier(指示语) for column'id'
#CREATETABLEperson3(
# idVARCHAR(20) PRIMARY KEY AUTO_INCREMENT,
# last_nameVARCHAR(20),
# first_nameVARCHAR(20),
# addressVARCHAR(20),
# cityVARCHAR(20)
# );
11、非空约束
not null:非空约束修饰的字段,不接受null值,在数据处理时不用对null值进行判断
在定义时,可以在约束位置直接添加非空约束。
在一个表中可以有多个非空约束。
# 创建persons3
CREATETABLEpersons3(
idINTPRIMARY KEY AUTO_INCREMENTNOTNULL,
last_nameVARCHAR(20)NOTNULL,
first_nameVARCHAR(20),
addressVARCHAR(20),
cityVARCHAR(20)
);
# 查看表结构
# 通过表的查询,我们得知id 和 last_name是 非空约束
DESCpersons3;
# 查看非空约束能否不传值
# 如果没有传值,且没有默认值,则会报如下错误.
# 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是关键字
# 关键字:系统定义的具有特殊功能或者含义的字符组合
# 定义的字段名 叫做标识符
# 标识符:程序员自己定义的,具有特殊功能或含义的字符组合
12、唯一约束
unique : 保证数据的唯一性,如果被唯一约束修饰,则不能出现重复值。
主键自动拥有唯一约束,如果主键被删除,则唯一约束消失。
# 创建一个新的表persons4
CREATETABLEpersons4(
idINTPRIMARY KEY AUTO_INCREMENT,
last_nameVARCHAR(20) UNIQUE ,
first_nameVARCHAR(20) UNIQUE ,
addressVARCHAR(20),
cityVARCHAR(20)
);
# 查询表结构
DESCpersons4;
# 通过查询表结构,我们得知,last_name不能重复, first_name也不能重复, id为主键,同样不能重复.
# 插入数据,查看是否可以重复
INSERTINTOpersons4(id, last_name,first_name)VALUES(1,'san','zhang');
# last_name 字段不能重复,因为有唯一约束
# Duplicate entry'san'for key'last_name'
INSERTINTOpersons4(id,last_name,first_name)VALUES(2,'san','li');
# 唯一约束,不能存重复值,但是可以存空值
INSERTINTOpersons4(id,last_name,first_name)VALUES(NULL,'si',NULL);
# 唯一约束,只约束字段设定的数据类型不能重复,如果为空值,不进行校对
INSERTINTOpersons4(id,last_name,first_name)VALUES(NULL,'wu',NULL);
# 空格可以存入数据库
INSERTINTOpersons4(id,last_name,first_name)VALUES(NULL,null,' ');
# 但是空格是varchar类型数据,也参与非空校验.
# Duplicate entry' 'for key'first_name'
#INSERTINTOpersons4(id,last_name,first_name)VALUES(NULL,null,' ');
13、简单查询
格式:select 字段名 from 表名
字段名可以指定一个,也可以指定多个,使用*代表查询所有字段
表名必须存在
select后边可以对指定字段进行数学运算
# 准备商品表
CREATETABLEproduct
(
pidINTPRIMARY KEY,
pnameVARCHAR(20),
priceDOUBLE,
category_idVARCHAR(32)
);
# 查询product表结构
DESCproduct;
# 插入数据
INSERTINTOproduct(pid,pname,price,category_id)VALUES(1,'联想',5000,'c001');
INSERTINTOproduct(pid,pname,price,category_id)VALUES(2,'海尔',3000,'c001');
INSERTINTOproduct(pid,pname,price,category_id)VALUES(3,'雷神',5000,'c001');
INSERTINTOproduct(pid,pname,price,category_id)VALUES(4,'杰克琼斯',800,'c002');
INSERTINTOproduct(pid,pname,price,category_id)VALUES(5,'真维斯',200,'c002');
INSERTINTOproduct(pid,pname,price,category_id)VALUES(6,'花花公子',440,'c002');
INSERTINTOproduct(pid,pname,price,category_id)VALUES(7,'劲霸',2000,'c002');
INSERTINTOproduct(pid,pname,price,category_id)VALUES(8,'香奈儿',800,'c003');
INSERTINTOproduct(pid,pname,price,category_id)VALUES(9,'相宜本草',200,'c003');
INSERTINTOproduct(pid,pname,price,category_id)VALUES(10,'面霸',5,'c003');
INSERTINTOproduct(pid,pname,price,category_id)VALUES(11,'好想你枣',56,'c004');
INSERTINTOproduct(pid,pname,price,category_id)VALUES(12,'香飘飘奶茶',1,'c005');
INSERTINTOproduct(pid,pname,price,category_id)VALUES(13,'海澜之家',1,'c002');
# 简单查询,不包含条件
# 将所有商品进行查询,查询后展示所有商品信息
#select要查询的字段名from表名 代表要从某个表中查询某个字段.
# 使用*可以查询到当前表中的所有字段
SELECT*FROMproduct;
# 查询所有商品的指定字段(商品名,商品价格)
SELECTpname, priceFROMproduct;
# 将商品名称及商品价格互换位置,则输出的数据列位置同样进行更改
SELECTprice, pnameFROMproduct;
# 查询所有商品价格的同时对所有的商品价格+10后进行输出
# 在select后边可以进行数学运算
SELECTpname, price +10FROMproduct;
14、比较查询
< > <= >= = != <>
# 条件查询
# 比较查询 > < >= <= = <> !=
# 需求:查询商品价格大于600的所有商品信息
SELECT*FROMproductWHEREprice >600;
# 查询商品价格小于2000的所有商品信息
SELECT*FROMproductWHEREprice <2000;
# 查询商品价格小于等于1000的所有商品的名称
SELECTpnameFROMproductWHEREprice <=1000;
# 查询 商品价格大于等于800的多有商品的名称和价格
SELECTpname, priceFROMproductWHEREprice >=800;
# 查询商品价格不等于800的所有商品的信息
SELECT*FROMproductWHEREprice !=800;
SELECT*FROMproductWHEREprice <>800;