SQL语句 即结构化查询语言(Structured Query Language),是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统,同时也是数据库脚本文件的扩展名
DDL**(数据定义语言) **
定义和管理数据,对象,如数据库,数据表等
DDL操作数据库
创建数据库
CREATE DATABASE [IF NOT EXISTS] dbname
“[IF NOT EXISTS]” 内容可以省略;
“dbname”需要创建的数据库名称。
删除数据库
DROP DATABASE [IF EXISTS] dbname
“[IF EXISTS] ”内容可以省略;
“dbname”需要创建的数据库名称。
查看数据库
SHOW DATABASES
“dbname”需要创建的数据库名称。
DDL操作数据库表
创建表
CREATE TABLE [ IF NOT EXISTS ] `表名` (
`字段名1` 字段类型 [ 属性 ] [ 索引 ] [注释] ,
`字段名2` 字段类型 [ 属性 ] [ 索引 ] [注释] ,
… …
`字段名n` 字段类型 [ 属性 ] [ 索引 ] [注释]
) [ 表类型 ] [ 表字符集 ] ;
“[]” 包含的内容可以省略;
“`” 当前符号为反引号,用于区别MySQL保留字与普通字符而引入的。
修改表结构
改变字段的属性
-- alter table 表名 modify 字段名 要修改的属性;
alter table tab_teacher modify tea_money decimal(3,2);
-- alter table 表名 change 旧的字段名 新的字段名 要修改的属性;
alter table tab_teacher change tea_money gongzi decimal(30,2);
添加字段
-- alter table 表名 add 字段名 类型 属性;
alter table tab_teacher add tea_address varchar(200) default '中国';
删除字段(危险操作)
-- alter table 表名 drop 字段名;
alter table tab_teacher drop tea_birthday;
修改表名
-- alter table 旧表名 rename as 新表名;
alter table tab_teacher rename as t;
** 删除表(危险操作)**
-- drop table t;
show create table tab_teacher;
DML(数据的增删改)
数据增加****关键字INSERT,主要功能是给数据库表增加记录
*数据删除关键字DELETE,主要功能室删除 数据库表中已有的记录。可以依 照条件去做修改*。 **
数据修改****关键字是UPDATE,主要功能是 修改数据库表中已有的记录。可以根据条件去做修改。
增加数据****(INSERT语句)
INSERT INTO `表名` [(`字段1`,`字段2`,...`字段n`)]
VALUES/VALUE ('值1','值2',...'值n')[,('值1','值2',...'值n')...];
其中:“[]” 包含的内容可以省略;
字段或值之间用英文逗号隔开
可同时插入多条数据,values 后用英文逗号隔开;
values和value的方式均可。
INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表中**,**目标表中任何已存在的行都不会受影响
INSERT INTO table2 (column_name,...) SELECT column_name,... FROM table1;
其中:****table2 必须存在,将table1中数据赋值到table2
** 如果要新建表并赋值表内容 **
** create table 新表 select * from 原始表;**
*修改数据***(UPDATE语句) **
UPDATE 表名 SET `字段名1` = '值1' [ , `字段名2` = '值2', …. ]
[ WHERE 条件];
其中:
“[]” 包含的内容可以省略;
`字段名`为要更改数据的字段,'值'表示字段改后的值,注意字段和值的对应;
可同时修改多个字段,多个字段后用英文逗号隔开;
“WHERE”是where子句,可以给修改增加条件;
条件:为筛选条件,如不指定则修改该表的所有列数
WHERE子句
- 有条件的从数据库表中获取记录,通常同在修改,删除,和查询语句的时候,协助该类语句从条件中获取记录。针对修改和删除语句,****如果没有条件,则全部修改和全部删除。
删除数据(DELETE语句)
DELETE FROM 表名 [ WHERE 条件];
其中:
“[]” 包含的内容可以省略;
“WHERE”可以通过where子句增加删除的条件。
TRUNCATE [TABLE] 表名
其中:
TRUNCATE是一个特殊的删除语句,又叫做清空语句;
“[]”包含的内容可以省略;
功能:清空某一张表内的全部数据,重置自增计数器;
特点:由于没有条件约束,所以速度快,而且效率高。
**delete, drop, truncate **区别
- **-- drop **删除表结构
- **-- delete 删除内容,**不删除索引
- -- truncate 清空****内容及索引重置自增计数器
DQL(Data Query Language 数据查询语言)
用途是查询数据库数据,如SELECT语句。是SQL语句中最核心、最重要的语句,也是使用频率最高的语句。其中,可以根据表的结构和关系分为单表查询和多表联查
**单表查询 **针对数据库中的一张数据表进行查询,可以通过各 种查询条件和方式去做相关的优化。
多表联查针对数据库中两张或者两张以上的表同时进行查询, 依赖的手段有复杂查询和嵌套查询。
单表联查
**SELECT [DISTINCT] **
{|表1.|****[** 表1.字段1 ****[as 字段别名1] **
[****,** 表1.字段2[as 字段别名2****]][, …]]****} **
**FROM 表1 ****[ ****as 表别名 ****] **
**[ ****left|right|inner join 表2 on 表之间的关系 ****] **
[** WHERE ****] **
**[ ****GROUP BY ****] **
[** HAVING****] **
[** ORDER BY****] **
**[ *LIMIT {[* 位置偏移量****,****] ****行数 }] **
“**[ ]”包含的内容可以省略;**
“**{ }**”包含的内容必须存在;
**DISTINCT ****设定DISTINCT可以去掉重复记录。 **
**AS **表名或者字段名过长时,可以用AS关键字起别名,方便操作。
**GROUP BY ** **按组分类显示查询出的数据。 **
*HAVING ** G*ROUP BY分组时依赖的分组条件。 **
**ORDER BY ** **将查询出来的结果集按照一定顺序排序完成。 **
**LIMIT ** 限制显示查询结果的条数
指定字段列
SELECT * | 字段名1, 字段名2... FROM 表名
“*”表示所查询的数据库表的全部字段。
- 表别名和字段别名
SELECT 表别名.字段名1 AS 字段别名1, 表别名.字段名2 AS 字段别名2
**FROM 表名 ****AS **表别名
“**.****” 当前表存在的字段; **
** “AS”可忽略不写,“AS”的功能如下: **
**给字段取一个新别名; **
** 给表取一个新别名; **
•把经计算或总结的结果用另外一个新名称来代替。
DISTINCT
SELECT DISTINCT 字段名1, 字段名2...
FROM 表名
- **去掉SELECT查询返回的记录结果中重复的记录(所有返回列的值都相同), **
只返回一条。
- WHERE条件子句
SELECT * FROM 表名 [ WHERE 条件];
** WHERE条件子句不是必须的; **
** WHERE子句,可以给查询增加条件; **
** 条件:为筛选条件,如不指定则修改该表的所有数据。**
**LIKE 关键字 **
SELECT * FROM 表名 WHERE 字段 LIKE 条件;
**在WHERE子句中,使用LIKE关键字进行模糊查询; **
** 与“%”一起使用,表示匹配0或任意多个字符; **
** 与“_”一起使用,表示匹配单个字符。**
IN 关键字
SELECT * FROM 表名 WHERE 字段 IN (值1,值2...);
**查询的字段的值,至少与IN 后的括号中的一个值相同; **
多个值之间用英文逗号隔开。
NULL 值查询
SELECT * FROM 表名 WHERE 字段 IS NULL | IS NOT NULL
常用的聚合函数
- GROUP BY和HAVING分组
GROUP BY
**1、对所有的数据进行分组统计; **
2、分组的依据字段可以有多个,并依次分组。
HAVING
与GROUP BY结合使用,进行分组后的数据筛选
多表联查
多表联查可以通过转接运算实现**,**即将多张表通过主外键关系关联在一起进行查询。下图提供了多表联查时用到的数据库表之间的关系
非等值查询
SELECT * FROM 表1,表2
笛卡尔积
等值查询**(内联数据):方式一 **
SELECT * FROM 表1,表2 WHERE 表1.字段1 = 表2.字段2...
与单表查询类似,都是SELECT语句;
把多个表放到FROM后,并用逗号隔开;
可使用AS关键字取别名,便于引用;
如无重名查询字段则可省略数据表的指定。
方式二**: *inner jion on select from 表一inner join on 表二….
-- inner join on
select * from student
inner join class
on student.classid = class.classid
inner join sc
on student.sid = sc.sid
inner join course
on course.cid = sc.cid
外联查询
左外联 从左表(表1)中返回所有的记录,即便在右 (表2)中没有匹配的行。
left join on 左外联
select * from student left join class
on student.classid = class.classid
*右外联***从右表(table_2)中返回所有的记录,即便在左(table_1)中没有匹配的行。 **
right join on 右外联
select * from class right join student
on student.classid = class.classid
子查询<****内部查询 ****>
**where **子查询
-- 查询id最大的一个学生
select * from student order by sid desc limit 1;
-- 查询id最大的一个学生(子查询)
select * from student
where sid = (select max(sid) from student)
-- 每个班id最大的学生编号
select * from student where sid in(
select max(sid) from student group by classid);
-- 没学过张三老师课程的学生
select * from student where sid not in(
select student.sid from student
left join sc on student.sid = sc.sid
left join course on sc.cid = course.cid
left join teacher on course.tid = teacher.tid
where tname = '张三')
**from **子查询
把内层的查询结果当成临时表,供外层sql再次查询。查询结果集可以当成表看待。临时表要使用一个别名。
-- from 子查询
-- 查询大于5人的班级名称和人数
select classname,count(*) from student
left join class on student.classid = class.classid
group by class.classid
-- from 子查询
select classname,a 人数 from class
left join
(select classid, count(*) a
from student group by classid)t1
on class.classid = t1.classid
-- 每个班的平均成绩,班级名称和平均成绩
select classname, avg(score) from class
left join student on class.classid = student.classid
left join sc on student.sid = sc.sid
group by class.classid
select * from class
left join (
select classid,avg(score) from sc
left join student on sc.sid = student.sid
group by classid
)t1 on class.classid = t1.classid
exists型子查询
把外层sql的结果,拿到内层sql去测试,如果内层的sql成立,则该行取出。内层查询是exists后的查询。
--从学生表中取出学生的信息,(如果该性别下没有男学生则不显示)
select * from student where exists (select * from student where ssex='男')
**any, some, all子查询: **
** any 子查询**
**表示满足其中任意一个条件 **
假设any内部的查询语句返回的结果个数是三个,
如:result1,result2,result3,那么,
select ...from ... where a > any(...);
->相当于:
select ...from ... where a > result1 or a > result2 or a > result3;
some 是 any的别名,所以用法是一样的,可以替代使用
--查询出一班成绩比二班最低成绩高的学生
select * from student
inner join sc on student.sid = sc.sid
where classid = 1 and (score > 70.0 or score > 60.0 or
score > 80.0 or score > 50.0 or score > 30 or score > 20
or score > 31 or score > 34)
select * from student
inner join sc on student.sid = sc.sid
where classid = 1 and score > any(select score from student
inner join sc on student.sid = sc.sid
where classid = 2)
all 子查询
**表示满足其中所有条件条件,ALL关键字与any关键字类似,只不过上面的or改成and。 **
**假设any内部的查询语句返回的结果个数是三个, **
select ...from ... where a > all(...);
->
select ...from ... where a > result1 and a > result2 and a > result3;
查询出一班成绩比二班最高成绩高的学生
select * from student
inner join sc on student.sid = sc.sid
where classid = 1 and (score > 70.0 and
score > 60.0 and
score > 80.0 and score > 50.0 and
score > 30 and score > 20
and score > 31 and score > 34)
select * from student
inner join sc on student.sid = sc.sid
where classid = 1 and score > all(select score from student
inner join sc on student.sid = sc.sid
where classid = 2)
控制sql语句
if(v,v1,v2)
v 逻辑表达式 Boolean值
如果真 显示v1
如果假 显示v2
select tid,tname,if(tsex=1,'男','女'),tbirthday from teacher
ifnull(v,v1)
v 字段
v1 如果字段的值是一个null v1就显示
select sid,sname,ifnull(birthday,'1900-1-1') birthday,
ssex,ifnull(classid,3) classid from student
**case when then end **
--简单case
select tid,tname,
case tsex
when 1 then '男'
when 0 then '女'
else '未知'
end tsex,
tbirthday, taddress
from teacher
-- 搜索case
select tid,tname,
case
when tsex > 1 then '未知'
when tsex = 1 then '男'
when tsex < 1 then '女'
else '不能出现情况'
end
,
tbirthday,taddress from teacher
版权归原作者 俙江 所有, 如有侵权,请联系我们删除。