结构化查询语言 SQL

结构化查询语言(Structured Query Language),简称SQL,是数据库的标准查询语言。可以通过 DBMS对数据库进行定义数据,操纵数据,查询数据,数据控制等
1、数据定义语言 (DDL)

Data Dafinitaon Language
如创建表 create
删除表 drop
修改表 alter
清空表 truncate,彻底清空,无法找回
show databases;          # 查看所有数据库:
show tables;              # 查看所有表:
drop database db1;          # 删除数据库
create database db1 default character set utf8; # 创建数据库
use database;               # 选择数据库
create table t1(id int(3),name varchar(20)); # 创建表
#int后面的数字代表的是显示宽度,而varchar后面的数字代表的是字符长度。
desc t1 # 查看表
insert into t1 values(1,'user1'); # 插入数据
alter table t1 add(age int(3)); # 添加表字段语句
alter table t1 drop id; # 删除表字段语句
alter table t1 modify age varchar(2); # 修改表字段类型格式
alter table t1 change age p1age int(3); # 修改表字段名称
alter table t1 rname per; # 修改表名
truncate table t1; # 清空表结构
drop table t1; # 删除表结构

2、数据操纵语言(DML)

- insert:向表中插入数据
- delete:删除表中的数据,格式:delete from tablname [where 条件]
- update:修改表中的数据 格式:update tablname set colName1=value1,colName2=value2
- where : 对表中的数据增加条件进行限制,起到过滤的作用。 1. 格式: where colName
- 关系运算符 value [or|and 条件2] 2. 关系运算符: >,>=,<,<=, 等于:=,不等于:!= 或 <> null值操作:
- 比较null时,不能使用=或者!= 或者<>,而是使用 is或者is not,在select子句中,使 用关系运算符

3、实验实例

1、创建一个表

create table qfedu01(
id int,
name varchar(20),
birth date,
address varchar(50)
);
##int后面的数字代表的是显示宽度,而varchar后面的数字代表的是字符长度。

2、插入数据

插入数据  100,'jack' ,'shanghai' ,下面是两种插入方式,第二种可以批量插入。只需添加多个用
逗号隔开即可
insert into qfedu01 values (101,'jack',null,'shanghai');
insert into qfedu01(id,name,address) values(102,'rose','beijing');

3、删除数据

# 删除表qfedu01中的所有数据。
delete from qfedu01;
# 删除表中qfedu01中的id为101的记录。
delete from qfedu01 where id=101;
# 删除表qfedu01中 id为102和地址为上海的的数据
select * from qfedu01;
delete from qfedu01 where id=102 and address='shanghai';

4、修改数据

# 修改表 qfedu01 中的字段 address 为中国。
update qfedu01 set address='china';
# 修改表 qfedu01 中的 id 为 102 的 address 为english,人名为 micheal。
update qfedu01 set address='english',name='micheal' where id=102;
# 将生日为 null 的记录的 name 改为 'general'
update qfedu01 set name='general' where tbirth is null;
# 将 id 为 101 的 birth 改为'2000-8-8';
update qfedu01 set birth = '2000-8-8' where id = 101;
# 将 id 为 102 的 address 改为 null.
update qfedu01 set address=null where id=102;

3、事物控制语言(TCL)
事物控制语言 (Transation Control Language) 有时可能需要使用 DML 进行批量数据的删除, 修改,增加。比如,在一个员工系统中,想删除一个人的信息。除了删除这个人的基本信息外,还 应该删除与此人有关的其他信息,如邮箱,地址等等。那么从开始执行到结束,就会构成一个事 务。对于事务,要保证事务的完整性。要么成功,要么撤回。

事务要符合四个条件(ACID):

  1. 原子性(Atomicity):事务要么成功,要么撤回。不可切割性。
  2. 一致性(Consistency):事务开始前和结束后,要保证数据的一致性。转账前账号A和账号B的钱的 总数为10000,转账后账号A和账号B的前的总数应该还是10000;
  3. 隔离性(Isolation):当涉及到多用户操作同一张表时,数据库会为每一个用户开启一个事务。那么 当其中一个事务正在进行时,其他事务应该处于等待状态。保证事务之间不会受影响。
  4. 持久性(Durability):当一个事务被提交后,我们要保证数据库里的数据是永久改变的。即使数据 库崩溃了,我们也要保证事务的完整性。
  • commit 提交
  • rollback 撤回,回滚。
  • savepoint 保存点
  • 只有DML操作会触发一个事务。存储引擎(ENGINE):就是指表类型.当存储引擎为innodb时,才支 持事务。默认的存储引擎为 Myisam。不支持事务。
  • 事务的验证: 第一步:start transaction (交易) 第二步:savepoint 保存点名称。 第三步:DML 第四步: commit/rollback;

