MySQL数据库学习笔记

MySQL数据库学习笔记

1. SQL的分类

(1) DDL:数据库的定义:主要操作数据库和表结构,主要命令有:create(创建),drop(删除),alter(修改)

(2) DML:数据操纵语言:操作表数据,insert(插入),update(修改),delete(删除)

(3) DCL:数据控制语言:设置用户的访问权限,安全设置

(4) DQL:数据查询语言: select(控制显示) from(获取) where(条件表达式)

2. 数据库的定义

(1) 创建数据库:

① create database 数据库名称;

② create database 数据库名称 character set 字符集;

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

(2) 删除数据库:drop database 数据库名称;

(3) 修改数据库:alert database character set 字符集;

(4) 查看数据库:

① 查看所有数据库:show databases;

② 查看数据库定义:show create database 数据库名称;

③ 查看正在使用的数据库:select database();

(5) 选择使用数据库:use 数据库名称;

注意:mysql语句必须以;作为结束

3. 表结构的操作

  1. 创建表:
  • create table 表名(列名1 列的类型(长度) 列的约束 ,列名2 列的类型(长度) 列的约束);

    数据类型:int char(长度) varchar(长度) float double time(HH:MM:SS) datetime(YYYY-MM-DD HH:MM:SS) timestamp(获取当前时间)

  • char(长度)—> 固定长度,如果字符不占满,则用null填满 varchar(长度)—>非固定长度,如果字符不占满则以有效位为长度,两者都不能超出指定长度

  • ④ 列的约束:

      1. 主键约束:primary key 将当前列作为主键
      1. 唯一约束: unique
      1. 非空约束: not null
    • 给指定列添加约束语句:alter table 表名 change 旧列名 新列名 列的类型 新增列的约束;
    • auto_increment 自增

(2) 删除表:

  • drop table 表名;

(3) 修改表:

① 添加列:alter table 表名 add(列名,列的类型,列的约束);

② 修改列:alter table 表名 modify(列名,列的类型,列的约束);

③ 修改列名:alter table 表

名 change 旧列名 新列名 列的类型 列的约束;

④ 删除列: alter table 表名 drop 列名;

⑤ 修改表的字符集:alter table 表名 character set 字符集;

⑥ 修改表名:rename table 旧表名 to 新表名;

(4) 查看表:

① 查看数据库中所有的表:show tables;

② 查看表的定义格式:show create table 表名;

③ 查看表的结构:desc 表名;

4. 表中数据的CRUD操作

  • (1) 插入数据:insert into 表名 (列名1,列名2,…)values(值1,值2,…);
    • ① 如果是向表中所有的列插入数据时,可以简写:insert into 表名 values(值1,值2,…); 如果只是插入部分,则必须写出列名
    • ② 批量插入insert into 表名values(值1,值2,…),(值1,值2,…),…;前提是插入的数据都是全列的

插入的数据存在中文时出现错误提示解决办法:

​ 1) 设置数据库结构为指定字符集:set names gbk;
​ 2) 查看数据库结构:show variables like ‘char%’;

  • (2) 删除数据:

① delete from 表名 where 条件表达式;

  1. 注意:如果指明where 的条件表达式,会将所有数据全部删除

  2. 示例:delete from student where name=’张三’;

(3) 清空表中数据:truncate table 表名;

① 会先删除该表,再重新创建该类型的空表

② 与delete相比主要适用于清空大量数据时(效率高),delete适用于少量数据(效率高)

(4) 更新数据:update 表名 set 列名=值,列名=值 where 条件表达式;

① 示例:update student set name=’王五’,age=25 where cid=2; 表示将cid为2的行中的列为name的值改为王五,age改为25;

② 如果不给出where 条件表达式,则会将表中的数据全部修改;

5.查询语句

select [distinct] [*] [列名,列名] from 表名 [where 条件表达式]
distinct:去除重复的数据
*:表示显示所有列,如果需要,可以指定显示列
--商品分类
1.分类的ID
2.分类的名称
3.分类的描述

create table catepory(
	cid int primary key auto_increment,	//primary key主键约束, auto_increment自动递增
	cname varchar(10);
	cdesc varchar(31)
);

insert into category values(null,'手机数码','手机,相机');
insert into category values(null,'衣服配饰','温州制衣厂');
insert into category values(null,'香烟酒水','中华,茅台');
insert into category values(null,'牛奶乳品','蒙牛,伊利');
insert into category values(null,'馋嘴零食','辣条,瓜果');

--所有商品
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,'小米Mix3',3999,null,1);
insert into product values(null,'努比亚Z18s',2999,null,1);
insert into product values(null,'衣服',199,null,2);
insert into product values(null,'帽子',99,null,2);
insert into product values(null,'白酒',35,null,3);
insert into product values(null,'安慕希',6,null,4);
insert into product values(null,'卫龙',1,null,5);
insert into product values(null,'溜溜梅',8,null,5);


