mysql入门
一、 数据库的介绍
1.什么是数据库
数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作。
2数据库管理系统
数据库管理系统(DataBase Management System,DBMS):指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管理系统访问数据库中表内的数据。
二、 mysql的数据库的安装
略
卸载的步骤:
-
找到mysql的安装目录
-
找到安装目录中的my.ini文件 复制里面的一个路径: mysql保存数据的目录
-
控制面板写在mysql
-
找到要删除的文件(隐藏文件) 删除MYSQL的目录
启动和停止mysql服务器
Doc窗口:
net start mysql 启动
met stop mysql 停止
登录数据库
mysql -uroot -p密码
mysql --host=127.0.0.1 --user=root --password=密码
三、 SQL语句的介绍
简介:
结构化查询语言(Structured Query Language)简称SQL,是关系型数据库管理系统都需要遵循的规范。不同的数据库生产厂商都支持SQL语句,但都有特有内容。
分类
- 数据定义语言:简称DDL(Data Definition Language),用来定义数据库对象:数据库,表,列等。关键字:create,alter,drop等
- 数据操作语言:简称DML(Data Manipulation Language),用来对数据库中表的记录进行更新。关键字:insert,delete,update等
- 数据控制语言:简称DCL(Data Control Language),用来定义数据库的访问权限和安全级别,及创建用户。(用的话就查)
- 数据查询语言:简称DQL(Data Query Language),用来查询数据库中表的记录。关键字:select,from,where等
我们需要掌握的有两种最常用的:
DML 数据操作语言.表数据的 添加 修改 删除
DQL 表中的数据进行查询 select
SQL语句的基本语法:
- SQL语句可以单行或多行书写,以分号结尾
- 可使用空格和缩进来增强语句的可读性
- MySQL数据库的SQL语句不区分大小写,关键字建议使用大写
o 例如:SELECT * FROM user。 - 同样可以使用//的方式完成注释
单行注释: #被注释的内容 – 备注是的内容
多行注释: // - MySQL中的我们常使用的数据类型如下
#查看所有的数据库
– 查看所有的数据库
/*
查看所有的数据
/
SHOW DATABASES;
DDL数据的操作
1.数据库的DDL操作
创建数据库
– 创建数据库
/*
第一种:
create database 数据库的名称;
第二种:
create databse 数据库的名称 character set 字符集
第三种:右键创建
*/
CREATE DATABASE day01_web;
CREATE DATABASE day01_web2 CHARACTER SET ‘UTF8’;
– 查看所有的数据库
SHOW DATABASES;
– 查看如何定义数据
SHOW CREATE DATABASE day01_web;
– 删除数据库
DROP DATABASE day01_web3;
DROP DATABASE day01_web2;
– 查看选中的数据库
SELECT DATABASE();
– 切换数据库
– use 数据库的名称
USE day01_web;
2.DDL数据库表操作
表的操作
– 创建表
/*
格式:
create table 表名称(
字段名 字段类型及长度 [约束],
字段名2 字段类型及长度 [约束],
字段名2 字段类型及长度 [约束]
);
*/
CREATE TABLE person(
NAME VARCHAR(20) ,
age INT
);
– 查看数据库中的所有表:
SHOW TABLES;
– 查看表结构:
DESC person;
– 格式:drop table 表名
DROP TABLE person;
表结构的操作(了解)
– alter table 表名 add 列名 类型(长度) [约束];
– 给表上添加一个 sex列
ALTER TABLE person ADD sex
VARCHAR(5) ;
– alter table 表名 modify 列名 类型(长度) 约束;
– 作用:修改表修改列的类型长度及约束.
ALTER TABLE person MODIFY sex VARCHAR(10);
– alter table 表名 change 旧列名 新列名 类型(长度) 约束;
– 作用:sex列修改为gender列
ALTER TABLE person CHANGE sex gender VARCHAR(10);
– alter table 表名 drop 列名;
– 作用:删除gender列
ALTER TABLE person DROP gender;
– rename table 表名 to 新表名;
– 作用:把person改成student表
RENAME TABLE person TO student;
– alter table 表名 character set 字符集(了解);
– 作用:修改表的字符集
ALTER TABLE student CHARACTER SET ‘utf8’;
3.DML数据操作语言
增加语句
– 给表中插入数据
/*
给student表中插入一些数据
格式: 插入指定字段的数据
insert into 表名 (字段1,字段2…) values (值1, 值2);
*/
INSERT INTO student (NAME,age) VALUES(‘貂蝉’,20);
INSERT INTO student (NAME,age) VALUES(‘柳岩’,25);
INSERT INTO student (NAME,age) VALUES(‘林志玲’,45);
SELECT * FROM student; – 查询表中的所有数据
/*
格式2: 插入全部的数据
insert into 表名 values (值1, 值2);
*/
INSERT INTO student VALUES(‘刘德华’,60);
INSERT INTO student VALUES(‘马德华’,55);
INSERT INTO student VALUES(‘马锦涛’,75);
/*
格式3:插入多条数据
insert into 表名 values (值1, 值2), (值1, 值2),(值1, 值2);
*/
INSERT INTO student VALUES (‘周润发’,60) , (‘周星驰’,66);
修改数据
– 修改语句
/*
格式:
update 表名 set 字段名1=值1 , 字段名2=值2 … where sid = ‘具体id值’
*/
ALTER TABLE student ADD sid INT(11);
– 修改sid = 2 这条数据 name修改为 刘青 年龄修改为 30
UPDATE student SET NAME=‘刘青’ ,age=30 WHERE sid = 2;
删除数据:
– 删除数据
/*
格式:
delete from 表名 where sid = 1;
*/
DELETE FROM student; – 删除所有的记录
DELETE FROM student WHERE sid = 3;
四、 SQL约束
SQL的约束:
限制,sql语句可以写什么,不可写什么
1主键约束 :
- 一个表中,我们会给一个字段设置成主键。
主键的特点:1.不能为空 2.不能重复 3.用于唯一标志一条数据
/*
1.主键约束 : 一个表中,我们会给一个字段设置成主键。
主键的特点:1.不能为空 2.不能重复 3.用于唯一标志一条数据
*/
CREATE TABLE persons
(
#第一种添加主键的方式 把pid设置成主键
pid INT PRIMARY KEY,
lastname VARCHAR(255),
firstname VARCHAR(255),
address VARCHAR(255),
city VARCHAR(255)
);
DROP TABLE persons;
CREATE TABLE persons
(
pid INT ,
lastname VARCHAR(255),
firstname VARCHAR(255),
address VARCHAR(255),
city VARCHAR(255)
);
#第二种添加主键: 表已经创建好了,添加一个主键
ALTER TABLE persons ADD PRIMARY KEY (pid);
CREATE TABLE persons
(
pid INT ,
lastname VARCHAR(255),
firstname VARCHAR(255),
address VARCHAR(255),
city VARCHAR(255),
#第三种添加主键约束
CONSTRAINT per_pk
PRIMARY KEY (pid)
);
– 测试一下主键: 1.非空 2,不重复
INSERT INTO persons VALUES(1,‘san’,‘zhang’,‘海淀’,‘北京’);
INSERT INTO persons VALUES(2,‘si’,‘li’,‘昌平’,‘北京’);
#我们也可以将两个字段都设置成主键(联合主键) 它两的组合不能重复
CREATE TABLE persons
(
pid INT ,
lastname VARCHAR(255),
firstname VARCHAR(255),
address VARCHAR(255),
city VARCHAR(255),
#第三种添加主键约束
CONSTRAINT per_pk
PRIMARY KEY (firstname,lastname)
);
#如果是联合主键:联合主键的组合不能重复
INSERT INTO persons VALUES(2,‘张’,‘三’,‘昌平’,‘北京’);
INSERT INTO persons VALUES(2,‘三’,‘张’,‘昌平’,‘北京’);
INSERT INTO persons VALUES(2,‘si’,‘li’,‘昌平’,‘北京’);
主要记住:以后用的时候都用第一种方式:
CREATE TABLE users(
uid INT PRIMARY KEY,
NAME VARCHAR(200)
);
#删除主键:
ALTER TABLE users DROP PRIMARY KEY;
2.自动增长
如果给指定的字段给了自动增长,那么插入数据的时候就算不给它给值,那也会自动添加1 2 3 4.
/*
2.自动增长
如果给指定的字段给了自动增长,那么插入数据的时候就算不给它给值,那也会自动添加1 2 3 4.
如果有指定的字段设置成自动增长有以下要求: auto_increment
1.字段类型是int类型
2.必须是主键
*/
CREATE TABLE customer (
cid INT PRIMARY KEY AUTO_INCREMENT, #是主键,并且自动增长
cname VARCHAR(200),
age INT
);
INSERT INTO customer VALUES(NULL,‘郭靖’,20);
INSERT INTO customer VALUES(NULL,‘黄蓉’,18);
INSERT INTO customer VALUES(NULL,‘郭靖’,20);
INSERT INTO customer VALUES(NULL,‘黄蓉’,18);
INSERT INTO customer VALUES(NULL,‘郭靖’,20);
INSERT INTO customer VALUES(NULL,‘黄蓉’,18);
INSERT INTO customer VALUES(NULL,‘郭靖’,20);
INSERT INTO customer VALUES(NULL,‘黄蓉’,18);
#自动增长从100索引开始
ALTER TABLE customer AUTO_INCREMENT=100
面试题:
/*
delete 与 truncate 的区别?
delete 和truncate 都是删除数据库表中的数据.
delete 把所有的数据删除掉,里面的自动增长的序号不删除,如果再添加数据,
接着上面的需要补充值;
truncate 把表干掉,重新给创建一个表. 自动增长的序号没了.
*/
CREATE TABLE customer (
cid INT PRIMARY KEY AUTO_INCREMENT, #是主键,并且自动增长
cname VARCHAR(200),
age INT
);
INSERT INTO customer VALUES(NULL,‘郭靖’,20);
INSERT INTO customer VALUES(NULL,‘黄蓉’,18);
DELETE FROM customer;
#把表中的自动增长的索引也删了
TRUNCATE TABLE customer;
3.非空约束
我们给指定的字段设置了非空约束,那么这个字段就不能给空值。 不给就报错
/*3.非空约束
我们给指定的字段设置了非空约束,那么这个字段就不能给空值。 不给就报错
*/
CREATE TABLE customer (
cid INT PRIMARY KEY AUTO_INCREMENT, #是主键,并且自动增长
cname VARCHAR(200) NOT NULL,
age INT
);
INSERT INTO customer VALUES(NULL,NULL,12); – 报错 ,cname不能为空
INSERT INTO customer VALUES(NULL,’’,12);
INSERT INTO customer VALUES(NULL,‘aa’,12);
4.唯一约束
字段内容不可以重复
/* 4.唯一约束
字段内容不可以重复
unique
*/
CREATE TABLE customer (
cid INT PRIMARY KEY AUTO_INCREMENT, #是主键,并且自动增长
cname VARCHAR(200) UNIQUE,
age INT
);
INSERT INTO customer VALUES(NULL,‘张三’,18);
INSERT INTO customer VALUES(NULL,‘张三’,19);
CREATE TABLE customer2 (
cid INT PRIMARY KEY AUTO_INCREMENT, #是主键,并且自动增长
cname VARCHAR(200) UNIQUE,
age INT,
#使用第二种方式给age设置为唯一约束
CONSTRAINT UNIQUE (age)
);
CREATE TABLE customer3 (
cid INT PRIMARY KEY AUTO_INCREMENT, #是主键,并且自动增长
cname VARCHAR(200),
age INT
);
#第三种添加唯一约束
#ALTER TABLE persons ADD [CONSTRAINT 名称] UNIQUE (Id_P)
ALTER TABLE customer3 ADD UNIQUE (cname);
5.默认约束
我们可以给一个字段设置默认值,如果添加的时候没有给值,那他就自动设置默认值。
/* 5.默认约束
我们可以给一个字段设置默认值,如果添加的时候没有给值,那他就自动设置默认值。
*/
CREATE TABLE customer4(
cid INT PRIMARY KEY AUTO_INCREMENT,
cname VARCHAR(20) DEFAULT ‘老王’,
age INT
);
INSERT INTO customer4 (cid, age) VALUES(NULL,22);
#删除默认约束
ALTER TABLE customer4 MODIFY cname VARCHAR(20);
6.外键约束
涉及多表。后天说
五、 SQL的查询语句
- 简单查询
- 条件查询
/*
条件查询:
比较运算符 < <= = = <> 大于、小于、大于(小于)等于、不等于
BETWEEN …AND… 显示在某一区间的值(含头含尾)
IN(set) 显示在in列表中的值,例:in(100,200)
LIKE ‘张pattern’ 模糊查询,Like语句中,% 代表零个或多个任意字符,_ 代表一个字符, 例如:first_name like ‘_a%’;
IS NULL 判断是否为空
and多个条件同时成立
or 多个条件任一成立
not 不成立,例:where not(salary>100);
*/
比较运算符 < <= = = <> 大于、小于、大于(小于)等于、不等于
#查询商品名称为“花花公子”的商品所有信息:
SELECT * FROM product WHERE pname=‘花花公子’;
#查询价格为800商品
SELECT * FROM product WHERE price=800;
#查询价格不是800的所有商品
SELECT * FROM product WHERE price !=800;
SELECT * FROM product WHERE price <> 800;
SELECT * FROM product WHERE NOT(price=800);
#查询商品价格大于60元的所有商品信息
SELECT * FROM product WHERE price >60;
#查询商品价格在200到1000之间所有商品
SELECT * FROM product WHERE price >= 200 AND price <=1000;
#between … and 查询一个区间的数据 (可以作为查询一个区间)
#可以查询一个时间段
SELECT * FROM product WHERE price BETWEEN 200 AND 800;
#SELECT * FROM product WHERE date BETWEEN ‘2018-11-06’ AND ‘2018-11-30’;
#查询商品价格是200或800的所有商品 or
SELECT * FROM product WHERE price = 200 OR price=800;
#如果用or 那么如果要匹配查询的数据较多,通常用in
SELECT * FROM product WHERE price IN (200,800,1,2000);
#in 删除多条数据的时候用in
DELETE FROM product WHERE price IN(200,800);
#查询含有’霸’字的所有商品
SELECT * FROM product WHERE pname LIKE ‘%霸%’; – 模糊查询
#查询以’香’开头的所有商品
SELECT * FROM product WHERE pname LIKE ‘香%’;
#查询第二个字为’想’的所有商品 占位符 _
SELECT * FROM product WHERE pname LIKE ‘_想%’;
#商品没有分类的商品 分类是null
SELECT * FROM product WHERE category_id IS NULL;
#查询有分类的商品
SELECT * FROM product WHERE category_id IS NOT NULL;
- 排序
/*
排序
order by 指定字段 [asc/desc]
asc代表的是升序
desc代表是降序
*/
SELECT * FROM product;
– 根据价格排序(从小到大 升序)
SELECT * FROM product ORDER BY price; #如果不写asc 或desc 默认是asc升序
SELECT * FROM product ORDER BY price DESC;
– 多条件排序: 先按照价格排序 (降序) 价格一样的情况下 按照id排序 (降序)
SELECT * FROM product ORDER BY price DESC , pid DESC;
#补充一个点:如果有条件查询的语句 order by 在where 的条件后面
SELECT * FROM product WHERE pid IN(1,2,3,4,5,6) ORDER BY price DESC;
4. 聚合函数
/*-
count:统计指定列不为NULL的记录行数;
sum:计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
max:计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
min:计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
avg:计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
*/
#查询商品的总条数
SELECT COUNT(*) 总条数 FROM product;
#查询价格大于200商品的总条数
SELECT COUNT(*) FROM product WHERE price > 200;
#查询分类为’c001’的所有商品的总和
SELECT SUM(price) AS 总金额 FROM product WHERE category_id = ‘c001’;
#查询分类为’c002’所有商品的平均价格
SELECT AVG(price) 分类2的均价 FROM product WHERE category_id=‘c002’;
#查询商品的最大价格和最小价格
SELECT MAX(price) 最高价 , MIN(price) 最低价 FROM product ;
5. 分组查询
/*
分组查询
SELECT 字段1,字段2… FROM 表名 where 条件查询 GROUP BY分组字段 HAVING 分组条件;
面试题: where 和having的区别是什么?
1.where条件过滤是针对于所有的查询语句. having的过滤是先分完组之后,再对分组之后的数据进行条件过滤
2.where 一般写在前面 , haviing一般写在后面
*/
– 1.统计不同分类的平均价格
SELECT category_id AS 分类 , AVG(price) 均价 FROM product GROUP BY category_id;
– 2.统计不同分类的平均价格,只显示均价大于500的数据
SELECT category_id AS 分类 , AVG(price) 均价 FROM product WHERE category_id IS NOT NULL GROUP BY category_id HAVING AVG(price) > 500;
– 如果是分组查询: 查询的字段一般是 聚合函数,或者是分组的字段
SELECT category_id, AVG(price) 均价 FROM product GROUP BY category_id;
6. 分页
/*
分页查询 : mysql的分页 limit 方言。
limit 一个数值; 查询指定条数的数据
limit 0,5; 从0索引开始查询查询5条
limit 5,5; 从5索引开始查询查询5条
*/
– 查询前5条数据
SELECT * FROM product LIMIT 5;
– 需求:一页显示5条数据 (先查询第一个页) 再查询第二页 再查询第三页.
SELECT * FROM product LIMIT 0,5;
SELECT * FROM product LIMIT 5,5;
SELECT * FROM product LIMIT 10,5;
– 计算起始页码的索引
– (当前页码-1)*每页条数