这次要总结的是在开发中必不可少的技能----SQL语句,本次对SQL语句进行了一些常用基础知识的总结。随着自己对SQL语句的不断学习,陆续会推出SQL语句学习入门进阶系列。通过写文章的方式对自己一段时间的学习成果进行一次总结,不仅是一种激励自己的途径,更是与大家共同学习的有效渠道。
接下来进入正题,文章中会有自己练习时的数据库表结构,方便大家学习(随便建的~)
文章的SQL语句都是针对MySQL来进行的。
呦嚯嚯嚯
本次的文章主要从以下几个方面进行说明:
- SQL基础
- SQL高级
- SQL常用函数
一、SQL基础
首先,你知道SQL的全称吗?英文名字的缩写代表的什么意思?可能你平时只是读“SQL”读的特别的6,但是你可能已经忽略了......小心笔试中招。
SQL:结构化查询语言( Structured Query Language)
好了,SQL的含义介绍完了,进入正题。
注:
①所有代码段均为自己练习时创建
②工具为:Navicat Premium 11.0.10
1、CREATE TABLE(建表)
怎么着也得先建立表~
CREATE TABLE emp
(
id int NOT NULL PRIMARY KEY,//添加主键
name varchar(20),
sex varchar(2),
age int,
chengji int,
money double
)
CREATE TABLE orders
(
o_id int NOT NULLPRIMARY KEY,
orderNo int,
e_id int,
FOREIGN KEY (e_id) REFERENCES emp(id)//添加一个外键
)
当你建表成功后,发现忘记添加主键,或者忘记添加外键,莫着急。使用以下咒语即可:
添加主键:ALTER TABLE emp ADD PRIMARY KEY(id);
添加外键:ALTER TABLE orders ADD FOREIGN KEY (e_id) REFERENCES emp(id);
建好的表如下:
2、INSERT(插入)
向表中插入数据
//向emp表中插入数据,插一条为例
//插入字符时使用 ' ',插入数值时不需要。
INSERT INTO emp VALUES(1,'ace','nan',14,12,12.456);
...
//向orders表中插入数据,插一条为例
INSERT INTO orders VALUES(1,2323,11);
//向表中的某列插入数据
insert into table_name(列名1,列名2,...) values('值1','值2',...);
3、UPDATE(更新)
//更新某一行的某一列
update emp set age=12 where name='ace';
//更新某一行的若干列
update emp set age=13,chengji=34 where name='ace';
4、DELETE(删除)
//删除表中的某一行
delete from emp where id=8;
//删除表中的所有数据
delete * from emp;
在使用delete删除emp表中数据时,要注意该表与其他表是否存在关联关系,比如:外键
emp表id是表orders的外键,如果要删除emp表中的id,得先删除orders表中的外键。
5、DISTINCT
在表中,可能会包含重复值。这并不成问题,不过,有时你也许希望仅仅返回唯一不同的值。使用distinct关键字进行处理,用于返回唯一不同的值。
注意:distinct关键字是去重!去重!去重!*把列中的重复值去掉!
曾经我在笔试的时候,有道SQL考题:请写出表中所有重复的name的所有数据。我当时没反应过来,直接就用了distinct关键字,后来就....呵呵
//来来来,正确的写法
select * from emp where
name in
(select name from emp group by name
having count(1)>=2//count(1),其实就是计算一共有多少符合条件的行,count(*)会全表扫描,速率稍慢
);
//查询emp表中的name,返回唯一的名字
select distinct name from emp;
这里我只总结了部分基础知识,每个人关注基础的点不一样,但目的总归是想要学好SQL的。
要想上梯子必须从底下爬起 --------------无名氏
二、高级
这一部分的内容是通常用到的,属于最开始学习SQL知识时必须要熟练的,我这里大致列出几项。
1、LIMIT
//限制显示的数据条数
select * from emp limit 4;//只显示4行的数据
2、LIKE
一般配合where使用,搜索条件中的指定模式
//% 可以理解为定义通配符
select * from emp where name like 'a%';
select * from emp where name like '%a';
select * from emp where name like '%a%';
//查询表中不包含的数据,使用"NOT"
select * from emp where name not like 'a%';
在上面我们可以看到,通配符“%”的使用方法,所以通配符必须要配合like 运算符一块使用。
通配符还有以下几种:
- _ :仅代替一个字符
//使用 "_"通配符
select * from emp where name like 'a_';
//使用[charlist]通配符
select * from where name like '[ac]%';
//使用[!charlist]通配符
select * from where name like '[!ac]%';
3、IN
从字面意思就可以知道它的作用是什么了
//找出名字为'demo'和'ace'的所有数据
select * from emp where name in ('demo','ace');
4、JOIN
联表运算符JOIN,该运算符是用于将两个或者两个以上的表进行关联,并从这些表中查询数据。
对于联表来说,通过使用主键(primary key)和外键(foreign key)也可以建立连接。
//使用主键、外键将表连接
select e.name,e.age,o.orderNo
from
emp as e,orders as o//as 用法就当成为表起了一个别名
where e.id=o.e_id;
除了上述直接使用条件关联,下面我们可以用可读性更高的INNER JOIN来写
//INNER JOIN的使用和JOIN的效果一样,以INNER JOIN为例
select e.name,e.age,o.ordersNo
from
emp e INNER JOIN
orders o ON
e.id=o.e_id ORDER BY name;
还有其他几种方连接方式(外连接):
- LEFT JOIN:就算右表中没有匹配,也从左表返回所有的行(你不爱我,没关系,我爱你就行了)
- RIGHT JOIN:即使左表没有匹配,也行右表返回所有的行(你不爱我,没关系,我依旧倾其所有)
- FULL JOIN:只要有一个表存在着匹配,就返回行(FULL LOVE)
5、ALTER
穿插介绍一下alter,前面的例子中已经包含了几种alter使用方法。
//修改表中某列值
ALTER TABLE emp
ALTER COLUMN age int;
//给表中增加列
alter table emp add COLUMN money double;
6、UNION
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
上面引用的意思就是:道不同,不相为谋!
UNION和UNION ALL命令几乎是等效的,不过加了“ALL”,就会列出所有的值。
//使用UNION
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
//使用UNION ALL
SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2
注意:因为其也具有“唯一性”,容易和PRIMARY KEY混淆。面试或笔试常考两者的不同,在这里说明一下:
与PRIMARY KEY不同的是,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。
为表添加UNION,这里给出使用的SQL语法。
//为已创建的表添加UNION
ALTER TABLE table_name ADD UNIQUE (column_name);
//定义多个UNION约束
ALTER TABLE Persons
ADD CONSTRAINT u_name(约束名) UNIQUE (column_name1,column_name2,...);
//通过约束名来撤销
ALTER TABLE Persons
DROP INDEX u_name;
7、AUTO-INCREMENT(自增)
在运用中,我们希望在每添加一条数据后,自动的为我们的主键创建值。
create table emp
(
id int not null auto_increment,//默认自增起始值为1,每条数据记录递增加1
...
primary key(id)
);
/**
想改变自增的起始值,使用下列 SQL :
ALTER TABLE emp AUTO_INCREMENT=100;
**/
8、ORDER BY
在前面中已经使用到了有关order by的SQL语句,order by该语句用于对结果集进行排序,默认是进行ASC正序排序(从小到大)。
排序的两种方式:
- ASC:升序(从小到大)
- DESC:降序(从大到小)
举栗子:
//对emp表中的name进行ASC排序查询
select * from emp order by name;
对于DESC排序,这里就不进行举例了,大家可以自己写SQL试一下。
9、GROUP BY
通常配合合计函数使用,根据一个或多个列对结果集进行分组。
//文章前面的一个sql语句,查询表中重复的数据
select * from emp where
name in
(select name from emp group by name
having count(1)>=2
);
具体的用法在介绍函数时会涉及到。
10、HAVING
在上面的例子中,我们使用where关键字来增加查询条件,这里增加having字句是因为,where关键字无法与合计函数一起使用
同样引用上面的SQL语句。
具体的用法在介绍函数时会涉及到。
11、DEFAULT
DEFAULT约束用于向列中插入默认值。
有笔试题出现
//在建表时可以设置默认值
create table hello
(
id int not null primary key,
...
name varchar(255) default 'zhangsan'
);
三、SQL常用函数
在实际的SQL运用中,肯定会涉及到有关函数的使用,本次文章只是简单的介绍了几种初学时必学的函数类型。
下面来进行点名介绍:
1、AVG()
AVG 函数返回数值列的平均值。NULL 值不包括在计算中。
//当求平均值的列包含null值时,null是不包括在计算中的(逻辑很正常~)
select AVG(chengji) as avg_chengji from emp;
//找出成绩高于平均成绩的name
select name from emp where
chengji >(select avg(chengji) as avg_chengji from emp);
2、COUNT()
COUNT( ) 函数用于返回匹配指定条件的行数。
//count(count_name)
//返回指定列的值的数目,NULL值不算
select count(chengji) from emp;
//count(*)
//返回表中的记录数
select count(*) from emp;
3、MAX()
MAX函数返回指定列的最大值,NULL值不包括在计算中
//成绩最大
SELECT MAX(chengji) FROM emp;
4、MIN()
MIN函数返回的指定列的最小值,NULL值不包括在计算中
//年龄最小
SELECT MIN(age) FROM emp;
5、SUM()
SUM函数返回指定列的总数
select sum(chengji) as sum from emp;
6、ROUND()
ROUND 函数用于把数值字段舍入为指定的小数位数
//将money小数点保留1位
SELECT name,ROUND(money,1) as money FROM emp;
7、FORMAT()
FORMAT 函数用于对字段的显示进行格式化
本次文章中写的相关知识点是我在学习中随手记录的,对一些SQL大牛来说,这些已经是耳熟能详了。会不会让你们产生一种灌水的错觉????哈哈~但是把东西已文章的形式总结出来,总归是一件好事情。
现阶段不能在往下写了,不然看的人都不耐烦了~
文章中的内容,相信会“越来越干”。java菜鸟的晋级路,一起见证。
各位大佬赏脸关注个人公众号:JavaDeveloperCorner