--查询所有列
	select * from 表名;
--查询指定列
	select 列名,列名,... from 表名;
--别名查询
	select 列名 as 自定义字段, 列名 as 自定义字段,... from 表名;
	查询显示结果不会影响存储的的数据,不会保留到数据库表中
--去重查询
	select distinct 列名 from 表名;
	指定一项进行去重,不可以多项去重;
--条件查询
	select * from 表名 where 条件表达式;
	示例:select price from product where price>60;
--关系运算符
	> >= < <= != <>
	<>!=都表示不等于,效果上无区别,<>是标准的SQL语句,!=是非标注的SQL语句
--逻辑运算符
	and or not 与 或 非 
	between...and...可以表示与,但是范围必须是从小到大,否则报错
	示例:select * from product where price<35 and price>900;
--模糊查询
	关键字:like
	_:表示一个字符
	%:表示多个字符
	示例:select * from product where pname like '_米%';
	表示显示匹配商品名称在米之前只有一个字符,在米之后有多个字符或没有字符的项
--范围查询
	关键字:in
	示例: select * from product where price in(35,900);
	表示显示范围大于35小于900的price项
	关键字段:between...and...
	示例: select * from product where price 35 and 900;
	表示显示范围大于等于35小于等于900的price项
	注意:无论是inhi啊是between...and...范围必须是从小到大;否则报错
--排序查询
	关键字:order by 列名 排序方式;
	desc:descend降序
	asc:ascend升序(默认方式,不指定排序方式时的默认方式);
	示例: select * from product order by price asc;
--聚合函数
	sum():求和
		示例: select sun(price) from product;
	avg():平均值
		示例: select avg(price) from product;
	count():计数
		示例: select count(*) from product;
	max():最大值
		示例: select max(price) from product;
	min():最小值
		示例: select min(price) from product;
	--注意:where 条件后面不能跟聚合函数;
--分组查询
	关键字:group by
	--1.根据cno分组,分组后统计每一组商品个数
		select cno,count(cno) from product group by cno;
	--2.根据cno分组,分组后统计每组商品个数,并且显示平均值大于200的
		select cno,count(cno) from product group by cno having avg(price) > 200;
	--having和where的区别
		having跟在group by后面,后面可以使用聚合函数
		where出现在group by前面,后面不能跟随聚合函数
--编写顺序
	--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排序显示

6.多表关联

  • 多表之间的关系维护:
    • 外键约束 foreign key
    • 给已有的表格添加外键约束
      • alter table 子表名 add foreign key(列名) references 父表名(列名);
      • 示例: alter table product foreign key(cno) references category(cid);
      • 注意:如果关联前,cno中存在cid中没有的内容,则无法关联,必须删除这些内容;关联之后,子表不能添加外键约束项父表没有的内容
      • 父表被关联之后,不能直接删除行,必须将子表关联到该行的所有行删除,才能成功删除
  • 创建数据库的原则
    • 一个项目或者应用创建一个对应的数据库
  • 创建表单的原则:
    • 一对多:一个父级表单的主键是子级表单的外键约束
    • 多对多:需要一个中间表,将多对多的关系转换为一对多,中间表至少拥有两个外键约束
    • 一对一:一对一,一般作为拆表使用,表单的主键都是一致的
      ###7.多表查询
  • 交连接查询 笛卡尔积
    • select * from 表名,表名;
      • 查询出来的结果是两张表的笛卡尔积(即一张表的每一项对应着另一张表的所有项)
    • 这样的结果是没有意义的,所以我们需要筛选出我们想要的结果
  • 隐式内连接(过滤笛卡尔积)
    • select * from 表名,表名 where 条件表达式;
      • 示例: select * from category,product where cno=cid;
  • 显示内连接(效率高)
    • select * from 表名 inner join 表名 on 条件表达式;
      • 示例: select * from product inner join category on cno=cid;
  • 显示内连接和隐式内连接的区别:
    • 隐式内连接:在查询出结果的基础上用where筛选显示
    • 显示内连接:直接查询指定满足条件的内容,效率高
  • 左外连接
    • select * from 主表名 left outer join 副表名 on 条件表达式;
    • 左外连接的结果是将副表中所有数据按照条件表达式的格式连接在主表的后面
    • 需要注意的是,如果副表中如果不存在主表指定的条件的数据时,会用null值填充
  • 右外连接
    • select * from 主表名 right outer join 副表名 on 条件表达式;
    • 右外连接的结果是显示副表所有的数据,主表按照条件表达式显示,主表依然显示在前,副表在后
    • 需要注意的是:主表中如果没有对应副表的数据,会用null替代

8.分页查询

  • 关键字 limit
  • select * from 表名 limit index,len;
    • index:表示的是起始索引,从0开始;
    • len:表示的是需要显示在每一页的数据量
      • select * from product limit 0,3; 从0索引开始,显示3条数据

9.子查询

你可能感兴趣的:(我的笔记)