1.什么是数据库(DB)?
一个存储数据的仓库,其本质是一个文件系统,数据按照特定的格式进行存放,我们可以通过SQL语言来进行增删改查操作。
2.什么是数据库管理系统(DBMS)?
数据库管理系统是用来对数据库进行统一管理和控制的大型软件,以保证数据库的安全性和完整性;用户一般通过数据库管理系统来对数据库中的表进行使用;
3.什么是SQL?
结构化查询语言
4.SQL的几种分类
DDL:数据定义语言,用来定义数据库对象,create(创建),drop(删除),alter(修改)
DML:数据操作语言,用来对数据库中的记录进行更新,insert(插入),delete(删除),updata(更新)
DQL:数据查询语言,用来查询数据库中的记录,select(选择),from(来自),where(设置条件),
DCL:数据控制语言,用来定义数据库的权限和安全级别;grant(授予权限)
5.几种常见的对于数据库的操作:
创建数据库:Create database 数据库名; //在SQL中不区分大小写
查看数据库:show databases;
删除数据库:drop database 数据库名;
使用某一个数据库:use database 数据库名;
6.在有数据库的时候我们可以通过使用这个数据库来建立相应的表,在后面的程序中用到我们的数据表;
一般的建表语句:
create table 表名(
字段名 类型(长度)[约束],
字段名 类型(长度)[约束]
);//一般的约束有primary key unique 和not null
查看表的结构用:desc 表名;删除表用:drop 表名;停止/启动MySQL:net stop/start mysql;
关于表的一些基本操作:
修改表添加列 alter table student add stu_id int not null;//添加stu_id这一列 |
它的一般格式为insert into 表名 (列名1,列名2) values (值1 ,值2);
需要注意的是:列名的个数和后面values中的值的个数是一致的,而且每一项的值需要对应;
建立完表之后我们需要对表进行数据的插入, 如:一个student表中有name和age属性,需要插入kangkang,和12岁的值:
insert into student (name,age) values (kangkang ,12);
修改表中的数据:updata 表名 set 属性1=值1,属性2=值2;
有条件的进行修改表中数据:updata 表名 set 属性1=值1,属性2=值2 where 条件;
删除记录:delete from 表名 [where 条件];
在删除中需要注意到delete和truncate的区别:
delete:一条一条的进行删除,数据可以找回,在删除之前开启事务(START TRANSACTION;),之后进行删除(DELETE from classmate;)接着查询的时候会发现数据为空(SELECT * from classmate;)当我们使用事务恢复的时候(ROLLBACK;)我们可以看到之前的数据已经恢复;
truncate:直接将表删除,重新建立一个一模一样的表,从头开始,数据无法找回;
简单查询:select * from 表名;
查询某一个属性:select 属性1,属性2 from 表名;
别名查询:select * from 表名 as 别名; //其中as可以省略
去重操作:SELECT DISTINCT(属性列) from 表名;
查询结果是表达式:SELECT 表名,(表达式) from 表名;
关于条件查询:一般我们使用where
如果我们从数据库中查询一个商品名称为a的所有信息:select * from 表名 where name = 'a';
另外有个小的知识点就是关于模糊查询,其中需要注意的是_和%,_代表的是一个字符,%代表多个字符;
排序:一般分为两种情况,一种是升序另外一种是降序;
升序:asc(默认情况下,可以不写),降序(desc)
常见的聚合函数:sum()求和,avg()平均,max(最大值),min(最小值),count(计数)
关于分组:group by,以及分组条件having:例如我们想要查询学生表中的信息,以学号进行分组,年龄大于20的同学的信息
eg:select * from student order by stu_num having age>20;即可
在SQL中我们需要注意的是:如果有一个表和另外一个表需要相互关联起来,我们需要怎么做呢?例如有个分类表,另外对应一个商品:那么我们就需要把这两个表连接起来。我们通过键的方式进行连接;
外键的特点:从表外键的值是对主表主键的引用,从表外键类型必须和主表主键类型一致;
表与表之间的关系:一对一,一对多,多对多;
//创建一个分类表
create table category(
cid varchar(32) primary key,
cname varchar(100)
);
//创建一个商品表
create table product(
pid varchar(32) primary key,
pname varchar(40),
price double,
category_id varchar(32)
);
//这里在product表中已经把外键category_id定义好了,
如果没有定义,则需要通过alter table product add column category_id varchar(32);
进行添加,在这一列设置完成之后,我们需要设置外键把两部分连接起来,
操作如下:alter table product add constraint product_fk
foreign key(category_id) references category(cid);
//注意:从表中不能添加主表中不存在的数据,主表中不能删除从表中已经引用的数据;
上面是一个一对多的关系,下面让我们在上一个的基础上来学习一个多对多的关系:
//建立一个订单表
create table orders(
oid varchar(32) primary key,
totalprice double
);
//建立一个订单项表
create table orderitem(
oid varchar(50),
pid varchar(50)
);
//订单表和订单项表的主外键关系
alter table orderitem add constraint orderitem_orders_fk foreign key(oid) references orders(oid);
//商品表和订单项表的主外键关系
alter table orderitem add constraint orderitem_product_fk foreign key(pid) references product(pid);
//通过两次连接,我们可以形成一种关系,订单表和商品表进行连接,多对多的关系;
既然我们能够把数据库中的各个表的管理连接起来,那我们就可以来根据表的连接进行查询,接下来让我们来看多表查询:
多表查询主要分为三种方式:(01)交叉连接查询,(02)内连接查询,(03)外连接查询
(1)交叉连接查询,不经常使用:eg:select * from a,b;查询结果是A和B表的条数相乘
(2)内连接查询:隐式内连接查询和显示内连接查询
隐式:select * from a,b where 条件;
显示:select * from a inner join b on 条件;
SELECT * from category c ,product p WHERE c.cid=p.category_id;
SELECT * from category c INNER JOIN product p on c.cid=p.category_id;
(3)外连接查询:左外连接,右外连接
左外:select * from a left outer join b on 条件;
右外:select * from a right outer join b on 条件;
SELECT * from category c LEFT OUTER JOIN product p on c.cid = p.category_id;
SELECT * from category c RIGHT OUTER JOIN product p on c.cid = p.category_id;
关于左外连接和右外连接之间的区别我们通过下面的一个例子来看一下;
//在category中添加一列数据:
insert into category(cid,cname) values ('004',null);
//在product中添加一列数据:
insert into product(pid,pname,price,category_id) values('p005','小米8','2460',null);
//接下来通过左外连接查询:
select * from category c left outer join product p on c.cid = p.category_id;
//接下来通过右外连接查询:
select * from category c right outer join product p on c.cid = p.category_id;
//查询结果:我们可以发现,我们新插入的数据他们两个之间没有连接起来,
在通过左外连接过程中,我们把左边表中的数据全部都查询了出来,
而右表中对应的列值都为空,同样在使用右外连接的时候,我们表中的数据也是这样
(右表中的数据全部被查询出来,而左表中的数据则全部是以空来显示的)
关于子查询:所谓的子查询就是一条SQL语句的查询结果作为另一条SQL语句的查询条件;
select * from product where category_id=(select cid from category where cname ='化妆品');