数据库(Database)
数据库专门用来存储数据的仓库,本质就是一个文件系统,按照一定的格式将数据存储起来
方便用户对数据进行增删改查操作(CRUD create retrieve update delete )
数据库管理系统(DBMS:DataBase Management System)
a. 专门用来建立,使用,管理,维护数据库的大型软件
用户就是通过DBMS来操作数据库
b. 常见DBMS
MySQL:开源免费的数据库,目前已经被Oracle收购,MySQL6.x开始收费
Oracle:收费大型数据库,Oracle(甲骨文)公司的产品
SQLServer:微软公司收费的中型数据库,结合C#编程语言使用
SQLite:嵌入式的小型数据库,Android开发使用的数据库
DB2:IBM公司数据库管理系统,收费,主要用在银行
Java常用的数据库:MySQL,Oracle(甲骨文)
Mysql的客户端
a.命令行的客户端
1.完整写法:mysql -u root -p123456 -h 127.0.0.1 -P 3306
-u:用户名 安装时内置的就是root
-p:安装时设置的密码
-h:连接哪台机器上mysql 127.0.0.1代表本机上的mysql,也可以为localhost
-P:3306 代表连接3306端口号对应的mysql服务端
2.简写: mysql -u root -p123456
默认连接的是本机上的3306端口的Mysql服务端
b.图形化界面的客户端
1.日常开发使用的是navicat
2.mysql在安装好的时候默认不允许进行远程连接
a.连接mysql进行授权:grant all on *.* to root@'%' identified by '123456' with grant option;
flush privileges;
b.重新启动mysql服务,才能生效
SQL语句
专门用来操作数据的结构化查询语言(Structured Query Language)
SQL分类
1.数据定义语言(DDL:data definition language),用来定义数据库,表定义,表中列定义等操作(create,alter,drop……)
a.DDL语句操纵表
-- 创建一张表
CREATE TABLE 表名{
列名1 类型 [约束] #约束可写可不写
列名2 类型 [约束]
}
-- 修改表结构
在表中添加一列: ALTER TABLE 表名 ADD 列名 类型 [约束];
修改列的类型: ALTER TABLE 表名 MODIFY 列名 新的类型 [新的约束];
修改列的名字: ALTER TABLE 表名 CHANGE 旧列名 新列名 类型 [约束];
删除指定的列: ALTER TABLE 表名 DROP 列名;
修改表名: RENAME TABLE 旧表名 TO 新表名;
删除表:DROP TABLE 表名
2.数据操作语言(DML:Data Manipulation Language):用来对表中的记录进行更新,插入操作,删除数据操作,更新数据操作等(insert,delete,update) 字段名=列名
a.向表中插入数据
-- INSERT INTO 表名(字段名1,字段名2,.....) VALUES ('值1','值2',......)
值和字段是一一对应的
-- INSERT INTO 表名 VALUES ('值1','值2',......)
由于没有指定字段,所以插入的值默认从第一列开始
-- INSERT INTO 表名[(字段名1,字段名2,.....)] VALUES ('值1','值2',......),('值1','值2',......),..... 批量插入,一次性插入多行数据
-- 解决表中不能插入中文的问题
1.先查看表的定义信息:包含表使用的字符集,将表的字符集修改为UTF-8即可,其他码表不识别中文,所以不能插入中文
修改表的字符集为UTF-8:
ALTER TABLE student CONVERT TO CHARACTER SET utf8;
b.更新表中的数据
UPDATE 表名 SET 字段名1=值1,字段名2=值2,..... [WHERE 条件]
c.删除表中的数据
DELECT FROM 表名 [WHERE条件]
3. 数据控制语言(DCL):Data Contorl Language,用来定义数据库访问权限和安全级别等操作
4. 数据查询语言(DQL):Data Query Language,用来查询数据库中的表记录
关键字:select from where 等
/*
查询语法:
SELECT [DISTINCT] * | 列名 1,列名 2,....
FROM 表名
[WHERE 条件]
*/
# 1.不带 where 条件查询
#查询所有的商品.
SELECT * FROM product; -- 查询 product 表中所有列
#查询商品名和商品价格.
SELECT pname,price FROM product;
#别名查询.使用的关键字是 as(as 可以省略的).表别名:
SELECT p.price FROM product AS p;
SELECT p.price FROM product p;
#别名查询.使用的关键字是 as(as 可以省略的).列别名:
SELECT pname AS '商品名称' FROM product; -- 可以改变查询结果的列名
SELECT pname '商品名称' FROM product;
#去掉价格重复值.
SELECT DISTINCT price FROM product;
#-------------------------------------------------------------------------------
#2.带 where 条件查询
#查询商品名称为'JEEP 男士衬衫'的商品所有信息:
SELECT * FROM product WHERE pname='JEEP 男士衬衫';
#查询价格为 5999 的商品
SELECT * FROM product WHERE price='5999';
SELECT * FROM product WHERE price= 5999;
#查询价格不等于 5999 的商品
SELECT * FROM product WHERE price != 5999;
SELECT * FROM product WHERE price <> 5999; -- <> 表示不等于
#查询价格在[1000,3000]之间的商品
SELECT * FROM product WHERE price>=1000 AND price<=3000;
SELECT * FROM product WHERE price BETWEEN 1000 AND 3000; -- BETWEEN 值 1 AND 值 2 表示[值 1,
值 2]
#查询商品价格是 5999 或 340 的所有商品
SELECT * FROM product WHERE price=5999 OR price=340;
SELECT * FROM product WHERE price in (5999,340); -- in (值 1,值 2,值 3,....) 满足其中一个值就作为结果
显示
#3.模糊查询
# 模糊匹配关键字 LIKE
/*
%:匹配任意多个字符
_:匹配单个任意字符
*/
#查询商品名中含有'男士'的所有商品
SELECT * FROM product WHERE pname LIKE '%男士%';
#查询以'花花公子'开头的所有商品
SELECT * FROM product WHERE pname LIKE '花花公子%';
#查询第二个字为'想'的所有商品
SELECT * FROM product WHERE pname LIKE '_想%';
#4.带有 NULL 查询
#查询商品表中没有分类的商品
SELECT * FROM product WHERE category_name IS NULL;
#查询有分类的商品
SELECT * FROM product WHERE category_name IS NOT NULL;
#5.排序查询
/*
SELECT [DISTINCT] * | 列名 1,列名 2,....
FROM 表名
[WHERE 条件]
[ORDER BY 排序字段 1,排序字段 2,.... ASC|DESC]
默认是 ASC
*/
#查询商品价格升序结果
SELECT * FROM product ORDER BY price ASC;
SELECT * FROM product ORDER BY price;
#查询商品价格降序结果
SELECT * FROM product ORDER BY price DESC;
#查询商品的价格(去除重复价格),并降序排序
SELECT DISTINCT
price
FROM
product
ORDER BY
price DESC;
#6.聚合查询
/*
常用的聚合函数:
count 函数:统计表中所有行数
如果 count 统计某一列值的总数,不包含 NULL 值
sum 函数:计算指定列所有值的和
max 函数与 min 函数:可以获取指定列的最大值和最小值
avg 函数:可以获取指定列的平均值
*/
#查询商品的总条数
SELECT COUNT(*) '商品总数' FROM product;
#查询商品的总分类数(不计算 null 值,但是计算重复值)
SELECT COUNT(category_name) '商品分类总数' FROM product;
SELECT COUNT(p.category_name) FROM
(SELECT DISTINCT category_name FROM product) p -- 去除种类中的 NULL值,并且去除重复,最后再做
统计
#查询价格大于 1000 商品的总条数
SELECT COUNT(*) FROM product WHERE price>1000;
#计算所有商品的总价
SELECT SUM(price) '商品总价' FROM product;
#查询分类名称为男装所有商品的平均价格
SELECT AVG(price) FROM product WHERE category_name = '男装';
#查询商品的最大价格和最小价格
SELECT MAX(price) FROM product;
SELECT MIN(price) FROM product;
#7.分组查询
/*
SELECT [DISTINCT] * | 列名 1,列名 2,....
FROM 表名
[WHERE 条件]
[GROUP BY 列名 1,列名 2,...]
[HAVING 条件]
[ORDER BY 排序字段 1,排序字段 2,.... ASC|DESC]
默认是 ASC
*/
#统计每个商品种类对应的商品总数
/*
1.通过 WHERE 进行条件过滤
2.通过 GROUP BY 对相同的种类进行分组
3.最后针对每组进行 COUNT(*) 聚合
*/
SELECT category_name,COUNT(*) FROM product
WHERE category_name IS NOT NULL
GROUP BY category_name;
/*
1.通过 GROUP BY 对相同的种类进行分组
2.对分组后的结果通过 HAVING 条件过滤
3.对过滤后的每组进行 COUNT(*)聚合
*/
SELECT category_name,COUNT(*) FROM product
GROUP BY category_name
HAVING category_name IS NOT NULL;
#统计每个商品种类对应的商品总数,并且商品总数>=3
SELECT category_name,COUNT(*) FROM product
GROUP BY category_name
HAVING category_name IS NOT NULL AND COUNT(*)>=3;
多表查询
| 的意思是或
- 交叉查询(笛卡尔积):SELECT *|字段1,字段2,... FROM 表名1,表名2,....
- 内连接查询:① SELECT *|字段1,字段2,.... FROM 表名1,表名2,... WHERE 条件
②ELECT *|字段1,字段2,.... FROM A INNER JOIN B ON 条件 [WHERE 条件]
- 外连接查询:①左外连接:SELECT * | 字段1,字段2,... FROM A LEFT OUTER JOIN B ON
条件 [WHERE 条件]
②右外连接: SELECT * | 字段1,字段2,... FROM A LEFT OUTER JOIN B ON 条件 [WHERE 条件]
- 嵌套查询:SELECT pname FROM product WHERE pid IN
(SELECT uid FROM `user` WHERE username='zhangsan');