环境准备
mysql安装,注意将安装目录和数据目录放在一起。
-- 配置环境变量: 安装目录/bin
--检查是否安装成功
连接
mysql [-h 连接的主机ip -P端口3306] -u 用户名 -p 密码
如果连接的是本机:可以省略 -h -P 主机IP和端口。
Navicat 快捷键
注释:Ctrl+/
运行选中的:Ctrl+shift+r
SQL分类
DDL (数据定义语言) Data Defination Language
--create drop alter truncate(清空数据表记录)
DCL (数据控制语言) Data Control Langugae
--grant revoke begin transation等
DML (数据操作语言) Data Manipulation Language
--update insert delete 不包含查询
DQL (数据查询语言) Data Query Language
--select
查看所有数据库
show databases;
--information_schema数据库
虚拟数据库,保存着关于MySQL服务器所维护的所有其他数据库的信息。
如数据库名,数据库的表,表栏的数据类型与访问权限等。
--mysql数据库
mysql库是系统库,里面保存有账户信息,权限信息,存储过程,event,时区等信息。
--performance_schema数据库
存储引擎,主要用于收集数据库服务器性能参数。
--test数据库
测试数据库,没有任何表
查看数据库编码集
--show create database*库名
查看数据库的创建方式:查看数据库的编码表;
创建数据库
--create database 数据库名 character set 编码表名;
创建数据库使用指定编码表
--create database 数据库名;
未指定编码表,使用安装数据库时默认的编码表
编码表
java UTF-8; GBK; GB2312; ISO-8859-1
mysql utf8; gbk; gb2312; latin1;
删除数据库
drop database 数据库名;
修改数据库编码集
alter database 数据库名称 chracter set 字符集
切换数据库
use 数据库名;
查看当前数据库
select database();
建表相关
语法:
create tabele 表名(
列名 类型(长度),
列名 类型(长度),
........ ........ .......
列名 类型(长度)
);
--建表一定要切换到一个具体的数据库, use 数据库名
--一个数据表可以存多个字段,每个字段有类型和长度
--列之间逗号隔开,最后一个列不行要逗号
数据类型:
-字符类型
varchar : 列的长度可变
char : 列的长度固定,不可变
-数值型
整形:THINYINT SMALLINT INT BIGINT
小数:FLOAT(单精度) DOUBLE(双精度)
-位数据类型(逻辑性)
BIT : 1或0组成的数据
1 表示true
0 表示false
-日期型
DATE 只有日期 2017年06月07号
Time 时分秒 16时17分28秒
DateTime 日期和时间都包含 年月日时分秒
TIMESTAMP 日期和时间都包含,自动更新为表数据被修改的时间
单表创建时的约束
*主键约束 primary key 非空 唯一
定义格式: 列名 列的类型 primary key
补充:自增长 auto_increment (主键是int类型,才可以添加自增长)
ex: id int primary key auto_increment
*唯一约束 unique
该字段的值不允许重复,可以为空(空不算重复)
一张表中可以有很多个唯一约束
格式 列名 类型(长度)unique
ex: name varchar(20) unique
*非空约束 not null
格式 列名 类型(长度)not null
ex: age int not null
查看表
show tables; 查看该数据库所有表
查看具体某张表的机构
desc 表名;
修改表结构(对列的增删改)
alter table 表名 增/删/改 列名 类型(长度)约束;
--可以对表名、表中的列名、列的类型进行增删改。
alter table 表名 add 列名 类型(长度)约束;
--增加列
alter table 表名 modify 列名 类型(长度)约束;
--修改现有列类型、长度和约束
alter table 表名 change 旧列名 新列名 类型(长度)约束;
--修改现有列名称
alter table 表名 drop 列名;
--删除现有列
alter table 表名 character set 编码集;
--修改表的编码集
改表名
rename table 旧表名 to 新表名;
--修改表名
表删除
drop table 表名;
--drop table emp;
insert语句–向表中插入数据
insert into 表名(列1,列2,列3...) values (值1,值2,值3...);
--写全
值与列一一对应,如果某一列没值,可以使用null。
使用单引号表示字符串
date型数据也用单引号括起来
如果主键自增长,可以直接插入null
insert into 表名(列,列,列...) values (值,值,值...);
--省略部分列
某些列可以为null,或者自增长的列,或者有默认值,可省略
insert into 表名 values (值,值,值,值);
--省略所有的列
如果给表中所有列插入数据,这时可以省略表名后面的列名,直接写values
1)如果主键:是自增长。不需要人工赋值(可以给值null)。数据库会按照自己的算法,为主键填充值。
2)通常遇到主键自增长,人工赋值的时候,赋值null。mysql会自己把null替换成新的值。
数据的插入:
两种方式 -- 根据列名插入对应的值
直接插入所有的列 - 将列名省略掉
update语句(修改数据)
update 表名 set 列名=值,列名=值...[where 条件语句]
---如果不加条件语句,将会修改某一列的所有值
update person set username='zhaoliu',password='zhaoliu'where id =5;
delete 语句(删除表数据)
delete from 表名 【where 条件语句】
---不添加where条件,会删除表中所有数据。表依然存在,是空表
---delete是删除行数据
---删除后,再添加数据是接着之前的编号增长的
---数据可恢复。怎么恢复???
truncate语句(删除数据)
truncate table 表名;
--先删除表中所有内容,再创建表。
--只能删除一张表的数据,不能有条件删除。不能恢复数据。
truncate函数和round函数
SELECT ROUND(3.45,1),ROUND(3.45,0),ROUND(123.45,-1),ROUND(167.8,-2);
--3.5 --3 --120 --200
SELECT TRUNCATE(2.34,1),TRUNCATE(4.56,1),TRUNCATE(4.56,0),TRUNCATE(56.78,-1);
--2.3 --4.5 --4 --200
drop语句
drop table person;
---把person表从数据库中删除。表已经不存在了,不能向里面添加数据
查询
select * from 表名;
--查询表中所有信息
---select * from student;
select 列名,列名... from 表名;
--显示指定列数据。
---select name,score from student;
select 列名,列名... from 表名 where 条件;
--查找符合where条件的数据
---select * from student where age >= 24;
select distinct 列名 from 表名 [where 条件]
--去重复 distinct
select * from 表名 order by 列名1 asc|desc , 列名2 asc|desc ...
--order by 排序 。 默认是asc升序。
select 列名 as 别名,列名 as 别名...from 表名 where 条件;
--别名
--注意:再使用别名的时候,as关键字可以省略
运算符
>(大于) <(小于) >=(大于等于) <=(小于等于)
=(等于) <>或者!=(不等于)
and 逻辑与
or 逻辑或
not 逻辑非
between 开始值 and 结束值
in(值1,值2,值3)在指定的值中任意取
模糊查询:like'模糊查询部分'
占位符:
% 表示零个或任意多个字符
_ 表示任意单个字符
注意:含有某个值 %xx%
is null 判断该值是否为空
is not null :不是空
聚合函数
定义:多个数据进行运算,运算出一个结果
count函数 (统计行数)
--select count(*) from 表名;
统计表中的行数
--select count(列名) from 表名;
按具体列统计行数,不统计null值所在行
sum函数(求和)
--select sum(列名),sum(列名),... from 表名;
使用sum进行多列求和的时候, null + 任何值=null
解决?
ifnull(列名,默认值)
---select sum(ifnull(age,0)+IFNULL(score,0)) from student;
怎么控制小数点?truncate(列名,截取的小数位)
---select truncate(sum(ifnull(age,0)+IFNULL(score,0)),2) from student;
avg函数(求平均值)
--select avg(列名) from 表名;
求某列的平均值,avg里面的null不作为统计
---select sum(age)/count(age) from student;
---select avg(age) from student; 和上面结果一夜
max,min函数(统计该列最大最小值)
--select max(列名),min(列名) from 表名;(null除外)
---select max(score),min(score) from student;
grop by 分组
--select ... from ... group by 列名,列名;
---select id,product,sum(price) from orders group by product,price;
先分组,再计算
通常select 后面的内容是被分组的列,或者聚合函数
having和where的区别
-Where跟的条件 having都可以,having单独使用的时候的条件在查询中的字段必须包含!!!
-having 后面可以跟聚合函数,where后面不能跟聚合函数
聚合函数(sum,avg,max,min,count)
-where是在分组前进行过滤。
-having是在分组后进行过滤。
---select id,product,sum(price) from orders where id>3 group by product having sum(price)>30;
---先执行where id>3 --> group by product --> having后面的sum(price)>30- -->select 后面的内容 --->order by 排序
排序
select ...要显示的内容
from ... 表名
where ...关联条件
group by ...分组的列
having ... 分组后的条件
order by (asc desc) ... 排序;