当前位置:   article > 正文

SQL语句学习(大数据)

sql语句学习

一、SQL语句的分类

  • SQL: Structured Query Language(结构化查询语言),SQL最早是被美国国家标准局(ANSI)确定为关系型数据库语言的美国标准。后来被国际化标准组织(ISO)采纳为关系型数据库语言的国际标准。
  • DDL(Data Definition Language):数据定义语言,用来定义数据库对象(数据库、表、列)创建一个数据库、创建表、添加字段等。
  • DML(Data Manipulation Language):数据操作语言,用于定义数据库记录(数据)数据的新增、修改、删除。
  • DQL(Data Query Language):数据查询语言,用于查询记录(数据)专门针对数据的查询的。
  • TCL(Transaction Control Language):事务控制语言,DCL(Data Control Language):数据控制语言,用于定义访问权限和安全级别控制事务、添加用户、赋予权限、修改密码等。

注:``  该符号是esc 键下的那个符号 一个表名或者一个字段名添加 `` 可以防止表名和字段名跟关键字冲突,一般创建表的时候都应该写上。 若所建表的表名与关键字相同,则在增删改查的时候也需要加上``。

二、 DDL数据定义语句(Data Definition Language)

注:SQL语句中的关键字都可大写,大写效率高,但为了人看的方便,所以会统一小写。

对数据库的操作 

  1. # 数据库的操作
  2. # 展示所有的数据库
  3. show databases;
  4. # 创建数据库
  5. create database mydb01;
  6. # 创建数据库,并采用指定的字符集
  7. create database mydb02 character set utf8;
  8. # 查看数据库(了解)
  9. # 查看创建数据库mydb01定义的信息
  10. show create database mydb01;
  11. # 将数据库mydb01的字符集修改为GBK
  12. alter database mydb01 character set gbk;
  13. # 删除数据库(一般不能删)
  14. drop database mydb01;
  15. # 切换当前使用的数据库
  16. use mydb01;
  17. # 查询当前使用的数据库(显示该数据库中的内容)
  18. select database();

  1. # 表的增删改查操作
  2. # 展示该数据库中的所有表
  3. show tables;
  4. # 创建一个表
  5. 语法:
  6. create table 表名( 字段一 数据类型(数据长度),.....);
  7. 实例:
  8. create table stu (
  9. name varchar(255),
  10. phone varchar(11),
  11. age int(3)
  12. );
  13. # 查看表结构:
  14. desc stu;
  15. # 查看创建一个表的信息
  16. show create table stu;
  17. # 在sql语句中 # 后面的语句不执行,代表注释
  18. # 修改表已有的名字
  19. alter table stu rename to student;
  20. # 给一张表添加一个字段
  21. alter table stu add score double(5,2);
  22. # 修改一张表的字段类型(int默认11位)
  23. alter table stu modify score int;
  24. # 修改一张表的字段名
  25. alter table stu change name uname varchar(50);
  26. # 修改一张表的字符集
  27. alter table stu character set gbk;
  28. # 修改表添加一个身高字段
  29. alter table student add height double(5,2);
  30. # 删除一张表中的某个字段
  31. alter table stu drop score;
  32. # 表的删除
  33. drop table stu;
  34. # 创建一个跟这个表一模一样的表,结构相同
  35. create table stu2 like stu;
  36. # 创建一个表,表结构跟另一个表一模一样,并且数据也跟它一模一样,类似于copy 某个表
  37. create table stu3 as select * from stu;

DDL语句作用:

  •    数据库的新增修改删除查看。
  •    表的新增修改删除查看
  •    表字段的新增修改删除查看(已经涵盖在了表的修改操作中了) 

 常见的数据类型:

 三、DML数据操作语句(Data Manipulation Language)

 DML指的是对数据库中的数据进行增、删、改的操作。

INSERT INTO 表名(列名1,列名2 ...)VALUES(列值1,列值2...);注意:列名与列值的类型、个数、顺序要一一对应。

  1. # 进入需要要进行数据处理的数据库
  2. mysql> use mydb03;
  3. Database changed
  4. # 查看数据库中信息
  5. mysql> show tables;
  6. +------------------+
  7. | Tables_in_mydb03 |
  8. +------------------+
  9. | stu |
  10. +------------------+
  11. # 查看需要处理表的信息
  12. mysql> desc stu;
  13. +--------+--------------+------+-----+---------+-------+
  14. | Field | Type | Null | Key | Default | Extra |
  15. +--------+--------------+------+-----+---------+-------+
  16. | name | varchar(255) | YES | | NULL | |
  17. | age | int(11) | YES | | NULL | |
  18. | height | double(5,2) | YES | | NULL | |
  19. +--------+--------------+------+-----+---------+-------+
  20. # 增添数据信息
  21. mysql> insert into stu(name,age,height) values('zhangsan',22,190.9);
  22. # insert into 表名 如果表名后面不添加任何的字段名,就是向所有字段插入值。
  23. mysql> insert into stu values('wangwu',24,175.7);
  24. # 该语句是查询语句,表示查询表stu中所有的数据
  25. mysql> select * from stu;
  26. # insert into 表名 如果表名后面添加字段名,说明想向这个字段设置值,其他字段默认为空(null)。
  27. mysql> insert into stu(name) values('zhaoliu');

