sql的关键字
整理⼀下sql的关键字,⼀直都在⽤,只是很少去整理,所以今天简单整理⼀下,主要是整理CRUD的⼀些关键字。
写在前⾯:sql 不区分⼤⼩写
select 简单查询语句
select columnName from tableName where condition group by columnName having condition order by columnName desc asc limit 1;
需要注意说明:当同时含有where⼦句、group by ⼦句、having⼦句及聚集函数时,执⾏顺序如下:
执⾏where⼦句查符合条件的数据;
使⽤group by ⼦句对数据进⾏分组;对group by ⼦句形成的组运⾏聚集函数计算每⼀组的值;最后⽤having ⼦句去掉不符合条件的组。
having ⼦句中的每⼀个元素也必须出现在select列表中。有些数据库例外,如oracle.
having⼦句和where⼦句都可以⽤来设定限制条件以使查询结果满⾜⼀定的条件限制。
having⼦句限制的是组,⽽不是⾏。where⼦句中不能使⽤聚集函数,⽽having⼦句中可以。
where在分组前过滤,having在分组后过滤
having字段必须是查询出来的,where字段必须是数据表存在的。
where 不可以使⽤字段的别名,having 可以。因为执⾏WHERE代码时,可能尚未确定列值。
涉及到的关键字:
distinct:对查询列进⾏去重,也可以⽤在聚合函数中。
and:⽤于并列查询条件,左右两边的条件同时满⾜时才为真。例如:查询姓名为jason并且年龄为22的学⽣信息。 select * from student as s where s.name='jason' and s.age=22;
or:也⽤于查询条件,只要满⾜了左右两边条件中的⼀个即可,例如:查询姓名为jason或者年龄为22的学⽣信息。 select * from student as s where s.name='jason' or s.age=22;
not:表⽰对查询条件取反,通常和in,between..and..搭配使⽤。
between..and.. 或者 not between..and.. :⽤于查询条件,通常为符合某个区间的数值或者⽇期。
in 或者 not in:⽤于查询条件,表⽰只要查询的列满⾜其中的⼀个即可(not in 相反),例如:查询id为1,2,3的学⽣信息。select * from student as s where s.id in(1,2,3);
is null 或者 is not null:⽤于查询条件,判断某个字段列是否为空值(is not null 相反),例如:查询姓名不为空的学⽣信息。select * from student as s where s.name is not null;
like 或者 not like 后接通配符:⽤于查询条件,通常和 %(0或者多个),_(⼀个)通配符搭配使⽤,例如:查询姓名为j开头的学⽣信息。select * from student as s where s.name like 'j%';
exists 或者 not exists:⽤于查询条件,主要是⽤于判断某个结果是否存在于表中,如果存在则为true,否则为false。数据量很⼤时适合使⽤,⽽in当数据量很⼤时则不太适⽤。
as:⽤于为列或者表起别名,也可以使⽤空格为列或者表起别名,不建议混⽤。
*:表⽰查询表中符合条件的所有字段信息。
with:常常与as连⽤,将查询到的结果暂时存储到⼀张虚表当中,然后再做操作。后⾯必须紧跟使⽤这个虚表的sql语句。with就是⼀个sql⽚段,供后⾯的sql语句引⽤。
详情参见:
例如:with a as (SELECT * FROM table_a);
select * from a;
`>,<,=,<>,!=:分别表⽰⼤于,⼩于,等于,不等于。
union(去重)/union all(不去重):可以将⼀个或多个 SELECT 语句的结果连接组合成⼀个结果集,但是必须列类型和列的个数要⼀致。
例如:将学⽣姓名为jason的学⽣和学⽣爱好为听歌的学⽣查询出来(例⼦不恰当)
select s.id,s.name,s.addr from student as s where s.name='jason'
union all
select d.id,d.name,d.addr from student as d where d.hobby='listen song';
intersect/intersect all(交运算,all不去重):表⽰获取两个查询sql结果的交集。
类似:
select s.id,s.name,s.addr from student as s where s.name='jason'
intersect all
select d.id,d.name,d.addr from student as d where d.hobby='listen song';
except/except all(差运算,all不去重):表⽰获取两个查询sql结果的差集。
sql多表查询语句
inner join on :表⽰内连接(内连接可⽤where替换)
例如:查询a表中在b表中存在id为1的数据信息
select * from a inner join b on a.id=b.id and a.id=1;
可以使⽤where⼦句替换为:select * from a,b where a.id=b.id and a.id=1;
有些情况下,可以使⽤连接来替代⼦查询。因为使⽤join,MySQL不需要在内存中创建临时表。
left join on(左外连接):表⽰左外连接
例如:查询a表中在b表中存在姓名j开头的数据信息(例⼦不恰当)
select a.name,b.sex from a left join b on a.id=b.id and a.name like 'j%';
它的含义是即使b表中没有与a表中匹配的数据信息,a表中的数据信息都会全部查询出来。
left join on 后跟and和where区别
(1)ON条件是在⽣成临时表时使⽤的条件,它不管ON中的条件是否为真,都会返回左边表中的记录;
(2)WHERE条件是在临时表⽣成好后,再对临时表进⾏过滤的条件。这时已经没有LEFT JOIN的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉;
(3)AND 是过滤之后再连接,WHERE是连接之后再过滤。
(4)⽽inner jion没这个特殊性,则条件放在on中和where中,返回的结果集是相同的。
right join on(右外连接):表⽰右外连接
select a.name,b.sex from a right join b on a.id=b.id and a.name like 'j%';
它的含义与左外连接相反。
full join(全连接):即使数据没有在两张表中同时存在,也要返回⾏。
select a.name,b.sex from a full join b on a.id=b.id and a.name like 'j%';
sql插⼊语句
insert into tablename(column) values(value);
插⼊语句有四种⽅式,单个值插⼊,多个值插⼊,全部插⼊,条件插⼊
第⼀种情况插⼊指定字段
insert into table_name(column1,column2)values(value1,value2);
第⼆种情况插⼊所有字段:前提条件是字段顺序必须与表中字段顺序⼀致
insert into table_name values(value1,value2);
第三种情况批量插⼊数据
insert into table_name values (value1,value2),(value1,value2);
也可以指定插⼊批量数据
insert into table_name(column1,column2) values(value1,value2),(value1,value2);
第四种情况就是当满⾜了指定条件时才插⼊数据
insert into table_name(column1,column2) select value1,value2 from table_name where ...
也就是后⾯select⼦句中查询出来的列作为前⾯的值插⼊到表中,但是这个列的个数要和前⾯的字段个数⼀致。select⼦句就可以随便写了。
例如
insert into dept(deptno,dname,loc) select 11,dept.dname,dept.loc from dept where deptno=22;
sql删除语句
delete from tablename where condition;
sql更新语句
update tablename set column=value where condition;
sql更改表结构
alter table ..add(添加属性)
alter table..drop(删除属性)
sql删除表批量更新sql语句
drop table
删除表(不可恢复):truncate
sql常见函数
avg():表⽰求平均值
min():表⽰求最⼩值
max():表⽰求最⼤值
sum():表⽰求和
count():表⽰计数统计

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。