基本的SQL语句

– 数据库的操作
– 连接数据库
mysql -uroot -p;

-- 退出数据库
quit;
exit;
ctrl + D;

-- 显示数据库版本
SELECT VERSION();

-- 显示时间
SELECT NOW();

-- 查看所有数据库
SHOW DATABASES;

-- 创建数据库
CREATE DATABASE 数据库名  CHARSET="utf8";

-- 查看创建数据库的语句
SHOW CREATE DATABASE 数据库名; 

-- 查看当前使用的数据库
SELECT DATABASE();

-- 使用数据库
USE 数据库名;

-- 删除数据库
DROP DATABASE 数据库名;

– 数据表的操作
– 查看当前数据库中所有的表
SHOW TABLES;

-- 创建表
-- auto_increment表示自动增长
-- not null 表示不能为空
-- primary key 表示主键
-- default 表示默认值
CREATE TABLE 数据表名 (字段 类型 约束, ...);

-- 创建students表(id, name,age, height, gender, cls_id)
CREATE TABLE students (
	id int unsigned not null auto_increment primary key,
	name varchar(20),
	age tinyint unsigned default 0,
	height decima(5, 2),
	gender enmu("男", "女", "中性", "保密") default "保密",
	cls_id int unsigned,
	is_detele bit(1) default 0
	)

-- 查看表的创建语句
SHOW CREATE TABLE students;

-- 查看表结构
SELECT * FROM 数据表名;

-- 修改表结构-添加字段
ALTER TABLE 数据表名 ADD 字段 类型;

-- 修改表结构-修改字段:不重命名版
ALTER TABLE 数据表名 MODIFY 字段 类型及约束;

-- 修改表结构-修改字段:重命名表
ALTER TABLE 数据表名 CHANGE 源字段 新字段 类型及约束;

-- 修改表结构-删除字段
ALTER TABLE 数据表名 DROP 字段;

-- 删除表
DROP TABLE 数据表名;

– 数据表的数据操作
– 增删改查(curd)
– 增加
– 全插入
– 主键字段可以用0, null, default 来占位
INSERT INTO 数据表名 VALUES (字段1值, 字段2值, …);

	-- 部分记录插入
	INSERT INTO 数据表名 字段 values (值);

	-- 多条记录插入
	INSERT INTO 数据表名 (字段1, 字段2, ...) values (值1, 值2, ...);

-- 修改
	-- 全部记录同时修改
	UPDATE 数据表名 SET 字段1=值1;

	-- 部分记录修改
	UPDATE 数据表名 SET 字段1=值1 WHERE 条件;

	-- 多条记录修改
	UPDATE 数据表名 SET 字段1=值1, 字段2=值2, ... WHERE 条件;

-- 删除实际开发一般不会删除数据
	-- 物理删除记录(即彻底删除)
	DELETE FROM 数据表名 WHERE 条件;

	-- 逻辑删除记录(即标记删除)
	-- 用一个字段来表示 这条记录已经不能再使用 0表示没删,1表示已删除
	ALTER TABLE 数据表名 ADD 标记字段 类型 约束;
	例如:ALTER TABLE students ADD is_detele bit(1) default 0;
	UPDATE students SET is_detele=1 WHERE id=1;


-- 查询基本使用
	-- 查询所有记录
	SELECT * FROM 数据表名;

	-- 指定条件查询
	SELECT * FROM 数据表名 WHERE 条件;

	-- 查询指定字段记录
	SELECT 字段1, 字段2, ... FROM 数据表名;

	-- 字段的顺序
	DESC 数据表名;

	-- 可以使用as为字段或表指定别名
	SELECT 字段1 as 别名1, 字段2 as 别名2, ... FROM 数据表3 as 别名3;

– 查询
– 查询所有字段
SELECT * FROM students
SELECT * FROM classes

-- 查询自定字段
SELECT name, age FROM students;
SELECT name FROM classes;

--使用 as给字段起别名
SELECT name as 姓名, age as 年龄 FROM students;
SELECT name as 班级名 FROM classes;

-- 可以通过 as 给表其别名
SELECT 学生.name, 学生.name FROM students as 学生;
SELECT 班级.name as 班级名 FROM classes as 班级;

-- 消除重复行 字段:distinct
SELECT distinct gender FROM students;