从stu中,查询数据导入到emp表中。(要求:表stu与emp中有相对应数据类型,emp中多字段亦可以)

  1. # 从stu中,查询数据导入到emp表中
  2. insert into emp(sname,sage,sheight) select * from stu;
  3. # eg:
  4. mysql> insert into emp(sname,sage,sheight) select * from stu;
  5. Query OK, 4 rows affected (0.11 sec)
  6. Records: 4 Duplicates: 0 Warnings: 0
  7. mysql> select * from emp;
  8. +----------+------+---------+--------+
  9. | sname | sage | sheight | gender |
  10. +----------+------+---------+--------+
  11. | zhangsan | 22 | 191 | NULL |
  12. | lisi | 23 | 180 | NULL |
  13. | wangwu | 24 | 175 | NULL |
  14. | zhaoliu | NULL | NULL | NULL |
  15. +----------+------+---------+--------+
  16. 4 rows in set (0.07 sec)

select 语句查询出来的数量以及字段类型和顺序都必须 和 insert into 中表的字段数量、类型、顺序一样,跟表名字、表字段的名字没有半毛钱关系。

对比:
这个语句执行的时候必须有表
insert into 表名  select * from 表2

这个语句执行的时候可以没有表,sql语句帮创建表
create table 表名 as select * from 表2

删除数据:

  1. # 删除数据
  2. delete from stu;
  3. # 删除掉表中所有的数据
  4. truncate table stue;
  5. # DELETETRUNCATE区别
  6. # delete删除表中的数据,表结构还在;删除的数据可以恢复。
  7. # truncate是直接将表DROP掉,然后再按照原来的结构重新创建一张表。数据不可恢复。
  8. # truncate删除效率比delete高。
  9. delete from stu where name='zhaoliu';
  10. # where 后面可以添加条件,满足条件的删除掉

where条件:

修改数据:

考虑语法:
UPDATE 表名 SET 列名1=列值1,列名2=列值2 。。。 WHERE 列名=值

  1. # eg:只要这个同学姓张,就加10
  2. # score = 10 是将 score 的数据重置为 10
  3. update student set score = 10 where name like '张%';
  4. # 修改为
  5. update student set score = score + 10 where name like '张%';
  6. # 将姓名为’lisi’的员工薪水修改为4000元,job改为ccc。
  7. update emp set salary=4000,job='ccc' where name=';isi';

四、DQL:数据查询语句(Data Query Language)

语法:select ... from ...;
select [distinct] ... from ... where ...group by ... having ...order by ... limit ...;

# 注:特别是大数据查询的时候一定记得不要select * from 表 ;要么加条件,要么加limit 

什么地方可以使用别名,什么地方不可以?

结论:

  • mysql中 group by order by having 后面可以使用别名,where后面不能使用别名
  • Oracle中 order by 可以使用别名,group by having where 中不能使用别名。

注: 这里使用别名是来简化sql语句的书写。

基础查询 

  1. # 基础查寻
  2. # 查询所有列
  3. select * from stu;
  4. # 查询指定列
  5. select sname,age from stu;
  6. # 条件查询
  7. # 查询性别为女,并且年龄小于50的记录
  8. select * from stu where gender = 'female' and age <50;
  9. # 查询学号为S_1001,或者姓名为liSi的记录
  10. select * from stu where sid = 'S_1001' or sname = 'liSi';
  11. # 查询学号为S_1001,S_1002,S_1003的记录
  12. select * from stu where sid in ('S_1001','S_1002','S_1003');
  13. # 查询学号不为S_1001,S_1002,S_1003的记录
  14. select * from stu where sid not in ('S_1001','S_1002','S_1003');
  15. # 按照模糊的条件进行查询,可以使用like条件,或者regexp。
  16. # % : 代表0个或者多个字符
  17. # _ : 代表任意一个字符
  18. # 查询所有的姓名以s开头的学生
  19. select * from stu where sname like 's%';
  20. # 查询所有的姓名以s开头的,且长度为5的学生
  21. select * from stu where sname like 's____';

