MySQL数据库

数据库:存储数据的仓库,本质就是一个文件系统。数据库按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加、修改、删除及查询操作。

SQL分类:

  • 数据定义语言:简称DDL。用来定义数据库中的对象:数据库,表,列等。关键字:create,alter,drop,show等。
  • 数据操作语言:简称DML。用来对数据库中表的记录进行更新。关键字:insert,delete,updata等。
  • 数据控制语言:简称DCL。用来定义数据库中的访问权限和安全级别,创建用户。
  • 数据查询语言:简称DQL。用来查询数据库中表的记录。关键字:select,from,where等。

SQL通用语法:

  • SQL语句可以单行或多行书写,以分号结尾。
  • 可以使用/**/注释,或#。
  • SQL语句不区分大小写(添加的数据会区分),关键字建议用大写。

下载MySQL和SQLyog(这个不下载,在cmd中运行也是可以的)

DDL的数据库操作 database

创建数据库(增)

格式:CREATE DATAVBASE 数据库名;

           CREARE DARABASE 数据库名 character set 字符集;

#创建数据的默认编码是utf-8(字符集)

选中这条语句,再运行。

查看数据库(查)

查看所有数据库信息:

show databases;

查看某个数据库的定义信息:

show create database 数据库名;

删除数据库(删)

drop database 数据库名;

修改正在使用的数据库(切换数据库)

查看当前使用的数据库

select database();

MySQL数据库_第1张图片

切换数据库

use 数据库;

MySQL数据库_第2张图片


DDL的表操作 table

创建表

格式:create table 表名(

        字段名 类型(长度)[约束],      # 约束:非空/唯一...

        字段名 类型(长度)[约束],

        ...

)

类型:varchara(n)字符串,int整型,double浮点,timetamp时间戳...

CREATE TABLE category(
    -> cid INT primary key, #分类ID
    -> cname VARCHAR(20) #分类名称
    -> );

MySQL数据库_第3张图片

主键约束(primary key):既不能为空也不能重复。

可以在SQLyog 中添加表中数据

MySQL数据库_第4张图片

查看表

查看所有表

show tables;

查看表结构

desc 表名;

MySQL数据库_第5张图片

删除表

drop table 表名;

修改表(改名字)

rename table 表名 to 新表名;


DDL的表结构操作 -- 列

修改表--添加列

alter table 表名 add 列名 类型(长度)[约束];

        ALTER TABLE category ADD kk VARCHAR(20);

MySQL数据库_第6张图片

修改表--删除列

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;


DML数据库操作语言(对表内数据进行增删改)

两个约束:

  • primary key 主键,值唯一,且不能为空(非业务数据,有实际意义的数据)
  • auto_increment 自动增长,数据可以由MySQL自己维护

insert(增)

向表中插入某些字段

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(改)

UPDATE category SET gg=5;  # gg这列全部改为5

UPDATE category SET gg=2 WHERE cname='三玖’;


DQL数据库查询语言

准备工作

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;

 MySQL数据库_第7张图片

查询名为’尤克里里‘的商品

SELECT * FROM product1 WHERE pname = "尤克里里";

 MySQL数据库_第8张图片

 查询价格为2000的商品

SELECT * FROM product1 WHERE price = 2000;

 MySQL数据库_第9张图片

查询价格为500,20000的商品 

SELECT * FROM product1 WHERE price in (500, 20000);

 MySQL数据库_第10张图片

查询含有'琴'字的商品(%为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;

MySQL数据库_第11张图片

聚合查询

返回一个单一的值。

*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的区别

  • having是在分组后对数据进行过滤
  • where是在分组前对数据进行过滤
  • 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;

MySQL数据库_第12张图片

分页查询

格式:

 SELECT 字段1,字段2...FROM 表名 LIMIT M,N;

M :从哪里开始(M+1)             N:查多少个数据


SQL备份

语法:

备份:mysqldump -u用户名 -p密码 数据库名称 > 保存路径d://a.sql(不用进入到mysql里面)

还原:

  1. 登录数据库 mysql -u root -p
  2. 创建数据库 create database db
  3. 使用数据库 use db
  4. 执行文件,source文件路径 source d://a.sql
  5. 最后可以查看是否还原成功 show databases

SQL约束

数据的完整性:实体完整性、域完整性、引用完整性

实体完整性:对数据行的约束。如,主键约束,唯一约束。

域完整性:对数据列的约束。如,该列的数据类型,默认约束,非空约束。

引用完整性:外键约束(表与表之间的关系)

添加主键约束

创建表时,直接在字段后面添加主键约束。

方法一:

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 = '服饰');

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