– 条件查询
– 比较运算符
– SELECT … FROM 表名 where …
– >
– 查询大于18岁的信息
SELECT * FROM students WHERE age > 18;

	-- <
	-- 查询小于18岁的信息
	SELECT * FROM students WHERE age < 18;

	-- =
	-- 查询等于18岁的信息
	SELECT * FROM students WHERE age = 18;


	-- >= 大于等于
	-- <= 小于等于

	-- != 或者 <> 不等于


-- 逻辑运算符
	-- and
	-- 18到28之间的所有学生信息
	SELECT * FROM students WHERE age >18 AND age <28 ;

	-- 18岁以上的女性
	SELECT * FROM students WHERE age > 18 AND gender=2; 

	-- or
	-- 18岁以上或者身高超过180(包含)以上
	SELECT * FROM students WHERE age > 18 or height >= 180;

	-- not 
	-- 不在18岁以上女性这个范围内的信息
	SELECT * FROM students WHERE not (age > 18 AND gender = 2);

	-- 年龄不是小于或者等于18 并且是女性
	SELECT * FROM students WHERE (not age <= 18) AND gender =2;


-- 模糊查询
	-- like
	-- % 替换1个或者多个或者没有
	-- _替换1个
	-- 查询姓名中 以“小”开始的名字
	SELECT * FROM students WHERE name like "小%";

	--查询姓名中 有“小”所有的名字
	SELECT * FROM students WHERE name like "%小%";

	-- 查询有2个字的名字
	SELECT * FROM students WHERE name like "__";

	-- rlike 正则
	-- 查询以周开始的名字
	SELECT * FROM students WHERE name rlike "^周.*";

	-- 查询以 周开始、伦结尾的姓名
	SELECT * FROM students WHERE name rlike "^周.*伦$";


-- 范围查询
	-- in(1, 3, 8)表示在一个非连续的范围内
	-- 查询 年龄为18,14的姓名
	SELECT * FROM students WHERE age IN (18, 34);

	-- not in 不非连续的范围之内
	-- 年龄不是 18,14之间的信息
	SELECT * FROM students WHERE age not IN (18, 34);

	-- between ... and ... 表示在一个连续的范围内
	-- 查询 年龄在18到34之间的信息
	SELECT * FROM students WHERE age BETWEEN 18 AND 34;

	-- not between ... and ... 表示不在一个连续的范围内
	-- 查询 年龄不在18到34之间的信息
	SELECT * FROM students WHERE age NOT BETWEEN 18 AND 34;
	SELECT * FROM students WHERE NOT age BETWEEN 18 AND 34;

– 空判断
– 判空 is null
– 查询身高为空的信息
SELECT * FROM students WHERE height IS NULL;

-- 判非空 is not null
SELECT * FROM students WHERE height IS NOT NULL;

– 排序
– order by 字段
– asc从小到大排列,即升序(默认)
– desc从大到小排列,即降序
– 查询年龄在18到34岁之间的男性,按照年龄从小到大排序
SELECT * FROM students WHERE (age BETWEEN 18 AND 34) AND gender =1 order by age;

-- 查询年龄在18到34岁之间的女性,按照身高从高到矮排序
SELECT * FROM students WHERE (age BETWEEN 18 AND 34) AND gender = 2 order by height DESC;

-- order by 多个字段
-- 查询年龄在18到34岁之间的女性,身高从高到矮,如果身高相同的情况下按照年龄从小到大排序
SELECT * FROM students WHERE (age BETWEEN 18 AND 34) AND gender = 2 order by height DESC, age;

-- 查询年龄在18到34岁之间的女性,身高从高到矮,如果身高相同的情况下按照年龄从小到大排序,如果年龄也相同那么按照id从大到小排序
SELECT * FROM students WHERE (age BETWEEN 18 AND 34) AND gender = 2 order by height DESC, age, id DESC;

-- 按照年龄从小到大、身高从高到矮排序
SELECT * FROM students order by age, height DESC;

–聚合函数
– 总数
– count
– 查询男性有多少人,女性有多少人
SELECT COUNT() as “男性人数” FROM students WHERE gender = 1;
SELECT COUNT(
) as “女性人数” FROM students WHERE gender = 2;

-- 最大值
-- max
-- 查询最大的年龄
SELECT MAX(age) as "最大年龄" FROM students;

-- 查询女性的最高身高
SELECT MAX(height) as "身高最高的女性" FROM students WHERE gender = 2;
-- 查询女性的最高身高并显示其他信息
SELECT *, MAX(height) as "身高最高的女性" FROM students WHERE gender = 2;