字段控制

  1. # (distinct) 字段可以去重相同的就展示一次
  2. # emp中工资都有哪些挡位
  3. select distinct sal from emp;
  4. # 列之间的计算
  5. # 计算每一个员工的薪水 (工资 + 绩效)
  6. select ename,sal + ifnull(comm,0) from emp;
  7. ifnull 是一个函数,函数就是工具,会用即可。
  8. # eg:select database();不同函数有不同函数的用法,见一个记住一个,多多益善!
  9. # 给列名添加别名(加不加''都可以)
  10. select ename 姓名, sal + ifnull(comm,0) 薪水 from emp;
  11. select ename '姓名', sal + ifnull(comm,0) '薪水' from emp;
  12. # 列的排序
  13. 查询所有学生记录,按年龄升序排序
  14. select * from stu order by age asc;
  15. select * from stu order by age ;
  16. # 两个查询结果一样,说明order by 默认按照升序排序,asc可写可不写。
  17. # 查询所有学生记录,按年龄降序排序
  18. select * from stu order by age desc;
  19. # desc: desc 表名 --> 查看表结构
  20. # order by 字段名 desc --> 按照该字段降序排序
  21. # 查询所有雇员,按月薪降序排序,如果月薪相同时,按编号升序排序
  22. select * from emp order by sal desc, empno asc;
  23. # order by 字段1 ,字段2 字段二有可能用不上。
  24. # order by 字段1 字段1是排序的主要字段,只有该字段相同的时候,才会用到第二个字段,假如没有第二个字段。
  25. # 聚合函数
  26. # max(): 计算指定列数据的最大值
  27. # min(): 计算指定列数据的最小值
  28. # count(): 计算指定列不为NULL的数据的数量
  29. # sum(): 计算指定列的数值的和,如果计算的列的类型不是数值类型,计算结果为0
  30. # avg(): 计算指定列的数值的平均值,如果计算的列的类型不是数值类型,计算的结果为0
  31. select max(sal) from emp;
  32. select min(sal) from emp;
  33. # 月薪是1250的员工有多少人
  34. select count(*) from emp where sal = 1250;
  35. # 统计员工人数
  36. select count(*) from emp;
  37. select count(empno) from emp;
  38. # count(字段) 如果该字段为null ,不累加(sum函数相同)
  39. # eg:select count(comm) from emp;
  40. select count(1) from emp;
  41. # 建议使用count(*) 因为这个是标准写法, count(*) 和 count(1) 效率一样
  42. # count(字段) 会慢一些,原因是要判断该字段是否为null
  43. # 求平均工资
  44. select avg(sal) from emp;
  45. select sum(sal) / count(*) from emp;
  46. # 分组查询
  47. # stu 按照性别分组
  48. select gender from stu group by gender;
  49. # 分组查询中,selectfrom 之间写分组字段,也可以写聚合函数放在分组字段后面,其他字段不要写
  50. # 按照性别分组,并且告知每个性别的人数
  51. select gender,count(*) from stu group by gender;
  52. # 注:只要是分组查询selectfrom 之间只能是分组字段或者聚合函数,其他写什么都是错!!!
  53. # 查询每一个部门的编号以及这个部门的最高工资(sal)
  54. select deptno,max(sal) from emp group by deptno;
  55. # 查询每一个工作的名字以及这个工作的人数
  56. select job,count(*) from emp group by job;
  57. # 查询每一个部门、每一个工作的人数
  58. select deptno,job,count(*) from emp group by deptno,job;
  59. # 注:这里count()放在job后面自然就是作用于job这个字段
  60. # 查询平均工资高于3000的部门编号及平均工资
  61. select deptno,avg(sal) from emp group by deptno having avg(sal) > 3000;
  62. # having 的用法:必须和group by 一起使用,作用是分组完之后的数据,进行条件过滤!!!
  63. # where 的用法:条件过滤,每一条数据按照条件进行过滤,跟分组没关系当然过滤完之后还可以进行分组查询。
  64. # 注:1. having需要写在group by之后,where需要写在group by之前。
  65. # 2. having之后可以使用聚合函数,where不可以使用聚合函数。
  66. # 分页查询
  67. # 求工资最高的前5个人
  68. select * from emp order by sal desc limit 5;
  69. # 查询表的前5条数据
  70. select * from emp limit 5;
  71. # 0 指的是起点,5 指的是条数
  72. select * from emp limit 0,5;
  73. # 注:特别是大数据查询的时候一定记得不要select * from 表 ;要么加条件,要么加limit

SQL的书写顺序 

 select ... from 表名 where ... group by ... having ... order by ...  limit ....;

SQL的执行顺序

from...  where...  group by ... having... select...  order by... limit...;

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号