数据库教程 DQL数据查询语言(重点)和增删改

数据库教程 DQL数据查询语言
关于数据库查询语句的相关描述:
1、* 所有
2、基本固定格式:SELEST * FROM (表名) WHERE (条件)
3、where :判断条件
4、区间查询:BETWEEN...AND...
5、模糊查询:%:多个字符;_:单个字符
6、正则查询
7、排序查询:
ORDER BY ... ASC:正序;
ORDER BY...DESC:反序
8、多列查询,使用排序查询之间用逗号分开。
9、列起别名 用AS 或者省略
关于查询中的子查询
1、相等性子查询,子查询只能查询一个值
2、in 子查询,用于匹配多个值,子查询支持多行数据,但是只能是一列
3、any 和 all 关键字子查询,用于比较多个运算。
4、exists 关键字,表示判定子查询石头有值,相当于布尔判断。可在前面加 not 关键字
5、可以使用子查询作为临时表,子查询作为临时表的时候,必须起别名
6、相关子查询,子查询和父查询相关,无法单独执行。不能脱离付查询而执行
关于查询中的表连接
1、内连接:inner join 约束条件:曹家链接的两个表必须条件所匹配,当两个列表有冲突的时候,可以加表名前缀,连接不是画等号,任意谅解条件都可以,只要有合理的谅解逻辑就可以
2、左外链接:leet join 特点:左表数据全部显示,右表不匹配的显示null
3、右外连接:right join 特点:右表数据全部显示,左表数据不匹配显示null
4、全连接:mysql 暂不支持,但是通过左外连接和右外连接通过union 表示联合查询。
5、表连接后,相当于一个临时的表,可以对这个表进行任意的操作
6、交叉连接,左表和右表的每一条数据相互连接
7、不推荐的表连接
8、联合查询:通过union 关键字进行查询,
9、限定行数进行查询,通过限定指定的行数进行查询到指定的位置。limit 关键字。
第四部分:分组查询
1、分组查询,即按照一定的条件,将所有的数据分组,对分组后的数据及西贡统计查询-- GROUP BY表示分组。分组之后,可查询的数据只有分组列及聚合函数列。
-- 聚合函数一共有5个。sum avg max min count
-- 单分组,按一个条件分组
对视图的查询:
数据库查询语句的实例:
-- 查询所有的语句 -- SELECT * FROM t_student -- 指定字段查询 -- SELECT id,stu_id,NAME,pinyin,sex FROM t_student -- where限定条件查询 -- SELECT * FROM t_student WHERE id = 1 -- 比较运算符 < > <= >= != <> -- SELECT * FROM t_student WHERE id >500 SELECT * FROM t_student WHERE sex !='女' SELECT * FROM t_student WHERE sex <> '女' -- 逻辑运算符 and or not 与 或 非 -- SELECT * FROM t_student WHERE id >500 AND sex !='女' SELECT * FROM t_student WHERE id <500 OR sex = '男' SELECT * FROM t_student WHERE NOT sex != '女' -- 算数运算符 + - * / -- SELECT * FROM t_student WHERE height + 10 > 180 SELECT * FROM t_student WHERE height - 19 < 190 -- 算数运算符 支持小括号提升优先级-- SELECT * FROM t_student WHERE (height + 10) * 2 > 190 -- 区间查询 between...and -- SELECT * FROM t_student WHERE height BETWEEN 150 AND 190 -- 模糊查询 -- SELECT * FROM t_student WHERE NAME LIKE '张%' SELECT * FROM t_student WHERE name LIKE '%张%' SELECT * FROM t_student WHERE NAME LIKE '_张' SELECT * FROM t_student WHERE NAME LIKE '张__' -- 正则查询 -- SELECT * FROM t_student WHERE NAME REGEXP '^.{3}$' -- 查询排序-- SELECT * FROM t_student WHERE sex ='女' ORDER BY height ASC select * FROM t_student WHERE sex ='男' ORDER BY height DESC -- 多列查询,多列之间使用逗号分开, SELECT * FROM t_student WHERE sex = '女' ORDER BY height DESC, weight DESC, birthday DESC -- 9、列起别名 用AS 或者省略 SELECT id AS 编号,stu_id AS 学号,`name` AS 姓名,pinyin 拼音,sex 性别,birthday 出生日期 FROM t_student -- 第二部分 子查询 -- 1、相等性查询,子查询只能有一个之(一行一列),支持比较运算符 SELECT * FROM t_student WHERE id = (SELECT id FROM t_student WHERE `name` = '张家') SELECT * FROM t_student WHERE id = (SELECT id FROM t_score WHERE score >= 100) SELECT * FROM t_student WHERE NOT id = (SELECT id FROM t_score WHERE score >= 100) SELECT * FROM t_student WHERE id <> (SELECT id FROM t_score WHERE score >= 100) SELECT * FROM t_student WHERE id > (SELECT id FROM t_score WHERE score >= 100) -- 2、in 子查询,用于匹配多个值。子查询支持多行数据,但是只能时一列 SELECT * FROM t_student WHERE id IN (1,2,3,4,5) SELECT * FROM t_student WHERE id = 1 OR id = 2 OR id = 3 OR id = 4 OR id = 5 SELECT * FROM t_student WHERE id IN (SELECT id FROM t_score WHERE score >= 90 AND score <= 100) -- not in子查询 SELECT * FROM t_student WHERE id NOT IN (SELECT id FROM t_score WHERE score >= 90 AND score <= 100) -- 3. ANY和ALL关键字子查询,用于比较运算多个值。不支持all和any中使用常量集合 SELECT * FROM t_student WHERE id > ALL(SELECT id FROM t_score WHERE score >= 90 AND score <= 100) SELECT * FROM t_student WHERE id > ANY(SELECT id FROM t_score WHERE score >= 90 AND score <= 100) -- 4.exists关键字子查询,表示判定子查询是否有值,相当于布尔判断。exists前可以加not关键字 SELECT * FROM t_student WHERE EXISTS (SELECT id FROM t_score WHERE score >= 200) SELECT * FROM t_student WHERE NOT EXISTS (SELECT id FROM t_score WHERE score >= 200) -- 5.以子查询作为临时表,子查询作为临时表,必须起别名 SELECT * FROM (SELECT * FROM t_student WHERE sex = '女') AS t1 -- 6.相关子查询。子查询和父查询相关,无法单独执行,不能脱离父查询而执行 -- 查询出比同姓学生平均身高高10公分的学生 SELECT * FROM t_student t1 WHERE height - 10 > (SELECT avg(height) FROM t_student t2 WHERE t2.last_name = t1.last_name) 第三部分:表连接,重点,不同的表根据连接条件,连接到一起 -- 内连接,外连接,全连接,mysql不支持全连接,有间接手段实现 -- 1.内连接,inner join,约束:参与连接的两个表和必须条件所匹配 -- 查询出,学生基本信息以及考试分数,当列名有冲突时,可以加表名前缀 -- 连接条件不是说必须是等号,任意连接条件都可以,只要有合理的连接逻辑就可以 SELECT t1.id,`name`,sex,birthday,score FROM t_student t1 INNER JOIN t_score t2 ON t1.id = t2.student_id -- 2.左外连接,LEFT JOIN,左连接的特点:左表数据全部显示,右表不匹配的列显示为null SELECT t1.id,`name`,sex,birthday,score FROM t_student t1 LEFT JOIN t_score t2 ON t1.id = t2.student_id -- 3.右外连接,RIGHT JOIN,右连接的特点:右表数据全部显示,左表不匹配的列显示为null SELECT t1.id,`name`,sex,birthday,score FROM t_student t1 RIGHT JOIN t_score t2 ON t1.id = t2.student_id -- 4.全连接。mysql不支持全连接。全连接表示左表和右表都全部显示,不匹配的显示为null -- UNION表示联合查询 SELECT t1.id,`name`,sex,birthday,score FROM t_student t1 LEFT JOIN t_score t2 ON t1.id = t2.student_id UNION SELECT t1.id,`name`,sex,birthday,score FROM t_student t1 RIGHT JOIN t_score t2 ON t1.id = t2.student_id -- 5.表连接之后,相当于一个全新的表,可以对这个表进行任意操作 SELECT t1.id,`name`,sex,birthday,score FROM t_student t1 INNER JOIN t_score t2 ON t1.id = t2.student_id WHERE sex = '女' ORDER BY t1.`name` DESC -- 6.交叉连接,使用几率很少。左表和右表中的每一条数据互相连接。 SELECT t1.*,t2.score FROM t_student t1 INNER JOIN t_score t2 -- 7.理解成表连接。不推荐,有缺陷,效率极低。 SELECT * FROM t_student t1,t_score t2 WHERE t1.id = t2.student_id -- 联合查询,union关键字。结果集1 union 结果集2 -- 注意两个结果集的列的个数相同,显示列名以第一个结果集为准 SELECT id,height FROM t_student WHERE id > 990 UNION SELECT birthday,id FROM t_student WHERE id < 10 -- 限定行数查询,可以限定从指定的位置查询到指定的位置 -- limit关键字。sqlserver:top oracle:rownum -- limit后跟一个参数的时候,表示限定查询的行数,默认从第0行开始查。开始位置是表的行索引,不是任意其中一列 SELECT * FROM t_student WHERE sex = '男' ORDER BY id LIMIT 5 -- 最常见的 SELECT * FROM t_student WHERE sex = '男' ORDER BY id LIMIT 0,5 -- offset表示偏移位置,即从第几行开始查,表的行索引是从0开始的。 SELECT * FROM t_student WHERE sex = '男' ORDER BY id LIMIT 5 OFFSET 0 -- 第四部分 分组查询 -- 分组查询,即按照一定的条件,将所有数据分组,对分组之后的数据进行统计查询 -- GROUP BY表示分组。分组之后,可查询的数据只有分组列及聚合函数列。 SELECT sex, count(id) FROM t_student GROUP BY sex -- 聚合函数一共有5个。sum avg max min count -- 单分组,按一个条件分组 SELECT sex, count(id)+5 人数, avg(height),min(height),max(weight),sum(iq) FROM t_student GROUP BY sex -- 多分组,复合分组。按多个条件分组,多个条件之间使用逗号分隔 SELECT sex,CHAR_LENGTH(`name`) as 字数, count(id) FROM t_student GROUP BY sex, CHAR_LENGTH(`name`) ORDER BY 字数 -- 按出生年份分组 SELECT sex,YEAR(birthday) 出生年份, count(id) FROM t_student GROUP BY sex, YEAR(birthday) ORDER BY 出生年份 -- 分组过滤,分组筛选,使用having关键字,只能是分组列及聚合函数列的条件 -- 只查询2000年以后的分组 -- 注意:where是写在group by前面,优先级高于group by。 SELECT sex,YEAR(birthday) 出生年份, count(id) FROM t_student GROUP BY sex, YEAR(birthday) HAVING 出生年份 >= 2000 ORDER BY 出生年份 -- 对视图的查询 SELECT * FROM v_groupsex SELECT * FROM v_fulladdress_1
数据库中的增删改:
-- 第五部分 增,删,改 -- 插入行语法 INSERT INTO t_student (stu_id,`name`,sex,birthday,height) VALUES ('3333','三儿','男','2000-1-1',180) -- 如果不指定列名的话,则意味着对每一列都需要赋值 INSERT INTO t_score VALUES (50,50,50,99.5,'A') -- 要插入的数据,可以通过一个查询而得出 INSERT INTO t_student (stu_id,`name`,sex,birthday,height) SELECT '999',`name`,sex,birthday,height FROM t_hr_humen WHERE id = 10 -- 修改语法 UPDATE t_student SET sex = '男',`name`= '张大欣' WHERE id = 1 UPDATE t_student SET weight = weight + 10 WHERE id < 5 -- update支持表连接 UPDATE t_student t1 INNER JOIN t_score t2 on t1.id = t2.student_id SET iq = 300 WHERE t2.score = 100 -- 删除语法 DELETE FROM t_student WHERE id = 1 DELETE FROM t_student WHERE id < 100 -- 去重复。distinct表示去重,比较影响查询性能 SELECT DISTINCT sex FROM t_student
来源:刘广法博客,请注意转载出处,网站地址为:https://liuguangfa.com/