-- 最小值
-- min

-- 求和
-- sum
-- 计算所有人的年龄总和
SELECT sum(age) as "所有人的年龄总和" FROM students;

-- 平均值
-- avg
-- 计算平均年龄
SELECT avg(age) as "所有人的年龄总和" FROM students;

-- 计算平均年龄 sum(age)/count(*)
-- 言外之意是SELECT ... FROM 之间可以放表达式、函数、字段
SELECT sum(age)/count(*) as "所有人的年龄总和" FROM students;


-- 四舍五入 round(123.23 , 1)保留1位小数
-- 计算所有人的平均年龄,保留2位小数
SELECT round(avg(age), 2) as "所有人的年龄总和" FROM students;

-- 计算男性的平均身高,保留2位小数
SELECT round(avg(height), 2) as "男性的平均身高" FROM students WHERE gender = 1;

– 分组
– group by
– 按照性别分组,查询所有的性别
SELECT gender FROM students group by gender;

-- 计算每种性别中的人数
SELECT gender, count(*) FROM students group by gender;

-- 计算每种性别中填写了身高的总人数以及最高身高
SELECT gender, count(height), height FROM students group by gender;

-- 计算男性的人人数
SELECT gender,count(*) FROM students WHERE gender=1 group by gender;

-- group_concat(...)
-- 查询同种性别中的姓名
SELECT gender,count(*),group_concat(name) FROM students WHERE gender=1 group by gender;

-- 查询同种性别中的姓名,身高,id
SELECT gender,count(*),group_concat(name,"_", height," ", id) FROM students WHERE gender=1 group by gender;

-- having
-- 查询平均年龄超过30岁的性别,以及姓名 having avg(age) > 30
SELECT gender, group_concat(name), avg(age) FROM students group by gender having avg(age) > 30;

-- 查询每种性别中的人数多于2个的信息
SELECT gender, group_concat(name),count(*) FROM students group by gender having count(*) > 2;

– 分页
– limit, start, count
– 查询前5个数据
SELECT * FROM students WHERE gender=1 LIMIT 5;

-- 查询id6-10(包含)的数据
SELECT * FROM students WHERE id BETWEEN 6 AND 10 LIMIT 5;

-- 每页显示2个,第1个页面
SELECT * FROM students LIMIT 0, 2;

-- 每页显示2个,第2个页面
SELECT * FROM students LIMIT 2, 2;

-- 每页显示2个,第3个页面
SELECT * FROM students LIMIT 4, 2;

-- 每页显示2个,第4个页面
SELECT * FROM students LIMIT 6, 2;

-- 每页显示2个,显示第6页的信息,按照年龄从小到大排序
-- 错误:SELECT * FROM students LIMIT 2*(6-1), 2;
-- 错误:SELECT * FROM students 10,2 order by age asc;
SELECT * FROM students ORDER BY age LIMIT 10, 2;

-- 查询所有的女性信息,按照身高从高到矮倒序,只显示2个
SELECT * FROM students WHERE gender=2 ORDER BY height DESC LIMIT 2;

– 连接查询
– inner join … on
– 合并两个表
SELECT * FROM students INNER JOIN classes

-- 查询 有能够应对班级的学生以及班级信息
SELECT * FROM students INNER JOIN classes ON students.cls_id=classes.id;

-- 按照要求显示姓名、班级
SELECT students.name, classes.name FROM students INNER JOIN classes ON students.cls_id=classes.id;

-- 给数据表起名字
SELECT s.name, c.name FROM students as s INNER JOIN classes as c ON s.cls_id=c.id;

-- 查询 有能够应对班级的学生以及班级信息,显示学生的所有信息,只显示班级名称
SELECT s.*, c.name FROM students as s INNER JOIN classes as c ON s.cls_id=c.id;

-- 在以上的查询中,将班级姓名显示在第1列
SELECT c.name,s.* FROM students as s INNER JOIN classes as c ON s.cls_id=c.id;

-- 查询 有能够对应班级的学生以及班级信息,按照班级进行排序
SELECT c.name,s.* FROM students as s INNER JOIN classes as c ON s.cls_id=c.id ORDER BY c.id;

-- 当同时有一个班级的时候,按照学生的id进行从小到大排序
SELECT c.name,s.* FROM students as s INNER JOIN classes as c ON s.cls_id=c.id ORDER BY c.id, s.id;


