SQL语句学习入门进阶(一)

这次要总结的是在开发中必不可少的技能----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);

建好的表如下:

emp表
orders表
2、INSERT(插入)

向表中插入数据

//向emp表中插入数据,插一条为例
//插入字符时使用 ' ',插入数值时不需要。
INSERT INTO emp VALUES(1,'ace','nan',14,12,12.456);
...
//向orders表中插入数据,插一条为例
INSERT INTO orders VALUES(1,2323,11);
插入数据后的emp表
插入数据后的orders表
//向表中的某列插入数据
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;
ASC排序

对于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 函数用于把数值字段舍入为指定的小数位数

round函数需要的参数
//将money小数点保留1位
SELECT name,ROUND(money,1) as money FROM emp;
7、FORMAT()

FORMAT 函数用于对字段的显示进行格式化


format函数需要的参数

本次文章中写的相关知识点是我在学习中随手记录的,对一些SQL大牛来说,这些已经是耳熟能详了。会不会让你们产生一种灌水的错觉????哈哈~但是把东西已文章的形式总结出来,总归是一件好事情。

现阶段不能在往下写了,不然看的人都不耐烦了~

文章中的内容,相信会“越来越干”。java菜鸟的晋级路,一起见证。

各位大佬赏脸关注个人公众号:JavaDeveloperCorner

微信公众号

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,627评论 6 517
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 95,180评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 169,346评论 0 362
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 60,097评论 1 300
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 69,100评论 6 398
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,696评论 1 312
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,165评论 3 422
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,108评论 0 277
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,646评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,709评论 3 342
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,861评论 1 353
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,527评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,196评论 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,698评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,804评论 1 274
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,287评论 3 379
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,860评论 2 361

推荐阅读更多精彩内容

  • 1. 问题的提出## 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出...
    七寸知架构阅读 5,375评论 1 111
  • Spark SQL, DataFrames and Datasets Guide Overview SQL Dat...
    草里有只羊阅读 18,335评论 0 85
  • 1.简介 数据存储有哪些方式?电子表格,纸质文件,数据库。 那么究竟什么是关系型数据库? 目前对数据库的分类主要是...
    乔震阅读 1,726评论 0 2
  • 那年盛夏,你走进我的眼眸,不知何时,在我心底留下一枚种子,它静静留在我心底,未曾悸动。夏末,夏天的热浪渐渐远去,...
    小垣阅读 508评论 0 0
  • 那一句话,我始终不敢说 我知道我爱你胜过你爱我 说出来,我就输 而你只会毫不犹豫的转身 可我又不甘心 想要的很多 ...
    星月1号阅读 365评论 0 0