数据库及mysql知识
数据库,mysql基础知识总结(单表操作)
任何一门新的技术的出现和更新无外乎两方面: 1. 效率更高 2. 安全性更强.
记忆:
1.数据库才是实际开发中,我们真正存储数据的地方
2.对数据库的增删改查操作合称为:CURD(Create,Update,Read,Delete)
使用mysql中会遇到的问题:
在Windows窗口下,可以通过以下指令控制mysql服务的开启和关闭:
开启mysql服务:net start mysql(后面跟着自己安装后的mysql名称)
关闭mysql服务:net stop mysql(后面跟着自己安装后的mysql名称)
如果在输入指令报拒绝访问时,是由于自己权限不够,通过管理员身份登录cmd窗口即可使用
分类:
#DDL: (Data Definition Language,数据定义语言)
#主要是用来操作数据库,数据表
#关键字:create drop alter use
#DML: (Data Manipulation Language,数据操纵语言) 对表数据的增删改合称为: 更新语句
#主要是对 表数据 进行增删改的操作的
#关键字: insert delete update
#跟事务相结合
#DCL: (Data Control Language,数据控制语言)
#主要是创建账号,设置权限和访问级别
#关键字: COMMIT:确认对数据库中的数据进行的变更
#关键字: ROLLBACK:取消对数据库中的数据进行的变更
#关键字: GRANT:赋予用户操作权限
#关键字: REVOKE:取消用户的操作权限
#DQL: (DataQuery Language, 数据查询语言)
#主要是对 表数据 进行查询的操作的
#关键字: select from where
数据库操作:
# 增: 创建数据库 create database 数据集库名
create database web01;-- 举例web01
# 查: 查询数据库
#1.查询所有数据库
show databases;
#2.查询指定数据库(字符集) show create database 数据库名
show create database web01;
show create database web02;
# 改: 修改数据库的码表
# alter database 数据库名 charset 指定的字符集
# alter database 数据库名 character set 指定的字符集
#更该编码集 为gbk
alter database web01 charset 'gbk';
#更改编码集为utf8
alter create web02 charset 'utf8';
#创建表并指定编码集
create database web02 character set 'gbk';
create database web02 charset 'gbk';
# 删: 删除数据库
# drop database 数据库名;
#删除数据库/数据表
drop database web02;
#使用指定数据库(切换库)
# use 数据库名
use web01;
use web02;
数据库表操作
# 增: 创建数据库表 #格式: create table 数据表名( # 字段名 字段类型 [约束], # 字段名 字段类型 [约束], # 字段名 字段类型 [约束], # ..... # ); #不含约束条件 create table users( uid int, username varchar(20), password varchar(20) ); #含约束条件 create table users( uid int primary key auto_increment, uname varchar(20), pw varchar(20) ); # 查: #1.查询指定的数据表(编码表) show create table 数据表名; show create table users; #2.查询指定数据表(结构) desc 数据表名; desc users; #3.查询所有的数据表 show tables; # 改: 修改数据库 # 1. 添加列 alter table users add email varchar(21) not null; #2. 修改列 #修改列(类型,约束) alter table users modify email varchar(15); #修改列(列名,类型,约束) alter table users change email youxiang varchar(14); #删除指定的列 alter table users drop youxiang; #修改数据表的码表 show create table users;-- 查看数据表的编码集 alter table users charset 'gbk'; # 修改数据表表名 rename table users to users_temp; show tables; # 删除表: drop table users;
对应数据类型表:
约束条件概念:
数据库表操作
操作表数据
#增
#格式一: insert into 数据表名(列名1,列名2,列名3...) values(值1,值2,值3...);
insert into users(uid,username,password) values(1,'zhangsan','zs123');
#格式二: insert into 数据表名 values(值1,值2,值3);
-- 前面不写列名,默认是全列名(即 所有的列都包含)
insert into users values(2,'lisi','ls123')
#格式三: insert into 数据表名 values(null,值2,值3);
insert into users values(null,'wangwu','ww123');
#格式四: 同时插入多条数据
#insert into users2 values(null,值2,值3),(null,值2,值3)...(null,值2,值3);
insert into user2 values(null,'admin01','abc'),(null,'admin02','cba'),(null,'admin03','bcd');
#解决mysql中中文乱码问题
#原因: window的码表是:GBK, MYSQL的码表是:UTF-8,编码表不一致导致出现的问题.
#方式一:临时性解决
set name 'gbk';
#方式二: 永久性解决
-- 修改my.ini配置文件 将client的码表改为:GBK
#改
#格式: update 数据表名 set 字段名='值',字段名='值' where 条件;
update users set username='李四',password='ls123' where uid=2;
#注意点: 如果不写条件,是按照该修改情况,修改表中所有的数据.
#删
#格式: delete from 数据表名 where 条件;
#该方式只会删除数据,不会重置id
delete from user where id=2;
#查
#格式一: select * from 数据表名;
select * from users;
#格式二: select 列名1,列名2,列名3... from 数据表名;
#带别名的查询: 关键字: as
select username as '账号',uid as '编号' from users;
select username '账号',uid '编号' from users;
小案例:
#需求: 成绩表 exam(eid,ename,chinese,math,english)
#创建exam表
create table exam (
eid int primary key auto_increment,
ename varchar(20),
chinese int,
math int,
english int
);
#插入表数据
insert into exam values(null,'张三',98,98,100),
(null,'李四',59,68,80),
(null,'王五',100,40,60),
(null,'赵六',79,100,40),
(null,'阿三',50,50,50),
(null,'三少',90,80,95);
#1. 条件运算符 >, <, >=, <=, =, !=(<>)
#查询eid大于3的信息
select * from exam where eid>3;
#查询eid不为3 的成绩信息
select * fromexam where eid != 3;
select * from exam where eid <> 3;
#2. 区间(范围)运算符 between 值1 and 值2;
#查询id为2到4的学生成绩信息
select * from exam where eid between 2 and 4;
#3. 逻辑运算符 and or not
#查询id为2或者为3或者为4的学生成绩信息
select * from exam eid=2 or eid=3 or eid=4;
#not一般是查询某一项是否为null的值
select * from exam where chinese is not null;
select * from exam where chinese is null;
#4. 固定值的查询 in(值1,值2,值3) 功能类似于or
#查询eid为1和4的学生信息
select * from exam where eid in(1,4);
#5. 模糊查询 like 条件
#一般会结合占位符使用 _占一个位置 %占多个位置
#查询ename中第二个字为三的学生信息
select * from exam where ename like '_三';
#查询ename中包含有三的学生信息
select * from exam where ename like '%三%';
数据表操作增格式:
解决中文乱码问题:
排序查询:
#关键字: order by 要排序的列 [asc/desc];
-- asc表示升序,但程序默认是升序,故asc可以省略不写,desc表示降序
-- 无论一个SQL语句简单还是复杂,排序语句必须放在整个sql语句的最后边
#需求: 查找所有语文成绩及格的学生信息,并且按照语文成绩进行降序排列,若语文成绩一样,按照数学成绩升序排列
select * from exam where chinese >= 60 order by chinese desc,math asc;
聚合函数: 纵向计算规则
#求取某个学生的总成绩(包括Chinese,math,english)
select eid,ename,chinese '语文',math '数学',english '英语',(chinese+math+english) '总成绩' from exam;
# count() 一般用于计算数据一共有多少条.
# max() 求取最大值
# min() 求取最小值
# avg() 求取平均值 平均值有可能是小数 其值为double类型
# sum() 进行求和运算
# 注意点: where 条件后面不能跟聚合函数
分组查询:
#关键字: group by 要分组的列;
create table product(
pid int primary key auto_increment,
pname varchar(20),
price double
);
#插入数据
insert into product values(null,'冰箱',2000),
(null,'冰箱',1000),
(null,'冰箱',1500),
(null,'洗衣机',2000),
(null,'电视机',3000),
(null,'洗衣机',1000),
(null,'电视机',10000);
#需求:
#1. 统计每类商品的个数
select pname,count(*) from product group by pname;
#2. 统计每类商品的总金额
select pname,sum(price) from product group by pname;
#3. 统计每类商品的总金额,并且总金额大于4000
select pname,sum(price) from product group by pname having sum(price)>4000;
select pname,sum(price) sp from product group by pname having sp>4000;
#4. 统计每类商品的总金额,并且总金额大于4000,然后按照总金额进行降序排列
select pname,sum(price) from product group by pname having sum(price)>4000 order by sum(price) desc;
select pname,sum(price) sp from product group by pname having sp>4000 order by sp desc;
#5.统计每类商品的总金额,并且总金额大于2000,然后按照总金额进行降序排列,只统计单价在1500(包括)以上的商品.
select pname,sum(price) from product where price>=1500 group by pname having sum(price)>2000 order by sum(price) desc;
select pname,sum(price) sp from product where price>=1500 group by pname having sum(price)>2000 order by sp desc;
一个完整的SQL查询语句的格式:
select 列名1,列名2,列名3,.. from 数据表名 where 分组前的条件筛选 group by 要分组的列 having 分组后的条件筛选 order by 要排序的字段[asc/desc];