mysql数据库---sql语句的总结

mysql数据库---sql语句的总结_第1张图片


数据库

  • 数据库:
  • 表结构的操作:
  • 表中数据的操作:
  • 多表之间的关系:
    • 多表之间的建表原则
  • 多表查询:
    • 内连接:
    • **分页查询**
  • 其他:

数据库:

—创建数据库:

①最基本的创建方式:
create database 数据库的名

②创建数据库并设置字符集和校对规则:
create database 数据库的名 character set 字符集  collate 校对规则
eg:create database day10 character set utf8  collate utf8_general_ci

—删除数据库:

drop database 数据库的名

—修改数据库的字符集:

alter database 数据库的名 character set 字符集
eg: alter database day08 character set gbk;

—查看数据库:

①查看所有数据库:
show databases

②查看数据库的定义方式:
show create database 数据库的名字

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

—选中数据库:

use 数据库的名字

表结构的操作:

—创建表:

create table 表名(	
​	列名 列的类型  列的约束,
​	列名 列的类型  列的约束
)
eg:
create table test(
	id int primary key auto_increment,
	name varchar(20)
)

列的类型:
int	char	varchar()	double	timestamp 等(其实和java的基本类型差不多)
列的约束:
​primary key 主键约束
unique : 唯一约束
not null 非空约束
自动增长 : auto_increment

—删除表:

drop table 表名

—修改表:

①添加列:
alter table 表名 add 列名 列的类型	列的约束条件
eg:alter table test add cd int not null

②修改列:
alter table 表名 modify 列名 列的类型	列的约束条件
eg:alter table test modify cd varchar(20) not null;

③修改列名:
alter table 表名 change 旧列名 新列名 列的类型	列的约束条件
eg:alter table test change cd ct varchar(20) not null;

④删除列:
alter table 表名 drop 列名
eg:alter table test drop ct;

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

⑥修改表名:
rename table 旧表名 to 新表名
eg:rename table test to tt

—查看表:

①查看所有表:
show tables

②查看表的定义结构:
show create table 表名

③查看表的结构:
desc 表名

表中数据的操作:

插入:insert into 表名(列名,列名) values(值1,值2);

删除:delete from 表名 [where 条件]

修改:update 表名 set 列名='值' ,列名='值' [where 条件];

查询:select [distinct]  * [列名1,列名2] from 表名 [where 条件]

as关键字: 别名

where条件后面:

​		关系运算符:  > >= < <= !=  <>

​		--判断某一列是否为空:  is null    is not null

​		in 在某范围内

​		between...and

​		逻辑运算符: and or not

​		模糊查询:  like    

​		_ : 代表单个字符

​		%: 代表的是多个字符

​		分组: group by 

​		分组之后条件过滤:  having

​		聚合函数: sum()  ,avg() , count()  ,max(), min()

​		排序: order by  (asc 升序, desc 降序)

多表之间的关系:

分类表和商品表之间是不是有关系? 如果有关系,在数据库中如何表示这种关系
①分类表:

create table category(
  cid int 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,'馋嘴零食','瓜子花生,八宝粥,辣条');

②商品表:

create table product(
	pid int primary key auto_increment,
  	pname varchar(10),
  	price double,
  	pdate timestamp,
  	cno int
);
insert into product values(null,'小米mix4',998,null,1);
insert into product values(null,'锤子',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);

我们可以通过添加外键的形式:

alter table product add foreign key(cno)  references  category(cid);

//无法插入进去
insert into product values(null,'好看的',1,null,12);

多表之间的建表原则

  • 一对多 : 商品和分类

    • 建表原则: 在多的一方添加一个外键,指向一的一方的主键
  • 多对多: 老师和学生, 学生和课程

    建表原则: 建立一张中间表,将多对多的关系,拆分成一对多的关系,中间表至少要有两个外键,分别指向原来的那两张表

  • 一对一: 班级和班长, 公民和身份证, 国家和国旗

    • 建表原则:
      • 将一对一的情况,当作是一对多情况处理,在任意一张表添加一个外键,并且这个外键要唯一,指向另外一张表
      • 直接将两张表合并成一张表
      • 将两张表的主键建立起连接,让两张表里面主键相等

主键约束: 默认就是不能为空, 唯一

  • 外键都是指向另外一张表的主键
  • 主键一张表只能有一个

唯一约束: 列面的内容, 必须是唯一, 不能出现重复情况, 为空

  • 唯一约束不可以作为其它表的外键
  • 可以有多个唯一约束

多表查询:

我们需要创建两个表:

create table class(
	id int primary key auto_increment,
	cname varchar(10)
)
insert into class value(null,'一班');
insert into class value(null,'二班');
insert into class value(null,'三班');
insert into class value(null,'四班');


create table student(
	id int primary key auto_increment,
	name varchar(10),
	cid int
)
insert into student value(null,'张三',1);
insert into student value(null,'赵六',2);
insert into student value(null,'王五',3);
insert into student value(null,'小明',5);

内连接:

查询:学生的全部信息:
隐示内连接:

select * from student as s,class as c where  s.cid = c.id;

mysql数据库---sql语句的总结_第2张图片
显示内连接(关键字是:inner join):

select * from student as s inner join class as c on s.cid = c.id;

mysql数据库---sql语句的总结_第3张图片
发现查询结果都是相同的,那么这两种查询方式有什么不同呢?

显示查询的方式查询速度更快,原因是,显示内连接的查询条件和from一起得到查询后的结果,而where是from把所有的结果得到后,在根据where后面的条件进行筛选,所以速度慢一点

左外连接(关键字是: left outer join)

select * from student as s left outer join class as c on s.cid = c.id;

查询结果:
mysql数据库---sql语句的总结_第4张图片

右外连接(right outer join)

select * from student as s right outer join class as c on s.cid = c.id;

mysql数据库---sql语句的总结_第5张图片
什么是外连接:
如果是 左外连接(left outer join) 那么就以左边这个表为主,会把左边这个表的所有信息全部输出出来,然后在根据on后面的条件,如果条件成立,那么就在后面将内容输出,如果条件不成立,那么就以null输出,
右外连接(right outer join)跟上面一样,只不过是以右边那个表为主。

分页查询

  • 每页数据数据3

  • 起始索引从0

  • 第1页: 0

  • 第2页: 3

    起始索引: index 代表显示第几页 页数从1开始

    每页显示3条数据

    startIndex = (index-1)*3

第一个参数是索引

第二个参数显示的个数

select * from student limit 0,3;

select * from product limit 3,3;

sql语句的相关练习题


其他:

查看编码格式

SHOW VARIABLES LIKE 'character_set_%';

设置临时编码格式

set names 编码格式

你可能感兴趣的:(数据库)