mysql数据库笔记1
纸上得来终觉浅,绝知此事要躬行。
sql很重要!!
数据库作用就是 以结构化的方式存储我们数据。
从事大数据的工作 基本情况就一直在写sql 而在其他的有关程序员的工作基本上多多少少都会接触sql语句。因为这些都是基础,而且基础的东西跟简单还不一样,基础的东西必须都会,而简单就是随便学学就会了。基础不等于简单嗷
一、数据库类型
① 关系型数据库
存储数据也可以存储数据的关系
Mysql Oracle
mysql被Oracle收购 mysql是免费的,开源的,自从被Oracle收购了 mysql6.0之后开始收费。
中小型企业中的主流数据库
DB2 IBM公司 银行中用的比较多
②非关系型数据库
以后我们会用到现在只是mysql 的话使用不到这些,只是一些基础的命令,到后面我们会在学习这些非关系型数据库
redis
Hbase
二 、登录Mysql
在linux中有登录的三种方式
账号:root
密码:123456
第一种:mysql -u root -p123456
这种方式 不推荐 因为密码会暴露出来
第二种:mysql -u root -p 回车 输入密码:123456
密码是隐藏的
exit 退出登录
第三种:mysql -u root -h 192.168.88.100 -P 3306 -p 回车 输入密码:123456
-h 是ip地址 -P 端口号
在本机中操作 在本机中连接本机的mysql
端口号用的是默认的端口号
如果我们在win中连接linux mysql 肯定不能省略 -h 与 -P
2.1 mysql 的存储数据的结构
以结构化的方式存储的数据
数据的存储肯定是以文件的方式进行存储 存储在硬盘中
2.2 sql结构化查询语句
sql语句 结构化的查询语句
标准的sql:普通话 所有的数据库都支持的
非标准sql:方言 某些数据库特有的
不同的数据库使用的sql 差异性并不大
比如说 oracle与mysql 的sql语法基本是一样的 除了一些特定函数 还有一些语法上小区别
只要我们学会了 mysql 的语法 其他数据库上手很快的
2.3 sql的分类
DDL 数据定义语言 定义数据库 表 修改数据库 修改表结构
DQL 数据查询语言 对表记录查询的语言(重要)
DML 数据操作语言 对表记录 增删改
DCL 数据控制语言 定义数据库的访问权限
2.4 字段名:
见名知其意 多个单词 可以使用下划线连接
常用类型:
分类 | 类型名称 | 说明 |
---|---|---|
整数类型 | int(integer) | 普通大小的整数 |
小数类型 | float | 单精度浮点数 |
double | 双精度浮点数 | |
日期类型 | year | YYYY 1901~2155 |
date | YYYY-MM-DD 1000-01-01~9999-12-3 | |
文本、二进制类型 | char(m) | m为0~255之间的整数定长 char(10) |
text | 允许长度0~65535字节 |
字符串类型
char() 长度不可更改
varchar()规定长度是可以发生变化的
比如说char有5个字节的话 用不完是会空下来 用超了就他也不会加上
但是varchar就是不一样了,是可以变动的,比如说用超了他会给你加上,用少了他会自动缩进,一点都不会浪费
当然,既然是固定的长度 char会比varchar的存储时间要快很多,常常用来存储手机号啊,身份证啊等这些固定长度的东西。
2.5 约束
约束指保证数据的完整行及合理性。
三大约束:主键约束、唯一约束、非空约束
主键约束:非空唯一一个表中只有一个主键,一个主键可以由多个字段组成
唯一约束:可以为空 但是不能重复
非空约束:非空 可以重复但是不能没有 (跟唯一约束刚好相反)
主键约束:primary key 常常配合auto_increment(自增)使用
唯一约束:unique
非空约束:not null
三、操作数据库(增删改查)
3.1查:查询数据库
sql语句 不区分大小写
sql语句要以;结尾 (英文状态下)
show databases; 查询所有的数据库
3.2增:创建数据库
sql语句:create database
库名;
create database 库名 character set 字符集;
create database if not exists 库名; 避免当数据库存在的时候 sql执行报错 没有这个数据库 创建 有这个数据库就不创建
常见的数据库字符集为 UTF—8 GBK iso-8859-1
utf8mb4 完全支持 utf8 但是支持的比utf8多
create database demo;
create database demo1 character set gbk; 设种字符集是gbk
show create database demo1; 查看数据库的字符集(查看数据库的创建过程)
create database if not exists demo1;
demo1数据库虽然存在了 但是在创建的时候没有报错
3.3 删:删除数据库
drop databsase
库名;
3.4 改:修改数据库
修改数据库的编码
alter database 库名 character set 新字符集;
修demo1的字符集修改为 utf8;
alter database demo1 character set utf8;
3.5 切换数据库
use database;
3.6 DDL数据库操作总结
DDL的特点 一般都带有 database 或者 table 这两个单词
DDL的特点 一般都带有 database 或者 table 这两个单词
增:
create database 库名;
create database if not exists;
create database [if not exist] 库名 character set 字符集;
删:
drop database 库名;
改:
alter database 库名 chracter set 字符集;
查:
show databases;
show create database 库名;
select database();
四、1、表的操作
增 创建
注意:每次操作表的时候记得切换数据库,如果数据库不同的话,在每一个数据库的表格都不一样,所以会造成错误,每次查看表中数据的时候都要记得查看一下数据库。
语法:
create table [if not exists] 表名 (
字段名 类型(长度) [约束],
字段名 类型(长度) [约束],
....,
字段名 类型(长度) [约束],
字段名 类型(长度) [约束]
);
eg:
create table student(
id int primary key auto_increment,
name varchar(20) not null,
cardID cahr(18) unique
);
查询表、删除表
查询表非常简单
show tables;
查看当前数据库下所有的表
desc 表名;
查看表结构
show create table 表名;
查看表的字符集(创建过程)
删除用的是drop
drop table 表名;
删除 test表格
drop table test;
修改表
修改非常容易搞混,所以必须多多练习才行
1、增加一个字段 :add
alter table 表名 add 字段 类型(长度) 约束;
alter table student add gender varchar(2) not null ;
2、删除某个字段:drop
alter table 表名 drop 字段;
删除 gender 字段
alter table student drop gender;
3、修改某个字段:change
主要是修改字段的名字 也可以修改某个字段的类型 以及约束
注意: not null无法省略 — — 省略了就直接变成空了
unique和primary key 省略
alter table 表名 change 旧字段名 新字段名 类型(长度) 约束;
-- 将 address 修改为 addr
alter table student change address addr varchar(50) not null;
4、修改约束以及数据类型:modify
alter table 表名 modify 字段 类型(长度) 约束;
需求:
将 address 长度改为55 约束改为not null;
alter table student modify address varchar(55) not null;
modify和change的比较
change 的权限要比modify大。
change:1、可以修改类型,字段属性(类型(长度))
2、可以修改列的名字
modify : 1、 可以修改字符的类型。
2、 无法修改列的名字
alter table 表名 modify ____字段 ________ 类型(长度) 约束;
alter table 表名 change 旧字段名 新字段名 类型(长度) 约束;
2.表记录之DML语句(增删改)
增:添加表记录
在sql中插入数据的时候
除了数字这种类型 其他类型都要加上单引号 纯数字的字符串可以与数字之间自动转换
语法
方式一:给指定的字段插入值
insert into 表名 (字段1,字段2,...) values (值1,值2,...);
注意:前后字段与值要匹配 位置 个数 类型
方式二:给所有的字段插入值
insert into 表名 values (值1,值2,...)
注意:字段与值需要匹配 字段的顺序 个数 类型与表结构中的位置是一致的
方式三:一次性插入多条表记录
insert into 表名 values (值1,值2,...),(值1,值2,...),(值1,值2,...),....
数据准备
create table student(
id int primary key auto_increment,
name varchar(20) not null,
address varchar(50),
cardID char(18) unique
);
分别使用以上三种方式插入数据
-- 插入第一条数据
id null,name
insert into student (id,name) values (null,'欣欣');
通过 select * from 表名;
查询所有的表记录
-- 插入数据
id null,为了让id自动增长
name 权权,
address 江西老表,
cardID 454845484548454845,
insert into student values (null,'小权权','江西老表',454845484548454845);
-- 插入数据
id null,
name '丹丹',
address '河南',
cardID '121212121212121212'
id null,
name '糖糖',
address '河南',
cardID '121212121212121213'
id null,
name '保安哥哥',
address '安徽',
cardID '121212121212121214'
insert into student values (null,'丹丹','河南','121212121212121212'),(null,'糖糖','河南','121212121212121213'),(null,'保安哥哥','安徽','121212121212121214');
删:删除表记录
语法
delete from 表名 [where 条件]
注意:一般删除都会配合 where 使用
如果不添加where 就是全部删除
-- 删除id 为1的数据
delete from 表名 where 字段 运算符 值
运算符:= > < >= <= [!= <>]
delete from student where id=1;
-- 删除 name为 保安哥哥的数据
delete from studnet where name='保安哥哥';
如果你不添加条件的话 会发生什么呢??
delete from student;
如果不添加任何条件 那就是全部删除
这时候 我们再添加一条记录 来看一下数据
insert into student values (null,'欣欣','安徽','121212121212121212');
我们发现 id是6 因为前面的1-5已经用过了
说一个问题 这个表他还是原来的表
还有一种删除方式
truncate table 表名;
-- 将数据全部删除后 再次插入数据 查看情况
truncate table student;
-- 插入一条记录
insert into student values (null,'欣欣','安徽','121212121212121212');
我们发现id是从1开始的
说明表已经不是原来的表了
delete 与 truncate 删除的区别在哪里??
delete
- 是DML语句
- delete可以根据条件进行删除
- delete是逐条删除 表还是原来的表 删除效率低
- delete配合事务使用 数据是可以恢复的
truncate
- 是DDL语句
- 只能删除全部
- 直接将整个表删除掉然后再创建一个一模一样的表 删除效率高
- truncate删除的数据无法恢复
删除总结
delete from 表名 [where 条件]
一般来讲 删除都会添加条件 否则就是全部删除
where 字段 运算符 值
关系运算符: = > < >= <= !=
delete from 表名; 全部删除
truncate table 表名; 全部删除
区别:
delete
1.DML语句
2.删除可以根据条件删除
3.逐条删除 效率低
4.配合事务 数据可以恢复
truncate
1.DDL语句
2.直接将表删除 创建新的表 删除效率高
3.只能全部删除
4.删除的数据无法恢复
改:修改表记录
数据准备:
truncate table student;
insert into student values (null,'欣欣','安徽','121212121212121211');
insert into student values (null,'小权权','江西老表',454845484548454845);
insert into student values (null,'丹丹','河南','121212121212121212'),(null,'糖糖','河南','121212121212121213'),(null,'保安哥哥','安徽','121212121212121214');
语法:
update 表名 set 字段1=新值1,字段2=新值2,... [where 条件]
条件一般不要省略 如果省略 就是全部修改
需求:
修改 id为1 的表记录的 name修改为女神
update student set name='女神' where id=1;
如果不添加条件 就是全部修改
将所有的name修改为女神or女汉子
update student set name='女神or女汉子';
-- 将id为2的表记录中的 name修改为老贾 address 修改为 山东
update student set name='老贾',address='山东' where id=2;
4.表记录之DQL语句(查询,重要)
select 字段1,字段2,... from 表名 [where 条件]
where 如果省略 查询的就是所有的信息
select * 代表查询所有的字段
--查询表格的所有信息
select * from product;
4.表记录之DQL语句(查询,重要)
简单查询
select 字段1,字段2,... from 表名 [where 条件]
where 如果省略 查询的就是所有的信息
select * 代表查询所有的字段
准备数据
#创建商品表
create table product(
pid int primary key,
pname varchar(20),
price double,
category_id varchar(32)
);
插入 测试数据
INSERT INTO product(pid, pname, price, category_id)
VALUES (1, '联想', 5000, 'c001');
INSERT INTO product(pid, pname, price, category_id)
VALUES (2, '海尔', 3000, 'c001');
INSERT INTO product(pid, pname, price, category_id)
VALUES (3, '雷神', 5000, 'c001');
INSERT INTO product(pid, pname, price, category_id)
VALUES (4, '杰克琼斯', 800, 'c002');
INSERT INTO product(pid, pname, price, category_id)
VALUES (5, '真维斯', 200, 'c002');
INSERT INTO product(pid, pname, price, category_id)
VALUES (6, '花花公子', 440, 'c002');
INSERT INTO product(pid, pname, price, category_id)
VALUES (7, '劲霸', 2000, 'c002');
INSERT INTO product(pid, pname, price, category_id)
VALUES (8, '香奈儿', 800, 'c003');
INSERT INTO product(pid, pname, price, category_id)
VALUES (9, '相宜本草', 200, 'c003');
INSERT INTO product(pid, pname, price, category_id)
VALUES (10, '面霸', 5, 'c003');
INSERT INTO product(pid, pname, price, category_id)
VALUES (11, '好想你枣', 56, 'c004');
INSERT INTO product(pid, pname, price, category_id)
VALUES (12, '香飘飘奶茶', 1, 'c005');
INSERT INTO product(pid, pname, price, category_id)
VALUES (13, '海澜之家', 1, 'c002');
简单查询
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tH1PWsPW-1615712776064)(/E:/%E9%BB%91%E9%A9%AC%E4%B8%8B%E8%BD%BD%E6%96%87%E4%BB%B6/%E6%AF%8F%E6%97%A5%E8%A7%86%E9%A2%91%E5%8F%8A%E5%85%B6%E7%AC%94%E8%AE%B0%E4%BD%9C%E4%B8%9A/day04_Mysql/02_%E9%9A%8F%E5%A0%82%E7%AC%94%E8%AE%B0/imgs/image-20210305150204352.png)]
按照条件查询
select 字段1,字段2,... from 表名 where 条件;
需求一:查询商品名称和商品价格
select pname,price from product;
需求二:查询价格大于500的商品信息
select * from product where price > 500;
取别名
as
select 字段 as 别名,字段 as 别名,... from 表名; -- 给字段取一个别名
select 字段 from 表名 as 别名; -- 给表取的别名 单表上来看意义不大 等到学习到多表查询的时候 我们就可以用到了
去重查询
-- select distinct 字段1,字段2,... from 表名;
distinct 字段 这个字段只保留不重复的记录
distinct 字段1,字段2,... 这两个字段的内容都一样 才算是重复的数据
-- 查询价格 去除重复的数据
select distinct price from product;
-- 查询 价格与分类都不一样的数据
select distinct price,category_id from product;
去重查询就是把相同的价格去掉,只保留一条数据。
查询的结果是表达式
在sql中是支持 简单运算的 + - * /
-- 运算查询:将所有商品的价格+10元进行显示
select price + 10 from product;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9ViZiRjO-1615712776071)(/E:/%E9%BB%91%E9%A9%AC%E4%B8%8B%E8%BD%BD%E6%96%87%E4%BB%B6/%E6%AF%8F%E6%97%A5%E8%A7%86%E9%A2%91%E5%8F%8A%E5%85%B6%E7%AC%94%E8%AE%B0%E4%BD%9C%E4%B8%9A/day04_Mysql/02_%E9%9A%8F%E5%A0%82%E7%AC%94%E8%AE%B0/imgs/image-20210305153719478.png)]
条件查询
-- 查询的信息是所有的信息 *
-- 条件 商品名为 '花花公子'
select * from product where pname='花花公子';
-- 示例1:查询商品名称为“花花公子”的商品所有信息
-- 查询的信息是所有的信息 *
-- 条件 商品名为 '花花公子'
select * from product where pname='花花公子';
# 示例2:查询价格为800商品
-- 确定查询的字段 *
-- 确定查询的条件 price 为 800
select * from product where price=800;
-- 示例3:查询价格不是800的所有商品
-- 确定查询的字段 *
-- 确定查询的条件 price 不等于 800
select * from product where price != 800;
# 示例4:查询商品价格大于60元的所有商品信息
-- 确定查询的字段 *
-- 查询条件是 price > 60;
select * from product where price > 60;
# 示例5: 查询商品价格在200到1000之间所有商品
-- 确定查询的字段 *
-- 查询条件200 <= price <= 1000;
-- price between 200 and 1000; 包括前后
-- 00到1000之间所有商品的意思就是 price >= 200 的同时还要 <= 1000
-- 关系表达式 and 关系表达式 这两个关系表达式要同时成立
-- 使用关系运算符连接的式子就叫做 关系表达式
select * from product where price between 200 and 1000;
select * from product where price >= 200 and price <= 1000;
# 示例6:查询商品价格是200或800的所有商品
-- 查询的字段 *
-- 查询的条件 价格要么是200 要么是800的 满足任意一个价格都可以
-- 关系表达式 or 关系表达式
select * from product where price = 200 or price = 800;
-- where price in(200,800) 等价于 where price = 200 or price = 800
select * from product where price in(200,800);
# 示例7:查询含有'霸'字的所有商品
-- 模糊查询
-- where 字段 like '值';
-- 值如何写 _ %
-- _ 一个任意字符
-- % 任意个任意字符
-- where name like '张_'; 两个字 姓张
-- where name like '_张_'; 三个字 中间一个字为张
-- where name like '张%'; 只要是以张开头就满足
-- where name like '%张%'; 只要有张就可以
# where pname like '%霸%';
select * from product where pname like '%霸%';
# 示例8:查询以'香'开头的所有商品
select * from product where pname like '香%';
# 示例9: 查询第二个字为'想'的所有商品
select * from product where pname like '_想%';
insert into product values (null,'好想你绿',20,null);
# 查询没有分类的商品
-- is null 为null
-- is not null 不为null
select * from product where category_id is null;
select * from product where category_id is not null;