大师网-带你快速走向大师之路 解决你在学习过程中的疑惑,带你快速进入大师之门。节省时间,提升效率

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 运算符一块使用。

通配符还有以下几种:

  • _ :仅代替一个字符
  • [charlist]:字符列中的任意字符
  • [^charlist或!charlist]:不在字符列中的任意字符
    //使用 "_"通配符
    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菜鸟的晋级路,一起见证。