您的位置:首页 > 数据库 > MySQL

MySQL 基础学习一 数据库以及单表的基本操作

2018-03-12 20:02 1126 查看

数据库操作

创建数据库

create database 数据库名称 character set 字符集名称 collate 校对名称;

示例:

创建数据库

create database db1;

设定字符集

create database db2 character set gbk;

校对, 一般用于排序, 每一种校对规则的排序方式不同

create database db3 character set utf8 collate utf8_bin;

要查看字符集的校对可以使用

show collation lilke ‘utf8%’;

显示数据库信息

显示数据库服务器中所有数据库

show databases;

如果要搜索指定信息的数据库

show databases like “pattern”;(pattern 格式后面会介绍)

显示目标数据库的定义信息

show create database 数据库名称;

显示当前正在操作的数据库;

select database();

修改和删除数据库

修改数据库字符集/校对

alter database 数据库名称 character set 字符集名称 collate 校对名称;

示例: alter database db1 character set utf8 collate utf8_bin;

删除数据库

drop database 数据库名称;

表操作

进行表操作之前, 需要了解MySQL中的一些定义有关的知识:

SQL数据类型

JavaMySQL
byte, short, int, longtinyint, smallint, int, bigint
floatfloat
doubledouble
booleanbit
char, stringchar, varchar
datedate, time, datetime, timestamp
fileblob, text
1) 其中 char类型为固定长度字符串, 若赋值不足定义长度, 则用空白符不全, 若赋值超出长度则会报错

2) 其中 varchar类型为可变长度字符串, 若赋值不足定义长度, 则缩小定义长度至赋值长度, 若赋值超出长度则会报错

3) date 类型代表日期, time 类型代表时间, datetime 顾名思义, timestamp(时间戳) 则和 datetime 一样可以代表日期和时间, 但是 datetime 它的默认值为 null, 而 timestamp 的默认值为当前的系统时间;

4) blob, 二进制文件, 用于存入一些非文本内容, text 则用来存入文本内容, 通常情况下, 这两个类型很少使用, 都是用数据流来完成上传和下载.

约束

单表约束:

主键约束:

primary key 可以通过该字段来确定到这个表, 默认唯一且非空, 主键约束通常情况下一个表只有一个, 但是也有多个的情况

唯一约束

unique 字段或列中所存入的值是不可重复的

非空约束

not null 顾名思义, 不能为空

创建表及表内定义的操作

create table 表名 ( 字段名1 字段类型 约束, 字段名2 字段类型 约束, …);

create table user (
id int primary key auto_increment,
username varchar(20) unique,
password varchar(20) not null,
age int,
birthday date
);


显示当前数据库的所有表

shoow tables;

显示目标表内的定义信息

desc 表名;

增加一列

alter table 表名 add 列名 类型(长度) 约束

alter table user add gender varchar(10);

修改目标列的定义信息

alter table 表名 modify 列名 类型(长度) 约束

alter table user modify gender varchar(20) not null;

删除一列

alter table 表明 drop 列名

alter table user drop gender;

改列名称

alter table 表名 change 旧列名 新列名 类型(长度) 约束

alter table user change gender sex varchar(20) not null;

修改表名

rename table 表名 to 新表名

rename table user to users

修改表字符集

alter table 表名 character set 字符集

alter table user character set gbk

更改列定义的注意事项:

如果表内已经存入了数据, 并且有数据不满足新更改的约束的话, 操作会失败提示报错

对表内记录的操作

插入内容

插入部分列

insert into 表名 (列名1, 列名2, …) values (值1, 值2, …);

insert into user (id, username, password) values (null, ‘admin’, ‘admin’);

插入所有列

insert into 表名 values (值1, 值2, …);

insert into user values (null, ‘xiaobao’, ‘123’, 15, ‘1993-09-01’);

值的顺序以及类型要对应一致, 长度不能超过定义值, 字符或字符串和日期类型要加上单引号或者双引号

auto_increment 的属性可以直接给null, 系统会从1开始递增序列

修改内容

update 表名 set 字段1 = 新值1, 字段2 = 新值2 … 查询语句

修改一整列的值

update user set password = “abc”;

修改某一项的某列

update user set password = “abc” where username = “xiaobao”;