4、数据查询语言(DQL)
数据查询语言(Data Query Language)

1、Select/for 基本查询语句

格式: select子句  from子句     select colName[,colName.......]
from tablname;

2、给列起别名

格式: select 列名1 as "要起的名" [, 列名2 as "要起的名" ,... ]  from tablname;

3、Where子句

作用:在增删改查时,起到条件限制的作用
多条件写法:in | not in (集合元素,使用逗号分开); 注意:同一个字段有多个值的情况下使用。
in 相当于 or, not in 相当于 and
all | any 与集合连用,此时集合中的元素不能是固定的必须是从表中查询到的数据。
范围查询:colName between val1 and val2; 查询指定列名下的val1到val2范围中的数据
模糊查询:like
1. 通配符:% 表示0或0个以上字符。_ 表示匹配一个字符
2. 格式: colName like value;

4、 实验实例

1、创建表

2、添加 数据

3、查询数据

# 查询员工表 qfedu 中的 员工姓名,员工职位,员工入职日期和员工所在部门。
select name,job,hiredate,deptid from qfedu;

4、给列起别名

# 查询员工姓名和员工职位。分别起别名,姓名和职位。
select name as "姓名" ,job as "职位" from qfedu;

5、Where 子句

# 查询员工表中部门号为 10 和 20 的员工的编号,姓名,职位,工资
select qfeduid,name,job,sal from qfedu where deptid=10 or deptid =20;
# 查询员工表中部门号不是 10 和 20 的员工的所有信息。
select * from qfedu where deptid<>10 and deptid<>20;
# 使用in ,not in修改上面的练习
select qfeduid,name,job,sal from qfedu where deptid in(10,20);
select * from qfedu where deptid not in (10,20);

6、All|Any与集合连用

# 查询员工qfedu,blake,clark三个人的工资
select * from qfedu where sal>all(select sal from qfedu where name in
('qfedu','blake','clark'));

7、范围查询

# 查询工资大于等于1500并且小于等于2500的员工的所有信息。
select * from qfedu where sal between 1500 and 2500;
# 查询工资小于2000和工资大于2500的所有员工信息。
select * from qfedu where sal not between 2000 and 2500;

8、模糊查询:like

# 查询员工姓名中有a和s的员工信息。
select name,job,sal,comm,deptid from qfedu where name like '%a%' and name like
'%s%';
select name,job,sal,comm,deptid from qfedu where name like '%a%s%' or name like
'%s%a%';

4、排序查询

Order By子句

  • 当在查询表中数据时,记录比较多,有可能需要进行排序,此时可以使用 order by子句。
  • 语法:
select...from tablname [where 子句][order by 子句]> select * from t2 order by chinese;                #以指定字段值chinese升序排列> select * from t2 order by chinese desc;            #desc: 逆序> select * from t2 order by chinese desc limit 2;   #只显示前几条记录

5、Distinct 去重

  • 有的时候我们需要对重复的记录进行去重操作,比如,查询表中有哪些职位,此时,一种职位只需 要显示一条记录就够
  • 位置:必须写在select关键字后
select distinct name from qfedu;

6、分组查询 Group By 子句

  • 分组查询与分组函数(聚合函数):有的时候,我们可能需要查询表中的记录总数,或者查询表中每 个部门的总工资,平均工资,总人数。这种情况需要对表中的数据进行分组统计。需要group by子 句。

位置:

select...from name [where 条件] [group by子句] [order by子句]

用法:

group by Field1[,Field2]

注意:在分组查询时,select子句中的字段,除了聚合函数外,只能写分组字段。

# 查询以部门id为分组员工的平均工资
select deptid,avg(sal) as av from qfedu group by deptid;

集合函数:

- 1. count(Filed) 统计指定字段的记录数。2. sum(Filed) 统计指定字段的和。3. avg(Filed) 统计指定字段的平均值 4. max(Filed) 返回指定字段中的最大值。 5. min(Filed) 返回指定字段中的最小值。
- 聚合函数会忽略null值。因此有时候需要使用函数:ifnull(field,value) (如果field字段对应的值不 是null,就使用field的值,如果是null,就使用value.)
- 注意:多字段分组时(多表联合查询时不加任何条件),最多分组的数目为 Filed1Field2[Filed3....]

