自学内容网 自学内容网

MySQL数据库基础

1.数据库的操作

1.1 显示当前数据库

show databses;

1.2 创建数据库

create database [if not exist] db_name;

创建名为db_test1的数据库

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
TINYINT1字节byte
SMALLINT2字节short
int4字节integer
BIGINT8字节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
TEXT0—65,535字节长文本数据String
MEDIUMTEXT0—16 777 215字节中等长度文本数据String
BLOB0—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:

# 创建数据库
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)

案例:

#创建一张学生表
  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.查询

# 创建考试成绩表

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,在同时使用时,需要使用小括号()包裹优先级执行

案例:

基本查询:

--查询英语不及格的同学及英语成绩--
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

--查询语文成绩大于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..

--查询语文成绩在[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;

2.IN

--查询数学成绩是 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

--% 匹配任意多个(包括0个)字符
SELECT name FROM exam_result WHERE name LIKE '孙%';

--_匹配严格的一个任意字符
SELECT name FROM exam_result WHERE name LIKE '孙_';

•NULL的查询:IS[NOT] NULL

--查询 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页

--第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.修改

--将孙悟空同学的数学成绩变更为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)

--删除孙悟空同学的考试成绩
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;

 


原文地址:https://blog.csdn.net/mengyao2001/article/details/143011343

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!