修改某一项的多列

update user set password = “abc”, age = 34 where username = “xiaobao”;

删除内容

delete from 表 查询语句

删除某一条记录

delete from user where id = 1;

删除所有记录

delete from user;

属于DML语句. 一条一条记录的删除, 事务可以作用于DML语句

truncate table user;

属于DDL语句, 删除整个表, 再创建一个结构一样的表, 事务不能作用与DDL语句

这部分内容这次不做介绍

查询

换了大标题, 这部分内容应该说是核心内容了, 利用下面这个表来做介绍

create table exam(
id int primary key auto_increment,
name varchar(20),
english int,
chinese int,
math    int
);

insert into exam values (null,'张三',85,74,91);
insert into exam values (null,'李四',95,90,83);
insert into exam values (null,'王五',85,84,59);
insert into exam values (null,'赵六',75,79,76);
insert into exam values (null,'田七',69,63,98);
insert into exam values (null,'李老八',89,90,83);


基本查询

select [distinct] * 列名 from 表 where a = b;

distinct: 去掉重复值

select distinct english from exam;

english成绩重复的不做显示

select name, english + chinese + math from exam;

别名查询 修改了显示的别名

select name, english + chinese + math as sum from exam;

条件查询 利用where

<, >, >=, <=, <>, =

like 模糊查询

in 范围查询

条件关联 and, or, not

查找叫李四的

select * from exam where name = “李四”;

查找叫李四且英语成绩大于90的

select * from exam where name = “李四” and english > 90;

查找姓李的

seleft * from exam where name like “李%”;

%和_

like子句中 _可代表1个字符, %可以代表多个字符;

如”%李”表示以李结尾, 而”_李”在此之上还限制了字数只有2个;

in 和 between

查找英语成绩为65, 79 或 83的

select * from exam where english in (65, 79, 83);

查找数学成绩再80和90之间的, 包括80 和 90

select * from exam where math between 80 and 90;

排序查询 order by, asc升序, desc降序

默认升序

按语文成绩升序显示

select * from exam order by chinese asc;

等同于

select * from exam order by chinese;

设置倒序

select * from exam order by chinese desc;

多个条件,即在语文成绩相同条件下, 按英语成绩升序来排列

select * from exam order by chinese desc, english asc;

试着写了一个前面知识点的整合

将姓李的人按英语成绩倒序排列

select * from exam where name like “李%” order by english desc;

按照三科总成绩升序排列

select, chinese + english + math as sum from exam order by sum;

分组统计查询

聚合函数, 对列操作

函数意义
sum()求和
count()计数
max()列中最大值
min()列中最小值
avg()平均数
查找所有人英语成绩之和

select sum(english) from exam;

查找英语成绩大于60的人数

select count(*) from exam where english >= 60;

查找英语成绩之和 和 所有科目综合之和

select sum(english), sum(math) from exam;

select sum(english+math+chinese) as allsum from exam;

查找总人数

select count(*) from exam;

注意事项:

上面的例子中, 求和的两种方法其实是不同的

select sum(english)+sum(math)+sum(chinese) from exam;

这样做, 若有成绩为null, 则会丢失一行, null与其他值相加为null;

select sum(english+math+chinese) from exam;

改进方法:

若有null则置0

select sum(ifnull(english,0)+math+chinese) from exam;

select *, max(math) as 最大值 from exam;

select min(chinese) from exam;

分页函数 limit

limit [offset,] rows 从M开始, 读N条, M默认是0

select * from 表名 limit, m, n

select * from 表名 limit, n

显示前五条数据

select * from exam limit 5;

显示第五条数据

select * from exam limit 5, 1;

分组查询

group by 字段名称;

统计每类商品的个数

select product, count(*) from orderitem group by product;

统计每类商品的总金额

select product, sum(price) from orderitem group by product;

where子句后面是不能跟着聚合函数的, 若要设置条件, 则要用到关键字 having

select product, sum(price) from orderitem group by product having sum(price) > 5000;

select product, sum(price) as sum from orderitem group by product having sum > 5000;

select product, sum(price) as sum from orderitem group by product having sum > 5000 order by sum;

总结查询的语句顺序

顺序 S F W G H O

select from where group by having order by

9d6b
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  MySQL