7、分组查询添加条件 Having 子句

  • 在分组查询时,有的时候可能需要再次使用条件进行过滤,这个时候不能 where子句,应该使用 having子句。having子句后可以使用聚合函数
  • 位置:位于group by子句后
    # 查询以部门id为分组员工的平均工资并且大于2000的部门
select deptid,avg(sal) as av from qfedu group by deptid having avg(sal)>2000;

8、基本查询总结

  • 基本的查询语句包含的子句有:select子句,from子句,where子句,group by子句,having子 句,order by子句
- 完整的查询语句: select..from..[where..][group by..][having..][order by..]
  • 执行顺序:先执行from子句,再执行where子句,然后group by子句,再次having子句,之后 select子句,最后order by子句

9、高级关联查询

  • 有的时候,查询的数据一个简单的查询语句满足不了,并且使用的数据在表中不能直观体现出来。 而是需要预先经过一次查询才会有所体现。先执行的子查询。子查询嵌入到的查询语句称之为父查 询。
  • 子查询返回的数据特点:
    1. 可能是单行单列的数据。
    2. 可能是多行单列的数据
    3. 可能是单行多列的数据
    4. 可能是多行多列的数据
  • 子查询可以在where、from、having、select字句中,在select子句中时相当于外连接的另外一种 写法。
# 查询表中各部门人员中大于部门平均工资的人
select name,sal,a.deptid ,b.av
from qfedu a,
(select deptid,avg(ifnull(sal,0)) as av from qfedu group by deptid) b
where a.deptid=b.deptid and a.sal>b.av
order by deptid ASC;> select * from t2 where english=(select max(english) from t2);    #子查询

10查询数据

1.语法

select 列1, 列2 from 表名; (*代表查询所有的列)
select * from 表名; (*代表查询所有的列)

2.实例

mysql> select * from t1;
+------+------+------+
| id   | name | age |
+------+------+------+
|    1 | qfx | NULL |
|    2 | qf2 | NULL |
|    3 | qf3 | NULL |
|    4 | qf4 | NULL |
|    5 | qf3 | NULL |
+------+------+------+
6 rows in set (0.00 sec)# between..and...: 取值范围是闭区间mysql> select * from t1 where id between 2 and 3;
+------+------+------+
| id   | name | age |
+------+------+------+
|    2 | qf2 | NULL |
|    3 | qf3 | NULL |
+------+------+------+
2 rows in set (0.00 sec)# 避免重复DISTINCT
mysql> insert into t1 (id, name) values (5, 'qf3');
Query OK, 1 row affected (0.00 sec)
mysql> select * from t1;
+------+------+
| id   | name |
+------+------+
|    1 | qfx |
|    2 | qf2 |
|    3 | qf3 |
|    4 | qf4 |
|    5 | qf3 |
+------+------+
5 rows in set (0.00 sec)
mysql> select distinct name from t1;
+------+
| name |
+------+
| qfx |
| qf2 |
| qf3 |
| qf4 |
+------+
4 rows in set (0.00 sec)# 通过四则运算查询 (不要用)
mysql> alter table t1 add age int;
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0  Warnings: 0
mysql> insert into t1 (id, name,age) values (5, 'qf3',10);
Query OK, 1 row affected (0.01 sec)
mysql> select * from t1;
+------+------+------+
| id   | name | age |
+------+------+------+
|    1 | qfx | NULL |
|    2 | qf2 | NULL |
|    3 | qf3 | NULL |
|    4 | qf4 | NULL |
|    5 | qf3 | NULL |
|    5 | qf3 |   10 |
+------+------+------+
6 rows in set (0.00 sec)
mysql> select name, age*10 from t1;
+------+--------+
| name | age*10 |
+------+--------+
| qfx |   NULL |
| qf2 |   NULL |
| qf3 |   NULL |
| qf4 |   NULL |
| qf3 |   NULL |
| qf3 |    100 |
+------+--------+
6 rows in set (0.00 sec)
mysql>  select name, age*10 as age from t1;
+------+------+
| name | age |
+------+------+
| qfx | NULL |
| qf2 | NULL |
| qf3 | NULL |
| qf4 | NULL |
| qf3 | NULL |
| qf3 |  100 |
+------+------+
6 rows in set (0.00 sec)
mysql> select * from t1 where id in (3,5,6);
+------+------+------+
| id   | name | age |
+------+------+------+
|    3 | qf3 | NULL |
|    5 | qf3 | NULL |
|    5 | qf3 |   10 |
+------+------+------+
3 rows in set (0.00 sec)
# like : 模糊查询
# 以x开头:
mysql> select * from t1 where name like 'q%';
#like通配符   %: 所有    _: 任意单个字符
+------+------+------+
| id   | name | age |
+------+------+------+
|    1 | qfx | NULL |
|    2 | qf2 | NULL |
|    3 | qf3 | NULL |
|    4 | qf4 | NULL |
|    5 | qf3 | NULL |
|    5 | qf3 |   10 |
+------+------+------+
6 rows in set (0.00 sec)3、查询时用‘Name Is Null’ 作为条件
4、查询时用‘Name=’‘ ’作为查询条件
# 以x结尾
mysql> select * from t1 where name like '%3';
+------+------+------+
| id   | name | age |
+------+------+------+
|    3 | qf3 | NULL |
|    5 | qf3 | NULL |
|    5 | qf3 |   10 |
+------+------+------+
3 rows in set (0.00 sec)# 包含x的:
mysql> select * from t1 where name like '%2%';
+------+------+------+
| id   | name | age |
+------+------+------+
|    2 | qf2 | NULL |
+------+------+------+
1 row in set (0.00 sec)

