1.数据库的操作
1.1 显示当前数据库
show databses;
1.2 创建数据库
create database [if not exist] db_name;
创建名为db_test1的数据库
sql
create database db_test1;
说明:当我们创建数据库没有指定字符集和校验规则时,系统使用默认字符集;utf8,校验规则是
utf8_general_ci
1.3数据库的字符集和校验规则
例:在用create table命令来创建db_test1,并用ENGINE指定数据库的存储引擎MyISAM,用CHARACTER SET指定字符集是utf8,COLLATE指定校验规则为utf8_bi
create table 表名 (
字段1 类型1,
字段2 类型2,
........
)ENGINE=MyISAM default character set = utf8 collate = utf8_bi;
•CHARACTER SET:指定数据库采用的字符集
•ENGINE:指定数据库的存储引擎
•COLLATE:指定数据库字符集的校验规则
如果系统没有db_test的数据库,则创建一个使用utf8mb4字符集的db_test数据库,如果有则不创建
create database if not exists db_test character set utf8mb4;
1.4 使用数据库
use 数据库名;
1.5 删除数据库
drop database [if exists] db_name;
说明:
•数据库删除以后,内部看不到对应的数据库,里面的表和数据全部删除
drop database if exists db_test1;
drop database if exists db_test2;
2.常用数据类型
2.1数据类型
分为整型和浮点型:
|--------------|------------|----------------------------|-------------------------|
| 数据类型 | 大小 | 说明 | 对应java类型 |
| BIT[(M)] | M指定位数,默认为1 | 二进制数,M范围从1到64, 存储数字范围从0到24 | 常用bollean,默认值为1 ,只能存0和1 |
| TINYINT | 1字节 | | byte |
| SMALLINT | 2字节 | | short |
| int | 4字节 | | integer |
| BIGINT | 8字节 | | Long |
| FLOAT(M,D) | 4字节 | 单精度,M指定长度,D指定小数位数,会发生精度丢失 | Float |
| Double(M,D) | 8字节 | | Double |
| DECIMAL(M,D) | M/D最大值+2 | 双精度,M指定长度,D表示小数点位数,精度数值 | BigDecimal |
| NUMERIC(M,D) | M/D最大值+2 | 和decimal一样 | BigDecimal |
2.2 字符串类型
|---------------|------------------|-------------|----------|
| 数据类型 | 大小 | 说明 | 对应java类型 |
| VARCHAR(SIZE) | 0---65,535字节 | 可变长度字符串 | String |
| TEXT | 0---65,535字节 | 长文本数据 | String |
| MEDIUMTEXT | 0---16 777 215字节 | 中等长度文本数据 | String |
| BLOB | 0---65,535字节 | 二进制形式的长文本数据 | byte[] |
2.3 日期类型
date 日期类型
timestamp 时间戳
3.表的操作
需要操作数据库中表时,需要先使用该数据库
use db_test;
3.1 查看表结构
desc 表名;
3.2创建表
create table table_name(
field1 datatype,
field2 datatype,
field3 datatype
);
可以使用comment增加字段说明
示例:
create table stu_test(
id int,
name varchar(20) comment '姓名',
password varchar(50) comment '密码',
age int,
sex varchar(1),
birthday timestamp,
amout decimal(13,20,
resume text
);
3.4删除表
语法格式:
drop table tb1_name;
示例:
•删除stu_test表
drop table stu_test;
•如果存在stu_test 表,则删除stu_test表
drop table if exist stu_test;
例题:
•有一个商店的数据,记录客户及购物情况,有以下三个表组成:
商品goods(商品编号goods_id,商品名goods_name,单价unitprice,商品类别category,供应商provider)
客户customer(客户号customer_id,姓名name,住址address,邮箱email,性别sex,身份证card_id)
购买purchase(购买订单号order_id,客户号customer_id,商品号goods_id,购买数量nums)
SQL:
sql
# 创建数据库
create database if not exists bit111 default character set utf8;
#选择数据库
use bit111;
# 创建数据库表
# 商品
create table if not exists goods
(
goods_id int comment'商品编号',
goods_name varchar(32) comment'商品名称',
unitprice int comment '单价,单位分',
category varchar(12) comment'商品分类',
provider varchar(64) comment '供应商名称'
);
desc goods;
# 客户
create table if not exists customer
(
customer_id int comment'客户编号',
name varchar(20) comment'姓名',
addreass varchar(256) comment'地址',
email varchar(64) comment'电子邮箱',
sex bit comment'性别',
card_id varchar(18) comment'身份证'
);
desc customer;
#购买
create table if not exists purchase
(
order_id int comment'购买订单',
customer_id int comment'客户编号',
goods_id int comment'商品编号',
nums int comment'购买数量'
);
desc purchase;
2. MySQL表的增删改查
2.新增(create)
案例:
sql
#创建一张学生表
drop table if exists student;
create table student(
id int,
sn int comment '学号',
name varchar(20) comment '姓名',
qq_mail varchar(20) comment 'QQ邮箱'
);
2.1单行数据+全列插入
•插入两条记录 ,value_list 数量必须指定和定义表的列的数量及顺序一致
insert into student values(100,1000,'唐三藏',null);
insert into student values (101,10001,'孙悟空','11111');
2.2 多行数据+指定列插入
•插入两条记录,value_list 数量必须和指定列数量及顺序一致
insert into student (id,sn,name) values
( 102,20001,'曹孟德'),
(103,20002,'孙仲谋');
3.查询
sql
# 创建考试成绩表
drop table if exists exam_result;
create table exam_result (
id int,
name varchar(20),
chinese decimal(3,1),
math decimal(3,1),
english decimal(3,1)
);
#插入测试数据
insert into exam_result (id,name,chinese,math,english) values
(1,'唐三藏',67,98,56),
(2,'孙悟空',87.5,78,77),
(3,'猪悟能',88,98.5,90),
(4,'曹孟德',82,84,67),
(5,'刘玄德',55.5,85,45),
(6,'孙权',70,73,78.5),
(7,'宋公明',75,65,30)
);
3.1全列查询
select * from exam_result;
3.2 指定列查询
select id,name,english from exam_result;
3.3 查询字段为表达式
# 表达式不包含字段 select id,name,10 from exam_result; # 表达式包含一个字段 select id,name,english + 10 from exam_result; #表达式包含多个字段 select id,name,chinese + math + english 总分 from exam_result;
3.4 别名
•为查询结果中的列指定别名,表示返回的结果集中,以别名作为该列的名称
select colum [AS] alias_name [......] from table_name;
•结果集中,表头的列名=别名
select id,name,chinese + math + english 总分 from exam_result;
3.5 去重:distinct
使用distinct关键字对某列数据进行去重:
select math from exam_result;
#去重结果 select distinct math from exam_result;
3.6 排序:order by
•ASC 为升序 (从小到大)
•DESC 为降序 (从大到小)
#默认为ASC
SELECT ... FROM table_name [where...]
ORDER BY colum [ASC|DESC],[.....];
1.没有ORDER BY子句的查询,返回的顺序时未定义的,永远不要依赖这个顺序
2.NULL数据排序,视为比任何值都小,升序出现在最上面,降序出现在最下面
#查询同学姓名和 qq_email,按qq_email 排序显示
SELECT name,qq_email FROM student ORDER BY qq_email;
SELECT name, qq_email FROM student ORDER BY qq_email DESC;
3.使用表达式及别名排序
#查询同学及分数,由高到低
SELECT name, chinese + english + math FROM exam_result
ORDER BY chinese + english + math DESC;
SELECT name , chinese + english + math + total FROM exam_result
ORDER BY total DESC;
4.可以对多个字段进行排序,排序优先级随书写顺序
#查询同学各门成绩,依次按 数学降序,英语升序,语文升序的方式显示
SELECT name,math,english,chinese from exam_result ORDER BY math DESC,english,chinese;
3.7 条件查询: where
注意:
1.where条件可以使用表达式,但是不能使用别名
2.AND的优先级高于OR,在同时使用时,需要使用小括号()包裹优先级执行
案例:
•
基本查询:
sql
--查询英语不及格的同学及英语成绩--
select name,english from exam_result where english<60;
--查询语文成绩好于英语成绩的同学--
select name,chinese,english from exam_result where chinese > english;
--查询总分在200分以下的同学--
select name,chinese + math + english 总分 from exam_result
where chinese + math +english < 200;
And 与 OR
sql
--查询语文成绩大于80分,且英语成绩大于80分的同学--
select * from exam_result where chinese >80 and english > 80;
--查询语文成绩大于80分,或英语成绩大于80分的同学--
select * from exam_result chinese > 80 or english > 80;
--观察AND 和 OR 的优先级
select * from exam_result where chinese > 80 or math > 70 and english > 70;
select * from exam_result where (chinese > 80 or math > 70) and english > 70;
范围查询:
1.BETEWEEN....AND..
sql
--查询语文成绩在[80,90]分的同学及语文成绩--
SELECT name,chinese FROM exam_result WHERE chinese BETWEEN 80 AND 90;
--使用 AND 也可以实现--
SELECT name,chinese FROM exam_result WHERE chinese >= 80 AND chinese <= 90;
sql
--查询数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩--
SELECT name,math FROM exam_result WHERE math IN(58,59,98,99);
--使用 OR 也可以实现--
SELECT name,math FROM exam_result WHERE math = 58 OR math=59 OR math = 98 OR math=99;
•模糊匹配:LIKE
sql
--% 匹配任意多个(包括0个)字符
SELECT name FROM exam_result WHERE name LIKE '孙%';
--_匹配严格的一个任意字符
SELECT name FROM exam_result WHERE name LIKE '孙_';
•NULL的查询:IS[NOT] NULL
sql
--查询 qq_mail 已知的同学姓名
SELECT name,qq_mail FROM student WHERE qq_mail IS NOT NULL;
--查询 qq_mail 未知的同学姓名
SELECT name,qq_mail FROM student RE qq_mail IS NULL;
3.8 分页查询:LIMIT
案例:按id进行分页,每页3条记录,分别显示第1,2,3页
sql
--第1页
SELECT id,name,english,chinese from exam_result ODER BY id LIMIT 3 OFFSET 0;
--第2页
SELECT id,name,math,english,chinese FROM exam_result ORDER BY id LIMIT 3 OFFSET 3;
--第3页
SELECT id,name,math,english,chinese FROM exam_result ORDER BY id LIMIT 3 OFFSET 6;
4.修改
sql
--将孙悟空同学的数学成绩变更为80分
UPDTAE exam_result SET math=0 WHERE name='孙悟空';
--将曹孟德同学的数学成绩变更为60分,语文成绩变更为 70 分
UPDATE exam_result SET math=60,chinese = 70 WHERE name ='曹孟德';
--将总成绩倒数前三的3位同学的数学成绩加上30分
UPDATE exam_result SET math = math+30 ORDER BY chinese + math + english LIMIT 3;
--将所有同学的语文成绩更新为原来的2倍
UPDATE exam_result SET chinese = chinese * 2;
5.删除(DELETE)
sql
--删除孙悟空同学的考试成绩
DELECT FROM exam_result where name = '孙悟空';
--删除整张表数据
--准备测试表
DROP TABLE IF EXISTS for_delect;
CREATE table for_delect(
id int,
name varchar(20)
);
--插入测试数据
INSERT INTO for_delete (name) VALUES ('A'),('B'),('C');
--删除数据
DELECT FROM for_delete;