MySql数据库学习(一)
mySQL (关系型数据库管理系统)
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。
- MYSQL的SQL语句
SQL:Structure Query Language结构化查询语言
DDL:数据定义定义语言:定义与数据库/表结构:create(创建)drop(删除) alter(修改)
DML:数据操纵语言:主要是用来操作表数据 insert(插入) update(修改) delete(删除)
DCL:数据控制语言:定义访问权限,取消访问权限,安全设置 grant
DQL:数据查询语言:select(查询) from子句 where子句
1. 数据库的CRUD的操作
- 首先要登录数据库服务器:mysql -uroot -proot
创建数据库
create database 数据库名字
create database day01;
--创建数据库的时候,指定字符集
create database 数据库的名字 character set 字符集;
create database day01_1 character set utf-8;
create database 数据库的名字 character set 字符集 collate 校对规则;
create database day01_2 character set utf-8 collate utf8_bin;
查看数据库
--查看数据库定义的语句
show create database 数据库的名字
show create database day_01;
show create database day_01_1;
--查看所有数据库
show databases;
informartion_schema
performance_schema
mysql
修改数据库的操作
--修改数据的字符集
alter database 数据库的名字 character set 字符集;
alter database day01_1 character set gbk;
删除数据库
drop database 数据库的名字;
drop database day01;
drop database test;
其他数据库操作命令
--切换数据库(选中数据库)
use 数据库的名字
use day01;
--查看一下当前正在使用的数据库
select database();
2. 表的CRUD操作
创建表
create database 数据库的名字;
create table 表名(
列名 列的类型(长度) 约束,
列名2 列的类型(长度) 约束,
);
列的类型:
java sql
int int
char/string char/varchar
char : 固定长度
varchar : 可变长度
char(3) 一 一空格空格
varchar(3) 一 一
长度代表的是字符的个数
double double
float float
boolean boolean
date date : YYYY-MM-DD
time : hh:mm:ss
datetime : YYYY-MM-DD hh:mm:ss 默认值是null
timestamp :YYYY-MM-DD hh:mm:ss 默认使用当前时间
text : 主要是用来存放文本
blob :存放的是二进制
列的约束:
主键约束 : primary key
唯一约束 : unique
非空约束 : not null
创建表:
1.分析实体:学生
2.学生ID
3.姓名
4.性别
5.年龄
create table student(
sid int primary key,
sname varchar(31),
sex int,
age int
);
查看表
--查看所有的表
show tables;
--查看表的定义
show create table student;
--查看表结构
desc student;
修改表
添加列(add),修改列(modify),修改列名(change),删除列(drop),修改表名(rename),修改表的字符集
添加列(add)
alter table 表名 add 列名 列的类型 列的约束
alter table student add chengji int not null;
修改列(modify)
alter table student modify sex varchar(2);
修改列名(change)
alter table student change sex gender varchar(2);
删除列(dorp)
alter table student drop chengji;
修改表名(rename)
rename table student to studenttable;
修改表的字符集
alter table studenttable character set gbk;
删除表
drop table studenttable;
Sql完全对表中的数据的CRUD的操作:
插入数据
insert into 表名(列名1,列名2,列名3) values(值1,值2,值3);
--简单写法:如果插入式全列名的数据,表名后面的列名可以省略
insert into 表名 values(值1,值2,值3);
insert into student values(2,'zhangsan',1,23);
--注意:如果是插入部分列的话,列名不能省略
insert into student(sid,sname) values(3,'lisi');
insert into student values(3,'lisi');//这种写法是错误的
--插入批量数据:
insert into student(sid,sname,sex,age) values
(1,'zhangsan',1,23),
(2,'zhangsan',1,23),
(3,'zhangsan',1,23),
(4,'zhangsan',1,23),
(5,'zhangsan',1,23),
(6,'zhangsan',1,23);
--单条插入和批量插入的效率
看插入的数据多少,多的话就是批量插入的效率高
--查看表的数据
select * from student;
命令行下插入中文问题:insert into student values(10,‘李四’,1,23);
- 临时解决方案:set names gbk;相当于是高速mysql服务器软件,我们当前在命令行下输入的内容是GBK编码,当命令行窗口关闭之后,他在输入中文就会存在问题。
- 永久解决办法:修改my.ini配置(在mysql软件安装路径里)
1.暂停mysql的服务
2.在mysql安装路径中找到my.ini配置文件;C:\Program Files\MySql Server 5.5
3.将57行的编码改成gbk
4.保存文件退出
5.启动mysq服务
删除表记录
delete from 表名 [ where 条件 ]
delete from student where sid = 10;
delete from student; 如果没有指明条件 会将表中的数据一条一条全部删除掉
--面试问题:请说一下 delete 删除数据 和 truncate 删除数据有什么差别
delete: DML 一条一条删除表中的数据
truncate :DDL 先删除表在重建表
关于哪条执行效率高:具体要看表中的数据量
如果数据比较少,delete比较高效
如果是数据比较多,truncate比较高效
更新表记录
update 表名 set 列名=列的值,列名=列的值2 [ where 条件]
--将sid为5的名字改成李四
--如果参数是字符串,日期要加上单引号
update student set sname = ‘李四’ where sid = 5;
update 表名 set 列名=列名值,列名2=列的值2 [ where 条件]
update student set sname ='王五',sex='1';
update student set sname ='赵六',sex='0' where sid=6;
查询记录
select [distinct][*] [列名,列名2] from 表名 [where 条件]
distinct : 去除重复的数据
--商品分类:手机数码,鞋子提包...
1.分类的ID
2.分类名称
3.分类描述
create table category(
cid int primary key auto_increment,
cname varchar(10),
cdesc varchar(31)
);
insert into category values(null,'手机数码','kk电子产品,kk生产');
insert into category values(null,'鞋子书包','kk皮鞋厂,kk生产');
insert into category values(null,'香烟酒水','kk酒水,kk生产');
insert into category values(null,'零食饼干','kk哇哈哈哈,kk生产');
insert into category values(null,'零食辣条','kk威龙,kk生产');
select * from category;
select cname,cdesc from category;
--所有商品
1.商品ID
2.商品名称
3.商品的价格
4.生产日期
5.商品分类ID
商品和商品分类 :所属关系
create table product(
pid int primary key auto_increment
pname varchar(10),
price double,
pdate timestamp,
cno int
);
insert into product values(null,'小米9',998,null,1);
insert into product values(null,'1+',2888,null,1);
insert into product values(null,'阿迪达斯',99,null,2);
insert into product values(null,'老村长',88,null,3);
insert into product values(null,'劲酒',35,null,3);
insert into product values(null,'小熊饼干',1,null,4);
insert into product values(null,'威龙辣条',1,null,5);
insert into product values(null,'小辣条',1,null,5);
--简单查询:
---查询所有的商品:
select * from product;
---查询商品名称和商品价格:
select pname,price from product;
---别名查询 as 的关键字, as 关键字是可以省略的
--表别名: select p.pname ,p.price from product p;(主要是用在多表查询);
select p.pname,p.price from product as p;
--列别名: select pname as 商品名称 ,price as 商品价格 from product;
select pname as 商品名称,price as 商品价格 from product;
省略as关键字
select pname 商品名称,price 商品价格 from product;
---去掉重复的值
--查询商品所有的价格
select price from product;
select distinct price from product;
--select 运算查询 : 仅仅在查询结果上做了运算 + - * /
select *,price*1.5 from product;
select *,price*1.5 as el折后价 from product;
select *,price*0.9 from product;
--调价查询 [ where 关键字]
指定条件,确定要操作的记录
--查询商品价格>60元的所有商品信息
select * from product where price > 60 ;
--where 后的条件写法:
--关系运算符: > >= < <= = != <>
<> : 不等于 :标准SQL语法
!= : 不等于 : 非标准SQL语法
--查询商品价格不等于88的所有商品:
select * from product where price <> 88;
select * from product where price != 88;
--查询商品价格在 10 到 100 之间
select * from product where price > 10 and price >100;
between ...and...
select * from product where price between 10 and 100;
--逻辑运算:and , or ,not
--查询出商品价格 小于100 或者商品价格 大于900
select * from product where price <35 or price >900;
--like :模糊查询
_ : 代表的是一个字符
% : 代表的是多个字符
-- 查询出名字中带有饼的所欲商品 ‘%饼%’
select * from product where pname like '%饼%'
-- 查询第二名字是熊的所有商品 ‘_熊%’
select * from product where pname like '_熊%'
-- in 在某个范围中获取值
--查询出商品分类ID在 1,4,5里面的所有商品
select * from product where cno in (1,4,5);
--排序查询 : order by 关键字
asc : ascend 升序 (默认的排序方式)
desc : descend 降序
--0.查询所有的商品,按照价格进行排序
select * from product order by price
--1.查询所有的商品,按价格进行降序排序(asc -升序 desc-降序);
select * from product order by price desc;
--2.查询名称有 小 的商品,按价格降序排序
1.查询名称有 小 的商品
select * from product where pname like '%小%';
2.进行排序得出结果
select * from product where pname like '%小%'; order by price asc;
--聚合函数:
sum() :求和
avg() :求平均值
count() :统计数量
max() :最大值
min() :最小值
--1.获取所有商品价格的总和:
select sum(price) from product;
--2.获取所有商品的平均价格:
select avg(price) from product;
--3.获取所有商品的个数:
select count(*) from product;
--注意:where 条件后面不能接聚合函数
select * from product where price > avg(price);//这是错误的
--查询出商品价格大于平均价格的所有商品
查询所有商品
select * from product;
大于
平均价格
select avg(price) from product;
select * from product where price > (select avg(price) from product);
--分组 :group by
--1.根据cno 字段分组,分组后统计商品的个数
select cno ,count(*) from product group by cno;
--2.根据cno 分组,分组统计每组商品的平均价格 并且商品平均价格 > 60
select cno,avg(price)
from product group by cno
having avg(price) > 60;
--having 关键字 可以接聚合函数的 出现分组之后
--where 关键字 他是不可以接聚合函数 出现在分组之前
--编写顺序
--S..F ..W..G...H..O
select..from..where..group by ..having ..order by
--执行顺序
F..W..G..H..S..O
from.. where.. group by ..having ..select .. order by