11.单表操作

1、单表查询的语法

select 字段1,字段2 from 表名  where 条件group by fieldhaving 筛选order by fieldlimit 限制条数

2、分组:Group By

- 分组指的是:将所有记录按照某个相同字段进行归类,比如针对员工信息表的职位分组,或者按照 性别进行分组等
- 用法:select 聚合函数,字段名 from 表名 group by 分组的字段;
- group by 是分组的关键词, 必须和聚合函数 一起出现 where 条件语句和 group by 分组语句的先后顺序:
- where > group by > having

实例
1、以性别为例, 进行分组, 统计一下男生和女生的人数是多少个

mysql> select count(id), gender from qfedu group by gender;
±----------±-------+
| count(id) | gender |
±----------±-------+
| 10 | male |
| 8 | female |
±----------±-------+
2 rows in set (0.00 sec)

2、对部门进行分组, 求出每个部门年龄最大的那个人 注意: 出现

sql_mode=only_full_group_by 错误 需修改 配置文件/ etc/my.cnf [mysqld] 段添加 sql模式,重启 mysqld
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_
ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION mysql> select depart_id,name, max(age) from qfedu group by depart_id;
+-----------+---------+----------+=
| depart_id | name   | max(age) |
+-----------+---------+----------+
|         1 | egon   |       81 |
|         2 | meiling |       48 |
|         3 | zhangye |       28 |
+-----------+---------+----------+
3 rows in set (0.00 sec)

3、Min : 求最小的

4、Sum : 求和

mysql> select depart_id, sum(age) from qfedu group by depart_id;
+-----------+----------+
| depart_id | sum(age) |
+-----------+----------+
|         1 |      362 |
|         2 |      150 |
|         3 |      100 |
+-----------+----------+
3 rows in set (0.00 sec)

5、Count : 计数

mysql> select depart_id,count(depart_id) from qfedu group by depart_id;
+-----------+------------------+
| depart_id | count(depart_id) |
+-----------+------------------+
|         1 |                8 |
|         2 |                5 |
|         3 |                5 |
+-----------+------------------+
3 rows in set (0.00 sec)

6、Avg : 平均数

 mysql> select depart_id, avg(age) from qfedu group by depart_id;+-----------+----------+| depart_id | avg(age) |+-----------+----------+|         1 |  45.2500 ||         2 |  30.0000 ||         3 |  20.0000 |+-----------+----------+3 rows in set (0.00 sec)

3、Having

- Having 用于对 Group By 之后的数据进行进一步的筛选 mysql> select depart_id, avg(age) from qfedu group by depart_id havingavg(age)>35;+-----------+----------+| depart_id | avg(age) |+-----------+----------+|         1 |  45.2500 |+-----------+----------+1 row in set (0.01 sec)

4、Order By: Order By 字段名 Asc(升序)/Desc(降序)

- 对多个字段进行排序
- age asc, depart_id desc; 表示先对age进行降序,再把age相等的行按部门号进行升序排列 mysql> select * from qfedu order by age asc, depart_id desc;

