# 创建数据库 CREATE DATABASE test; CREATE DATABASE IF NOTEXISTS test; CREATE DATABASE IF NOTEXISTS test DEFAULTCHARACTERSET utf8mb4 COLLATE utf8mb4_0900_ai_ci; # 删除数据库 DROP DATABASE test; DROP DATABASE IF EXIT test;
# 修改数据库的字符集和排序规则 ALTER DATABASE test CHARACTERSET= utf8 COLLATE= utf8_unicode_ci;
# 创建一张表 CREATETABLE IF NOTEXISTS `users`( id INTPRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) NOTNULL, age INTDEFAULT0, telPhone VARCHAR(20) DEFAULT''UNIQUENOTNULL );
# 删除数据表 DROPTABLE users; DROPTABLE IF EXISTS users;
CREATETABLE IF NOTEXISTS `products` ( id INTPRIMARY KEY AUTO_INCREMENT, brand VARCHAR(20), title VARCHAR(100) NOTNULL, price DOUBLENOTNULL, score DECIMAL(2,1), voteCnt INT, url VARCHAR(100), pid INT );
基本查询
1 2 3 4 5 6 7 8
# 查询所有的数据并且显示所有的字段 SELECT*FROM `products`;
# 查询title、brand、price SELECT title, brand, price FROM `products`;
# 给字段起别名:别名一般在多张表或者给客户端返回对应的key时会使用到 SELECT title as t, brand as b, price as p FROM `products`;
WHERE条件查询(比较运算符)
1 2 3 4 5 6 7 8 9 10
# 查询价格小于1000的手机 SELECT*FROM `products` WHERE price <1000; # 查询价格大于等于2000的手机 SELECT*FROM `products` WHERE price >=2000; # 价格等于3399的手机 SELECT*FROM `products` WHERE price =3399; # 价格不等于3399的手机 SELECT*FROM `products` WHERE price !=3399; # 查询华为品牌的手机 SELECT*FROM `products` WHERE `brand` ='华为';
WHERE条件查询(逻辑运算符)
1 2 3 4 5 6 7 8 9 10 11 12
# 查询品牌是华为,并且小于2000元的手机 SELECT*FROM `products` WHERE `brand` ='华为'and `price` <2000; SELECT*FROM `products` WHERE `brand` ='华为'&& `price` <2000; # 查询1000到2000的手机(不包含1000和2000) SELECT*FROM `products` WHERE price >1000and price <2000; # OR: 符合一个条件即可 # 查询所有的华为手机或者价格小于1000的手机 SELECT*FROM `products` WHERE brand ='华为'or price <1000; # 查询1000到2000的手机(包含1000和2000) SELECT*FROM `products` WHERE price BETWEEN1000and2000; # 查看多个结果中的一个 SELECT*FROM `products` WHERE brand in ('华为', '小米');
WHERE条件查询(模糊查询)
模糊查询使用LIKE关键字,结合两个特殊的符号
%表示匹配任意个的任意字符
_表示匹配一个的任意字符
1 2 3 4 5 6
# 查询所有以v开头的title SELECT*FROM `products` WHERE title LIKE'v%'; # 查询带M的title SELECT*FROM `products` WHERE title LIKE'%M%'; # 查询带M的title必须是第三个字符 SELECT*FROM `products` WHERE title LIKE'__M%';
查询结果排序
当查询到结果的时候,希望将结果按照某种方式进行排序,这个时候使用的是ORDER BY
RDER BY有两个常用的值
ASC:升序排列
DESC:降序排列
1
SELECT*FROM `products` WHERE brand ='华为'or price <1000ORDERBY price ASC;
CREATETABLE IF NOTEXISTS `products` ( id INTPRIMARY KEY AUTO_INCREMENT, brand VARCHAR(20), title VARCHAR(100) NOTNULL, price DOUBLENOTNULL, score DECIMAL(2,1), voteCnt INT, url VARCHAR(100), pid INT );
2.1.MySQL聚合函数
聚合函数表示对值的集合进行操作的组(集合)函数
1 2 3 4 5 6 7 8 9 10 11 12 13
# 华为手机价格的平均值 SELECTAVG(price) FROM `products` WHERE brand ='华为'; # 计算所有手机的平均分 SELECTAVG(score) FROM `products`; # 手机中最低和最高分数 SELECTMAX(score) FROM `products`; SELECTMIN(score) FROM `products`; # 计算总投票人数 SELECTSUM(voteCnt) FROM `products`; # 计算所有条目的数量 SELECTCOUNT(*) FROM `products`; # 华为手机的个数 SELECTCOUNT(*) FROM `products` WHERE brand ='华为';
SELECT brand, COUNT(*) as count, ROUND(AVG(price), 2) as avgPrice, MAX(price) as maxPrice, MIN(price) as minPrice, AVG(score) as avgScore FROM `products` GROUPBY brand;
Group By的约束条件
如果希望给Group By查询到的结果添加一些约束,那么可以使用:HAVING。
1 2 3 4 5 6 7 8 9
# 希望筛选出平均价格在4000以下,并且平均分在7以上的品牌 SELECT brand, COUNT(*) as count, ROUND(AVG(price), 2) as avgPrice, MAX(price) as maxPrice, MIN(price) as minPrice, AVG(score) as avgScore FROM `products` GROUPBY brand HAVING avgPrice <4000and avgScore >7;
2.2.MySQL的外键约束
假如在上面的商品表中,对应的品牌还需要包含其他的信息
比如品牌的官网,品牌的世界排名,品牌的市值等等
如果直接在商品中去体现品牌相关的信息,会存在一些问题
一方面,products表中应该表示的都是商品相关的数据,应该又另外一张表来表示brand的数据
另一方面,多个商品使用的品牌是一致时,会存在大量的冗余数据
所以,可以将所有的品牌数据,单独放到一张表中,创建一张品牌的表
1 2 3 4 5 6 7 8 9 10 11 12 13
# 创建brand表 CREATETABLE IF NOTEXISTS `brand`( id INTPRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) NOTNULL, website VARCHAR(100), worldRank INT );
SQL规范中全连接是使用FULL JOIN,但是MySQL中并没有对它的支持,我们需要使用 UNION 来实现
1 2 3
(SELECT*FROM `products` LEFTJOIN `brand` ON `products`.brand_id = `brand`.id) UNION (SELECT*FROM `products` RIGHTJOIN `brand` ON `products`.brand_id = `brand`.id);
1 2 3
(SELECT*FROM `products` LEFTJOIN `brand` ON `products`.brand_id = `brand`.id WHERE `brand`.id ISNULL) UNION (SELECT*FROM `products` RIGHTJOIN `brand` ON `products`.brand_id = `brand`.id WHERE `products`.id ISNULL);
2.5.多对多数据查询语句
多对多的关系的案例
比如学生可以选择多门课程,一个课程可以被多个学生选择
建立两张表
1 2 3 4 5 6 7 8 9 10 11 12 13
# 创建学生表 CREATETABLE IF NOTEXISTS `students`( id INTPRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) NOTNULL, age INT );
# 创建课程表 CREATETABLE IF NOTEXISTS `courses`( id INTPRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) NOTNULL, price DOUBLENOTNULL );