下面是代码
将代码保存后可以随时更改调用
-- 创建数据库
CREATE DATABASE mydb2;
USE mydb2;
-- 创建商品表
CREATE TABLE product(
pid int PRIMARY KEY auto_increment, -- 商品编号
pname VARCHAR(20) not null, -- 商品名字
price DOUBLE, -- 商品价格
category_id VARCHAR(20) -- 商品所属分类
);
-- 插入商品数据
INSERT INTO product VALUES(NULL,'海尔洗衣机',5000,'c001');
INSERT INTO product VALUES(NULL,'美的冰箱',3000,'c001');
INSERT INTO product VALUES(NULL,'格力空调',5000,'c001');
INSERT INTO product VALUES(NULL,'九阳电饭煲',5000,'c001');
insert into product values(null,' 啄木鸟衬衣 ',300,'c002');
insert into product values(null,' 恒源祥西裤 ',800,'c002');
insert into product values(null,' 花花公子夹克 ',440,'c002');
insert into product values(null,' 劲霸休闲裤 ',266,'c002');
insert into product values(null,' 海澜之家卫衣 ',180,'c002');
insert into product values(null,' 杰克琼斯运动裤 ',430,'c002');
insert into product values(null,' 兰蔻面霜 ',300,'c003');
insert into product values(null,' 雅诗兰黛精华水 ',200,'c003');
insert into product values(null,' 香奈儿香水 ',350,'c003');
insert into product values(null,'SK-II 神仙水 ',350,'c003');
insert into product values(null,' 资生堂粉底液 ',180,'c003');
insert into product values(null,' 老北京方便面 ',56,'c004');
insert into product values(null,' 良品铺子海带丝 ',17,'c004');
insert into product values(null,' 三只松鼠坚果 ',88,null);
-- 简单查询
#查询所有列
SELECT * FROM product;
#查询指定的列
SELECT pname,price FROM product;
#表别名 as可以省略,在多表查询有用
SELECT * FROM product as p;
#给列起别名
SELECT pname '商品名',price '商品价格' FROM product;
#去掉商品价格重复值
SELECT DISTINCT price FROM product;
SELECT DISTINCT * FROM product;
#查询结果是表达式(运算查询):将所有的商品的加价10元进行显示
SELECT pname,price + 10 new_price FROM product;
-- 运算符
#算术运算符
SELECT 6 + 2;
SELECT 6 - 2;
SELECT 6 * 2;
SELECT 6 / 2;
SELECT 6 % 2;
SELECT pname,price + 10 new_price FROM product;
SELECT pname,price * 1.1 new_price FROM product;
#逻辑运算符
-- 查询商品名称为'海尔洗衣机'的商品所有信息:
SELECT * FROM product WHERE pname = '海尔洗衣机';
SELECT * FROM product WHERE price = 800;
SELECT * FROM product WHERE price != 800;
#或者 <> 800 或者not (price = 800);这些都是等价的
SELECT * FROM product WHERE price >= 60;
#查询商品价格在200到1000之间所有商品
SELECT * FROM product WHERE price BETWEEN 200 and 1000;
SELECT * FROM product WHERE price >= 200 and price <= 1000;
SELECT * FROM product WHERE price >= 200 && price <=1000;
#查询商品价格是200或者800所有商品
SELECT * FROM product WHERE price in(200,800);
SELECT * FROM product WHERE price = 200 or price = 800;
SELECT * FROM product WHERE price = 200 || price = 800;
#查询含有'裤'字的所有商品
SELECT * FROM product WHERE pname like '%裤%'; #又来匹配任意字符 模糊匹配
#查询含有'海'字的所有商品
SELECT * FROM product WHERE pname like '海%';
#查询含有'蔻'的所有商品
SELECT * FROM product WHERE pname like '_的%';
#查询category_id为null的商品
SELECT * FROM product WHERE category_id is NULL;
#查询category_id不为null的商品
SELECT * FROM product WHERE category_id is NOT NULL;
#使用least求最小值
SELECT LEAST(10,5,20) as small_number;
SELECT LEAST(10,NULL,20);
#如果值中有null,则不会比较,结果直接为null
#使用greatest求最大值
SELECT LEAST(10,20,30) as big_number;
#位运算符
SELECT 3 & 5; #位与
0011
0101
-- --------
-- 1
SELECT 3|5; #位或 只要里面有一个是一,结果就位一
0011
0101
-- --------
-- 7
SELECT 3^5; #位异或 不同为一, 相同为零
0011
0101
-- --------
-- 6
SELECT 3>>1; #位右移
-- 0011 >> ---->0001
SELECT 3<<1; #位左移
-- 0011 << ---->0110
SELECT ~3;#位取反
-- 0011 ----> 就是将0变成1或者1变成0
#排序查询
SELECT * FROM product ORDER BY price;#默认升序
#降序
SELECT * FROM product ORDER BY price DESC;
SELECT * FROM product ORDER BY price DESC,category_id DESC;
#去重排序
SELECT DISTINCT price FROM product ORDER BY price DESC;
#聚合查询
#查询商品的总条数
SELECT COUNT(pid) FROM product;
SELECT COUNT(*) FROM product;
#查询价格大于200商品总条数
SELECT COUNT(pid) FROM product WHERE price >200;
#查询分类为'c001'的所有商品的总和
SELECT SUM(price) FROM product WHERE category_id = 'c001';
#查询商品最大价格
SELECT MAX(price) FROM product;
#查询商品最大小价格
SELECT MIN(price) FROM product;
SELECT MAX(price) max_price,MIN(price) min_price FROM product;
#查询分类为'c002'所有商品的平均价格
SELECT AVG(price) FROM product WHERE category_id = 'c002';
#聚合函数-NULL值的处理
-- count,sum,max,min,avg聚合函数都会忽视null的存在
#分组查询
#统计各个分类商品的个数
SELECT category_id,COUNT(pid) FROM product GROUP BY category_id;
#SELECT后面只能是分组的对象和聚合函数
#分组之后的条件筛选-HAVING
SELECT category_id, COUNT( pid ) FROM product GROUP BY category_id HAVING COUNT( pid ) > 4;
#分页查询
#查询表中的前5条记录
SELECT * FROM product LIMIT 5;
#从第四条显示,显示5条
-- 从第条显示-1,显示多少条。
SELECT * FROM product LIMIT 3,5;
SELECT * FROM product LIMIT 0,60 -- 第一页 (1-1) * 60
SELECT * FROM product LIMIT 60,60 -- 第二页 (2-1) * 60
SELECT * FROM product LIMIT 120,60 -- 第三页 (3-1)* 60
SELECT * FROM product LIMIT (n-1)*60,60 -- 第n页
#将一个表的数据导入到另一个表中
CREATE TABLE product2(
pname VARCHAR(20),
price DOUBLE
);
INSERT INTO product2(pname,price) SELECT pname,price FROM product;
SELECT * FROM product2;
#将每一个商品类型有多少个导入product3表中
CREATE TABLE product3(
category_id VARCHAR(20),
price_count int
);
INSERT INTO product3 SELECT category_id,COUNT(*) FROM product GROUP BY category_id;
SELECT * FROM product3;
#正则表达式查询
use mydb2;
-- ^ 在字符串中开始处进行匹配
SELECT 'abc' REGEXP '^a';
SELECT * FROM product WHERE pname REGEXP '^海';
-- $ 在字符串末尾开始匹配
SELECT 'abc' REGEXP 'a$';-- 这个就是错误的
SELECT 'abc' REGEXP 'c$';
SELECT * FROM product WHERE pname REGEXP '水$';
-- .匹配任意字符 可以匹配除了换行符外的任意字符
SELECT 'abc' REGEXP '.b'; -- 1
SELECT 'abc' REGEXP '.c'; -- 1
SELECT 'abc' REGEXP 'a.'; -- 1
-- [...] 匹配括号内的任意字符
SELECT 'abc' REGEXP '[xyz]'; -- 0
-- 正则表达式的任意字符是否在前边的字符串中出现
SELECT 'abc' REGEXP '[xyz]'; -- 1
-- [^...]
-- 注意^符合只有在[]内才能取反的意思,在别的地方都是表示开始匹配
SELECT 'a' REGEXP '[^abc]';
SELECT 'x' REGEXP '[^abc]';
SELECT 'abc' REGEXP '[^a]'; -- 除了a之外其他字符有没有在前面出现
-- a*
-- 匹配0个或者多个a个,包括空字符串。可以作为占位字符使用,有没有字符都能匹配到数据
SELECT 'stab' REGEXP 'ta*b'; -- 1
SELECT 'stb' REGEXP 'ta*b'; -- 1
SELECT '' REGEXP 'a*'; -- 1
-- a+ 匹配1个或者多个a,但是不包括空字符
SELECT 'stab' REGEXP '.ta+b';
SELECT 'stb' REGEXP '.ta+b';
-- a? 匹配0个或则1个a
SELECT 'stb' REGEXP '.ta?b'; -- 1
SELECT 'stab' REGEXP 'ta?b'; -- 1
SELECT 'staab' REGEXP 'ta?b'; -- 0
-- a1|a2 匹配a1或者a2
SELECT 'a' REGEXP 'a|b'; -- 1
SELECT 'b' REGEXP 'a|b'; -- 1
SELECT 'b' REGEXP '^(a|b)'; -- 1
SELECT 'a' REGEXP '^(a|b)'; -- 1
-- a{m} 匹配m个a
SELECT 'auuuuc' REGEXP 'au{4}c'; -- 1
SELECT 'auuuuc' REGEXP 'au{3}c'; -- 0
-- a{m,} 匹配m个a或者更多a
SELECT 'auuuuc' REGEXP 'au{4,}c'; -- 1
SELECT 'auuuuc' REGEXP 'au{5,}c'; -- 0
SELECT 'auuuuc' REGEXP 'au{3,}c'; -- 1
-- a{m,n} 匹配m到n个a, 包括m和n至少m次最多n次
SELECT 'auuuuc' REGEXP 'au{2,5}c'; -- 1
SELECT 'auuuuc' REGEXP 'au{4,5}c'; -- 1
SELECT 'auuuuc' REGEXP 'au{5,10}c'; -- 0
-- (abc) #abc作为一个序列匹配,不用括号括起来都是用单个字符去匹配,如果要把多个字符作为一个整体去匹配就需要用到括号,所以括号适合上面的所有情况。
SELECT 'xababy' REGEXP 'x(abab)y'; -- 1
SELECT 'xababy' REGEXP 'x(ab)*y'; -- 1
SELECT 'xababy' REGEXP 'x(ab){1,2}y';-- 1
SELECT 'xababy' REGEXP 'x(ab){3}y';-- 0
下面是一些mysql查询的练习题
可以自己练习一下
CREATE TABLE student ( id INT, NAME VARCHAR ( 20 ), gender VARCHAR ( 20 ), chinese INT, english INT, math INT );
INSERT INTO student ( id, NAME, gender, chinese, english, math )
VALUES
( 1, '张明', '男', 89, 78, 90 );
INSERT INTO student ( id, NAME, gender, chinese, english, math )
VALUES
( 2, '李进', '男', 67, 53, 95 );
INSERT INTO student ( id, NAME, gender, chinese, english, math )
VALUES
( 3, '王五', '女', 87, 78, 77 );
INSERT INTO student ( id, NAME, gender, chinese, english, math )
VALUES
( 4, '李一', '女', 88, 98, 92 );
INSERT INTO student ( id, NAME, gender, chinese, english, math )
VALUES
( 5, '李财', '男', 82, 84, 67 );
INSERT INTO student ( id, NAME, gender, chinese, english, math )
VALUES
( 6, '张宝', '男', 55, 85, 45 );
INSERT INTO student ( id, NAME, gender, chinese, english, math )
VALUES
( 7, '黄蓉', '女', 75, 65, 30 );
INSERT INTO student ( id, NAME, gender, chinese, english, math )
VALUES
( 7, '黄蓉', '女', 75, 65, 30 );
SELECT
*
FROM
student;
SELECT NAME
,
english
FROM
student;
SELECT DISTINCT
*
FROM
student;
SELECT NAME
,
chinese + english + math '总分'
FROM
student;
SELECT NAME
,
chinese + english + math + 10 '总分+特长分'
FROM
student;
SELECT
chinese '语文',
english '英语',
math '数学'
FROM
student;
SELECT NAME
,
chinese + english + math '总分'
FROM
student
HAVING
总分 > 200;
SELECT NAME
,
english
FROM
student
WHERE
english BETWEEN 80
AND 90;
SELECT NAME
,
english
FROM
student
WHERE
english NOT BETWEEN 80
AND 90;
SELECT
*
FROM
student
WHERE
math IN ( 89, 90, 91 );
SELECT
*
FROM
student
WHERE
math NOT IN ( 89, 90, 91 );
SELECT NAME
,
english
FROM
student
WHERE
NAME LIKE '李%';
SELECT
*
FROM
student
WHERE
math = 80
AND chinese = 80;
SELECT
*
FROM
student
WHERE
NAME LIKE '李%'
ORDER BY
( chinese + math + english ) DESC;
SELECT
gender,
count(*) '总数'
FROM
student
GROUP BY
gender
HAVING
总数 > 3
ORDER BY
总数 DESC;
CREATE TABLE emp (
empno INT,-- 员工的编号
ename VARCHAR ( 50 ),-- 员工的名字
job VARCHAR ( 50 ),-- 工作名字
mgr INT,-- 上级领导编号
hiredate DATE,-- 入职日期
sal INT,-- 薪资
comm INT,-- 奖金
deptno INT -- 部门编号
);
INSERT INTO emp
VALUES
( 7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, NULL, 20 ),
( 7499, 'ALEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30 ),
( 7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30 ),
( 7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, NULL, 20 ),
( 7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30 ),
( 7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, NULL, 30 ),
( 7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, NULL, 10 ),
( 7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3000, NULL, 20 ),
( 7839, 'KING', 'PRESIDENT', NULL, '1981-11-17', 5000, NULL, 10 ),
( 7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500, 0, 30 ),
( 7876, 'ADAMS', 'CLERK', 7788, '1987-05-23', 1100, NULL, 20 ),
( 7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, NULL, 30 ),
( 7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, NULL, 20 ),
( 7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, NULL, 10 );
SELECT
*
FROM
emp
WHERE
deptno != 10
ORDER BY
empno ASC;#查询姓名第二个字母不是“A”且薪水大于1000元的员工信息,按年薪降序排列
#年薪:12 * 月薪 + 奖金
#ifnull(comm,0) 如果comm的值为null,则当作0,不为null,则还是原来的值
SELECT
*
FROM
emp
WHERE
ename NOT LIKE '_A%'
AND sal > 1000
ORDER BY
(
12 * sal + IFNULL( comm, 0 )) DESC;
#求每个部门的平均薪水
SELECT deptno,AVG(sal) FROM emp GROUP BY deptno;
# 求各个部门的最高薪水
SELECT deptno, MAX(sal) '最高薪水' FROM emp GROUP BY deptno;
#求每个部门的最高薪水
SELECT deptno,job, MAX(sal) FROM emp GROUP BY deptno,job;
代码可以直接复制
如果有啥问题可以问我看到一定会回复大家,如果大家喜欢可以作者点赞和关注
大家的支持是我创作下去的最大动力!