-- left join
-- 查询每位学生对应的班级信息
SELECT * FROM students as s LEFT JOIN classes as c ON s.cls_id=c.id;

-- 查询没有对应班级信息的学生
SELECT * FROM students as s LEFT JOIN classes as c ON s.cls_id=c.id HAVING c.id IS NULL;

-- right join  on
-- 将数据表名字互换位置,用left join完成

– 自关联
– 省级联动

-- 查询所有省份
SELECT * FROM areas WHERE province IS NOT NULL;
SELECT * FROM areas WHERE num=0;

-- 查询出广东省有哪些市
SELECT p.province, c.city FROM areas AS p INNER JOIN areas AS c ON c.p_id=p.id HAVING p.province="广东省";

-- 查询出广州市有哪些区
SELECT c.city, a.area FROM areas AS c INNER JOIN areas AS a ON a.c_id=c.id HAVING c.city="广州市";

– 自查询
– 标量子查询
– 查询出高于平均身高的记录
SELECT * FROM students WHERE height > (SELECT avg(height) FROM students);

-- 查询最高的男生记录
SELECT * FROM students WHERE height = (SELECT MAX(height) FROM students WHERE gender=1);

SELECT *, MAX(height) FROM students WHERE gender=1;

-- 列级子查询
-- 查询学生的班级号能够对应的学生记录
SELECT * FROM students WHERE cls_id <= (SELECT max(classes.id) FROM classes);

SELECT * FROM students INNER JOIN classes ON students.cls_id=classes.id;

– 外键
– 把 数据表1的字段1 关联到 数据表2的字段2
ALTER TABLE 数据表名1 ADD FOREIGN KEY (字段1) REFERENCES 数据表名2(字段2);

-- 清除外键约束
-- SHOUW CREATE TABLE 数据表名 使用这条语句查询外键名称
ALTER TABLE goods DROP FOREIGN KEY 外键名称;

–索引
– 创建索引
CREATE INDEX 索引名称 ON 数据表名(字段名称(长度));

-- 查看索引
SHOW INDEX FROM 数据表名;

-- 删除索引
DROP INDEX 索引名称 ON 表名;

– 备份
– 备份一个数据库数据
mysqldump -uroot -p 数据库名 > 文件名.sql

– 导入
– 导入一个数据库数据
CREATE DATABASE 新数据库名;
然后退出,执行以下命令
mysql -uroot -p 新数据库名 < 文件名.sql

-- 导入数据表
-- 在选定数据库的前提下,执行下面语句
soucer 文件名.sql;

-- 显示当前使用的数据库
select database();


CREATE TABLE goods(
	id int unsigned primary key auto_increment not NULL, 
	name varchar(150) not null, 
	cate_name varchar(40) not null, 
	brand_name varchar(40) not null, 
	price decimal(10, 3) not null default 0, 
	is_show bit not NULL default 1, 
	is_saleoff bit not null default 0);

SELECT g_new.cate_name, g.name, g.price FROM (SELECT cate_name, MAX(price) AS max_price FROM goods GROUP BY cate_name) AS g_new LEFT JOIN goods AS g ON g_new.cate_name=g.cate_name AND g_new.max_price=g.price ORDER by g_new.cate_name;

CREATE TABLE IF NOT EXISTS goods_cates (
id int unsigned primary key auto_increment,
name varchar(40) not null
);

INSERT INTO goods_cates (name) SELECT cate_name FROM goods GROUP BY cate_name;

UPDATE goods AS g INNER JOIN goods_cates AS gc ON g.cate_name=gc.name SET g.cate_name=gc.id;

ALTER TABLE goods CHANGE cate_name cate_id int unsigned not null;

ALTER TABLE goods ADD FOREIGN KEY (cate_id) REFERENCES goods_cates(id);

CREATE TABLE IF NOT EXISTS goods_brands (
id int unsigned primary key auto_increment not null,
name varchar(40) not null
);

(SELECT brand_name FROM goods GROUP BY brand_name) AS g_new;

INSERT INTO goods_brands(name) SELECT brand_name FROM goods GROUP BY brand_name;

UPDATE goods AS g_new INNER JOIN goods_brands AS gb ON g_new.brand_name=gb.name SET g_new.brand_name=gb.id;

ALTER TABLE goods CHANGE brand_name brand_id int unsigned not null;

ALTER TABLE goods ADD FOREIGN KEY (brand_id) REFERENCES goods_brands(id);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值