数据库:存储数据的仓库,本质就是一个文件系统。数据库按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加、修改、删除及查询操作。
SQL分类:
SQL通用语法:
下载MySQL和SQLyog(这个不下载,在cmd中运行也是可以的)
格式:CREATE DATAVBASE 数据库名;
CREARE DARABASE 数据库名 character set 字符集;
#创建数据的默认编码是utf-8(字符集)
选中这条语句,再运行。
查看所有数据库信息:
show databases;
查看某个数据库的定义信息:
show create database 数据库名;
drop database 数据库名;
查看当前使用的数据库
select database();
切换数据库
use 数据库;
格式:create table 表名(
字段名 类型(长度)[约束], # 约束:非空/唯一...
字段名 类型(长度)[约束],
...
)
类型:varchara(n)字符串,int整型,double浮点,timetamp时间戳...
CREATE TABLE category(
-> cid INT primary key, #分类ID
-> cname VARCHAR(20) #分类名称
-> );
主键约束(primary key):既不能为空也不能重复。
可以在SQLyog 中添加表中数据
查看所有表
show tables;
查看表结构
desc 表名;
drop table 表名;
rename table 表名 to 新表名;
修改表--添加列
alter table 表名 add 列名 类型(长度)[约束];
ALTER TABLE category ADD kk VARCHAR(20);
修改表--删除列
alter table 表名 drop 列名;
ALTER TABLE category DROP kk;
修改表--修改列名
alter table 表名 change 旧列名 新列名 类型(长度)[约束];
ALTER TABLE category CHANGE kk gg VARCHAR(10);
修改表--修改列的类型长度及约束
alter table 表名 modify 列名 类型(长度)[约束];
ALTER TABLE category MODIFY gg VARCHAR(5) NOT NULL;
修改表的字符集
alter table 表名 character set 字符集;(一般不修改)
ALTER TABLE category CHARACTER SET gbk;
两个约束:
向表中插入某些字段
insert into 表(字段1,字段2...)values(值1,值2);
向表中插入所有字段,字段的顺序为创建表时的顺序
insert into 表 values(值1,值2...);
注意:
INSERT INTO category(cid,cname) VALUES(1,'一花')
INSERT INTO category(cid,cname) VALUES(2,'二乃')
INSERT INTO category(cid,cname) VALUES(3,'三玖')
这样一行一行填入进表中
INSERT INTO
category
VALUES
(4,'四叶',10),
(5,'五月',10); # 这样写就可以全部添加进来了
UPDATE category SET gg=5; # gg这列全部改为5
UPDATE category SET gg=2 WHERE cname='三玖’;
准备工作
create table product(
pid int primary key,
pname varchar(20),
price double,
category_id varchar(20)
);
INSERT INTO product(pid,pname,price,category_id) VALUES
(1,'联想',7000,'c001'),
(2,'手风琴',200,'c002'),
.....
(7,'尤克里里',2000,'c003');
SELECT * FROM product; #查询所有数据
SELECT pname FROM product; #查询商品名
SELECT DISTINCT price FROM product; #去掉重复的价格
SELECT pname,price+10 FROM product; #所有商品价格+10
SELECT * FROM product;
查询名为’尤克里里‘的商品
SELECT * FROM product1 WHERE pname = "尤克里里";
查询价格为2000的商品
SELECT * FROM product1 WHERE price = 2000;
查询价格为500,20000的商品
SELECT * FROM product1 WHERE price in (500, 20000);
查询含有'琴'字的商品(%为0个或1个)
SELECT * FROM product1 WHERE pname LIKE "%琴%";
查询第二个字为'琴'的商品(_为一个字)
SELECT * FROM product1 WHERE pname LIKE "_琴%";
格式:
SELECT * FROM 表名ORDER BY 排序字段ASC/DESC;
(ASC:升序(默认) DESC:降序)
对商品价格进行降序操作
SELECT * FROM product1 ORDER BY price DESC;
在价格排序基础上(升序),对分类进行降序操作
SELECT * FROM product1 ORDER BY price, category_id DESC;
返回一个单一的值。
*count :统计指定列不为NULL的记录行数
*sum :计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0。
*max :计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算。
*min :计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算。
*avg :计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0。
例:查询商品总条数
SELECT COUNT(*) FROM product1;
查询分类为c002所有商品的平均价格
SELECT AVG(price) FROM product1 WHERE category_id = 'c002';
格式:
SELECT 字段1,字段2..FROM 表名 GROUP BY 分组字段 HAVING 分组条件;
having与where的区别
例:统计各个分类商品的个数
SELECT category_id, COUNT(*) FROM product1 GROUP BY category_id;
统计各个分类商品的个数,且只显示个数大于2的信息
SELECT category_id, COUNT(*) FROM product1 GROUP BY category_id HAVING COUNT(*) > 2;
格式:
SELECT 字段1,字段2...FROM 表名 LIMIT M,N;
M :从哪里开始(M+1) N:查多少个数据
语法:
备份:mysqldump -u用户名 -p密码 数据库名称 > 保存路径d://a.sql(不用进入到mysql里面)
还原:
数据的完整性:实体完整性、域完整性、引用完整性
实体完整性:对数据行的约束。如,主键约束,唯一约束。
域完整性:对数据列的约束。如,该列的数据类型,默认约束,非空约束。
引用完整性:外键约束(表与表之间的关系)
创建表时,直接在字段后面添加主键约束。
方法一:
CREATE TABLE product(
pid int PRIMARY KEY,
pname VARCHAR(20),
price DOUBLE,
category_id VARCHAR(20)
);
方法二:
CREATE TABLE product(
pid INT,
pname VARCHAR20),
price DOUBLE,
category_id VARCHAR(20),
PRIMARY KEY (pid)
);
方法三:
CREATE TABLE product(
pid INT,
pname VARCHAR20),
price DOUBLE,
category_id VARCHAR(20)
);
# 添加主键约束
ALTER TABLE product ADD PRIMARY KEY (pid);
# 删除主键约束
ALTER TABLE product DROP PRIMARY KEY;(一个表中有且只有一个主键)
UNIQUE 约束表中唯一标识数据库中的每条记录(可以有多个)
添加的三种方式和主键约束相同。
# 删除唯一约束
ALTER TABLE product DROP INDEX 约束名称;
可以在表中使用AUTO_INCREMENT关键字(自动增长列)。
自动增长类型必须是整型,自动增长列必须为键(一般是主键) 。
使用DEFAULT关键字。
再添加数据中,如果该字段不指定值,采用默认值处理。
使用FOREIGN KEY关键字。
为解决数据冗余现象,通常与自动增长约束一起使用。
语法:create table 表名(
外键列1名称 类型..
.....
foreign key(外键列名称)references 主表名称(主表列名称)
);
多表之间的关系
多对多建表:
学生和课程
建表原则:一张学生表,一张课程表,一张中间表,至少两个字段
学生表:
CREATE TABLE student(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(20),
sage INT
);
课程表:
CREATE TABLE course(
cid INT PRIMARY KEY AUTO_INCREMENT,
cname VARCHAR(20)
);
中间表
CREATE TABLE student_course_item(
student_id INT,
course_id INT,
FOREIGN KEY(student_id) REFERENCES student(sid),
FOREIGN KEY(course_id) REFERENCES course(id)
);
商品分类表
CREATE TABLE category(
cid INT PRIMARY KEY,
cname VARCHAR(20)
);
CREATE TABLE products(
pid INT PRIMARY KEY,
pname VARCHAR(20),
price INT,
flag VARCHAR(2), #是否上架,1表示上架
category_id INT,
FOREIGN KEY (category_id) REFERENCES category (cid)
);
INSERT INTO category(cid,cname) VALUES ('1','家电');
INSERT INTO category(cid,cname) VALUES ('2','服饰');
INSERT INTO category(cid,cname) VALUES ('3','化妆品');
INSERT INTO products(pid,pname) VALUES ('1','联想',7000,'1',1);
INSERT INTO products(pid,pname) VALUES ('2','海尔',5000,'1',1);
INSERT INTO products(pid,pname) VALUES ('3','雷神',6500,'1',1);
INSERT INTO products(pid,pname) VALUES ('4','JACK JONES',800,'1',2);
INSERT INTO products(pid,pname) VALUES ('5','花花公子',500,'1',2);
INSERT INTO products(pid,pname) VALUES ('6','香奈儿',700,'1',3);
INSERT INTO products(pid,pname) VALUES ('7','相宜本草',500,'1',3);
使用inner join --inner可以省略
隐式内连接:select * from A,B where 条件;
显示内连接:select * from A inner join B on 条件;
使用 outer join --outer可以省略
左外连接:left outer join
select * from A left outer join B on 条件;
右外连接:right outer join
select * from A right outer join B on 条件;
隐式:
SELECT DISTINCT category.* FROM category, products WHERE products.`category_id` = category.`cid` AND products.`flag` = 1;
显式:
SELECT DISTINCT category.* FROM category INNER JOIN products ON products.`category_id` = category.`cid` AND products.`flag` = 1;
子查询:一个查询的结果作为另一个查询的一部分
SELECT * FROM products WHERE category_id = (SELECT cid FROM category WHERE cname = '服饰');