结构化查询语言 SQL相关推荐

  1. 【数据库原理及应用】经典题库附答案(14章全)——第三章:结构化查询语言SQL

    [数据库原理及应用]经典题库附答案(14章全)--第一章:数据库基础知识 [数据库原理及应用]经典题库附答案(14章全)--第二章:关系数据库知识 [数据库原理及应用]经典题库附答案(14章全)--第 ...

  2. 数据库-结构化查询语言SQL概述

    一.什么是SQL 概念 结构化查询语言 用于访问和操作数据库的标准计算机语言 2.用途 操作数据库对象 表记录的增删改查 二.使用SQL重要性 增加数据库处理效率,减少应用响应时间 减少数据库服务器负 ...

  3. 结构化查询语言SQL

    结构化查询语言(Structured Query Language)简称SQL,是一种数据库查询和程序设计语言,用于存取数据以及查询.更新和管理关系数据库系统. SQL分类 SQL语言按照不同的功能可 ...

  4. 结构化查询语言SQL基本功能及其概念

    SQL语法 可以把SQL分为两部分数据操作语言DML和数据定义语言DDL. SQL(结构化查询语言)有用于执行查询.更新.删除.插入记录的语法. SQL的DML部分: select-从数据库表中获取数 ...

  5. MYSQL数据库头歌实验平台答案(中央财经大学)第6章 结构化查询语言SQL(5)-连接查询

    第1关 内连接查询 SE School;########## 查询数据表中学生姓名和对应的班级 ########## #请在此处添加实现代码 ########## Begin ########## s ...

  6. SQL学习笔记三——结构化查询语言

    数据库系统-结构化查询语言 SQL数据定义 SQL基本数据类型 数值型 INT/INTEGER:整数,取值范围取决于DBMS实现 SMALLINT:整数,取值范围比INT小 BIGINT:整数,取值范 ...

  7. MySQL基础--(2) [SQL(结构化查询语言), DDL(数据定义语言)]

    目录 Sql(结构化查询语言) sql的概念以及特点 DDL(数据定义语言) 创建,删除,修改数据库. 数据库存储数据的特点 数据库表 数据库表中数据的数据类型 数据库表中数据的约束 创建表 设置修改 ...

  8. 结构化查询语言包含哪些方面?

    结构化查询语言SQL(STRUCTURED QUERY LANGUAGE)是最重要的关系数据库操作语言,并且它的影响已经超出数据库领域,得到其他领域的重视和采用,如人工智能领域的数据检索,第四代软件开 ...

  9. 数据库:结构化查询语言

    在开始编写文章前,有几个问题需要思考一下: 什么是结构化查询语言 结构化查询语言分类 1. 什么是结构化查询语言 SQL 是非过程化语言:只需要知道要做什么,不必担心如何去做.美国国家标准学会(ANS ...

最新文章

  1. 【直播】王茂霖:二手车交易价格预测-千变万化特征工程(河北高校数据挖掘邀请赛)
  2. android rebound平移,Android 仿 IOS 拖拽回弹之进阶 ReboundFrameLayout
  3. python爬虫之路自学教程_python 爬虫学习之路
  4. 《区块链开发指南》一一第1章 区块链基础
  5. 程序员面试金典 - 面试题 16.21. 交换和(哈希set)
  6. 案例解读:Oracle目录由于TFA触发bug导致jdb文件未自动清理引起空间不足
  7. 风控策略分析中最重要的五步心法
  8. 多个notification引发的问题
  9. 数据结构:二维ST表
  10. 手把手教你搭建FastDFS集群(上)
  11. 软件测试常用方法实例与分析
  12. 脑电EEG代码开源分享 【2.预处理-静息态篇】
  13. 致远OA任意管理员登陆漏洞分析
  14. 外滩画报:揭秘全球电子垃圾坟墓
  15. 【项目实战】Python基于孤立森林算法(IsolationForest)实现数据异常值检测项目实战
  16. 解决网页中文字无法选中的问题
  17. 不允许一个用户使用一个以上用户名与服务器或共享资源的多重连接,中断与此服务器或共享资源的所有连接,然后再试一次
  18. 英语发音规则---ir字母组合发音规律
  19. Qt学习(一)模型与视图
  20. Mac的自带软件grapher

热门文章

  1. 百度AI深度学习课程 作业1--爬取《乘风破浪的姐姐》所有选手信息
  2. Python利用matplotlib做图中图及次坐标轴
  3. Efficient SR挑战赛结果| AIM 2020 Challenge on Efficient Super-Resolution:Methods and Results
  4. freopen读取文件
  5. HttpEntity接口的详细解释与应用
  6. 18.04.06 魔兽世界三(开战)
  7. 下采样downsamp和上采样upsample
  8. 货运物流app开发 为货主和物流公司提供一个方便的平台
  9. 用postman和ab工具模拟并发请求
  10. FX3开发入门系列EZ-USB FX3 Software Development Kit