[SQL入门级] 第一天 SQL初步

SQL语句分为以下三种类型:

  • DML:Data Manipulation Language 数据操纵语言

    1. INSERT

    2. UPDATE
    3. DELETE
    4. SELECT
  • DDL:Data Definition Language 数据定义语言
    1. CREATE TABLE

    2. ALTER TABLE
    3. DROP TABLE
    4. CREATE INDEX
    5. DROP INDEX
  • DCL:Data Control Language 数据控制语言
    1. GRANT 授予访问权限

    2. REMOVE 撤销访问权限
    3. COMMIT 提交事务处理
    4. ROLLBACK 事务处理回退
    5. SAVEPOINT 设置保存点
    6. LOCK 对数据库的特定部分进行锁定

一、基本的SQL-SELECT语句

别名

①直接在字段名后面写  select last_name name,employee_id id from empolyees;

②在字段名后加as  select last_name as name,employee_id as id from empolyees;

③加双引号(当别名由多个单词构成且中间以空格隔开时必用)  select last_name "my name",employee_id as id from empolyees;

连接符

①把列与列,列与字符连接在一起

②用 || 表示

③可以用来‘合成‘列

select last_name||‘`s job_id is ‘||job_id as details from employees

重复行(去重)distinct

select distinct department_id from employees;

注意:null值也单独为一行

注意:字符和日期必须用单引号括起来(SQL中只有在上面提到的别名时会用到双引号,其它情况都用单引号),SQL语言大小写不敏感,但‘‘括起来的字符串严格区分大小写

二、过滤和排序

过滤 where

-- AND OR NOT 逻辑且/逻辑或/逻辑否

-- [NOT] BETWEEN AND 表示区间内的值,包含边界 等价于 >= and <=

-- [NOT] IN 表示离散的值,where department_id in(70,80,90) 等价于 where department_id=70 or department_id=80 or department_id=90

-- [NOT] LIKE 模糊查询

百分号%表示0…n个字符;

下划线_表示单个字符;

转义字符 ESCAPE,where last_name like  ‘%\_%‘ escape ‘\‘ (转义字符可以是任何字符 如 \ # $ 等)

-- IS [NOT] NULL 空值

-- 运算优先级

算术运算符>连接符>比较符>IS NULL,LIKE,IN>BETWEEN>NOT>AND>OR

括号可以改变优先级

排序

ORDER BY … DESC(逆序)/ASC(顺序,默认)

select last_name,department_id,salary*12 annual_sal
from employees

--order by 可以不放在where子句

--where department_id > 80

--多级排序

--依字段别名排序
order by annul_sal,last_name desc

三、单行函数

字符

① 大小写控制函数:因为被单引号括出来的内容是严格区分大小写,而有时候查询不在乎大小写,这时候此类函数派上用场

LOWER(‘SQL Course‘) → sql course    全部小写

UPPER(‘SQL Course‘) → SQL COURSE 全部大写

INITCAP(‘SQL Course‘) → Sql Course  单词首字母大写

② 字符控制函数:

CONCAT(‘Hello‘,‘World‘) → HelloWorld 连接字符串

SUBSTR(‘HelloWorld‘,1,5) → Hello       从第1个下角标位置开始截取长度为5的子字符串--Java中下标从0开始,-1代表无效数据;SQL中下标从1开始,0代表无效数据

LENGTH(‘HelloWorld‘) → 10                字符串长度

INSTER(‘HelloWorld‘,‘W‘) → 6             字符在字符串中的位置

LPAD(salary,10,‘*‘) → *****24000     字符串左对齐,用10个位去存,不足在左端用*补齐

RPAD(salary,10,‘*‘) → 24000*****     字符串右对齐,用10个位去存,不足在右端用*补齐

TRIM(‘H‘ FROM ‘HelloHWorldH‘) → elloHWorld 去除原字符串中首尾与指定字符相同的字符

REPLACE(‘abcdb‘,‘b‘,‘m‘) → amcdm      将字符串中所有与指定字符相同的字符替换为另一个字符

数值

ROUND() 四舍五入

--ROUND(435.45,1) ROUND(435.45) ROUND(435.45,-1)
                         435.5                  435                       440

TRUNC() 截断

--ROUND(435.45,1) ROUND(435.45) ROUND(435.45,-1)
                         435.4                  435                       430

MOD() 求余

--MOD(1600,15)

10

日期:Oracle中的日期型数据实际含有两个值(日期和时间)

在日期上加上或减去一个数字结果仍为日期

两个日期相减返回日期之间相差的天数

MONTHS_BETWEEN 两个日期相差的月数

ADD_MONTHS         向指定日期中加上若干月数

NEXT_DAY              指定日期的下一个星期几对应的日期

LAST_DAY              本月的最后一天

ROUND                   日期四舍五入

TRUNC                    日期截断

数据类型转换

① 隐式 DATE ←→ VARCHAR2 ←→ NUMBER

源数据类型 目标数据类型
VARCHAR2/CHAR NUMBER
VARCHAR2/CHAR DATE
NUMBER VARCHAR2
DATE VARCHAR2

--注意区别,JAVA中+号在字符串运算中代表字符串连接,SQL中字符串连接用的是 ||,+号则表示数学加法运算

select ‘12‘ + 2 from dual; --此处‘12‘隐性转换为NUMBER类型的12

14

② 显式

TO_CHAR

select employee_id,to_char(hire_date,‘yyyy"年"mm"月"dd"日"‘) --此处在输出日期格式中穿插的字符要用""括起来
   from employees
   where to_char(hire_date,‘yyyy/mm/dd‘) = ‘1994/06/07‘  -- to_date(‘1994/06/07‘,‘yyyy/mm/dd‘)

TO_DATE

TO_NUMBER

select to_char(1234567.89,‘999,999,999.99‘) from dual; -- 1,234,567.89      不足不用补零

select to_char(1234567.89,‘000,000,999.99‘) from dual; -- 001,234,567.89   不足位数补零

select to_char(1234567.89,‘$999,999,999.99‘) from dual; -- $1,234,567.89   美元符号

select to_char(1234567.89,‘L999,999,999.99‘) from dual; -- ¥1,234,567.89  本地货币符号

select to_number(‘¥1,234,567.89‘,‘L999,999,999.99‘) from dual; -- 1234567.89 格式要对应上

通用

这些函数适用于任何数据类型,同时也适用于空值

NVL(expr1,expr2) 等价于 expr1!=null?expr1:expr2

--commission_pct 奖金率字段的值有可能为null,是null则用 0 代替

select employee_id,last_name,salary*12*(1+nvl(commission_pct,0)) annual_sal,commission_pct from employees;

--由于department_id是NUMBER类型,而‘没有部门‘是严格的字符类型,直接调用NVL函数报“无效数字”错误,需进行处理

select last_name,nvl(to_char(department_id),‘没有部门‘) from employees;

NVL2(expr1,expr2,expr3) 等价于 expr1!=null?expr2:expr3

select last_name,nvl2(commission_pct,commission_pct + 0.015,0.01) from employees;

NULLIF(expr1,expr2) 等价于 expr1==expr2?null:expr1

select first_name,length(first_name) "expr1",
       last_name,length(last_name) "expr2",
       nullif(length(first_name),length(last_name)) result
from employees

COALESCE(expr1,expr2,…,exprn) 如果第一个表达式为null,则返回下一个表达式,依次迭代

条件表达式(IF-THEN-ELSE逻辑)

① CASE表达式

CASE expr1 WHEN comparison_expr1 THEN return_expr1
  [WHEN comparison_expr2 THEN return_expr2
   WHEN comparison_exprn THEN return_exprn
   ELSE else_expr]

END

--查询部门号为10,20,30的员工信息,若部门号为10,则打印
--其工作的1.1倍,20号部门,1.2倍,30号部门,1.3倍
select employee_id,last_name,department_id,
       case department_id when 10 then salary*1.1
                                    when 20 then salary*1.2
                                    else salary*1.3
                                    end REVISED_SALARY
from employees
where department_id in(10,20,30)

② DECODE函数

select employee_id,last_name,department_id,
       decode(department_id,10,salary*1.1,
                                        20,salary*1.2,
                                        salary*1.3) REVISED_SALARY
from employees
where department_id in(10,20,30)

时间: 2024-10-18 19:53:59

[SQL入门级] 第一天 SQL初步的相关文章

[SQL入门级] 上篇被移出园子首页,那这篇咱就&#39;薄利多销&#39;

这个系列的博文知识回顾sql知识作的记录,温故而知新.上一篇内容达不到知识分享的层级被移出园子首页,对不住各位看官,内容简单了些.下面咱就记录多一些的基础知识,薄利多销: 控制用户权限 • 创建用户 CREATE USER user IDENTIFIED BY password; • 创建用户表空间 ALTER USER user QUOTA UNLIMITED ON users • 赋予系统权限 – CREATE SESSION(创建会话) – CREATE TABLE(创建表) – CREA

第一篇 SQL Server安全概述

本篇文章是SQL Server安全系列的第一篇,详细内容请参考原文. 面对当今复杂的攻击SQL Server有你需要的一切来保护你的服务器和数据.但在你能有效地使用这些安全功能之前,你需要了解你所面临的威胁和一些基本的安全概念.本系列的第一篇将讲解基础知识,可以充分利用SQL Server中的安全功能而不是浪费时间在不能保护你的数据被威胁的功能上.Relational databases are used in an amazing variety of applications with co

第一篇 SQL Server代理概述

本系列文章来源于sqlservercentral,详细内容请参考原文. SQL Server代理是SQL Server的作业调度和告警服务,如果使用得当,它可以大大简化DBA的工作量.SQL Server代理的核心是运行批量作业的能力.“批量”可以简单的理解成“一系列的动作”,经常是TSQL脚本.它们可以以作业的形式在特定的调度运行,这个调度你可以选择在只有少量用户访问系统的时间点/段.换而言之,可以使用SQL Server代理排定批量作业.批量作业可以是平常的T-SQL任务,也可以是运行于多个

第三篇——第二部分——第一文 SQL Server镜像简介

原文:第三篇--第二部分--第一文 SQL Server镜像简介 原文出处:http://blog.csdn.net/dba_huangzj/article/details/26951563 镜像是什么?说白了就是个镜子(没用过镜子?没镜子你总要小便吧?开个玩笑.. ),这里镜子的含义主要有两个:1.一模一样,下面会详细介绍,包括库名.数据文件和日志文件的存放路径都要一样.2.看得到,却"用不了",镜像库在没有做任何处理时是不可访问的.下面进入专业一点的解释: 数据库镜像(SQL Se

PageHelper只对紧跟着的第一条SQL起作用

这个sql的中心思想就是根据查询到的schema然后分别查询schema中的相关数据再用union all将结果及拼接在一起.LocServiceImpl.findAllLoc(Loc loc) @Override public List<Loc> findAllLoc(Loc loc) { try { HashMap<String,Object> map = new HashMap<String,Object>(); List<String> schema

利用pl/sql执行计划评估SQL语句的性能简析

一段SQL代码写好以后,可以通过查看SQL的执行计划,初步预测该SQL在运行时的性能好坏,尤其是在发现某个SQL语句的效率较差时,我们可以通过查看执行计划,分析出该SQL代码的问题所在. 那么,作为开发人员,怎么样比较简单的利用执行计划评估SQL语句的性能呢?总结如下步骤供大家参考: 1. 打开熟悉的查看工具:PL/SQL Developer. 在PL/SQL Developer中写好一段SQL代码后,按F5,PL/SQL Developer会自动打开执行计划窗口,显示该SQL的执行计划. 2.

SQL Server 2012:SQL Server体系结构——一个查询的生命周期(第2部分)

计划缓存(Plan Cache) 如果SQL Server已经找到一个好的方式去执行一段代码时,应该把它作为随后的请求重用,因为生成执行计划是耗费时间且资源密集的,这样做是有有意义的. 如果没找到被缓存的计划,然后命令分析器(Command Parser)在T-SQL基础上生成一个查询树(query tree).查询树(query tree)的内部结构是通过树上的每个结点代表查询中需要的执行操作.这个树然后被传给查询优化器(Query Optimizer)去处理.我们的简单查询没有一个存在的计划

使用sql语句创建修改SQL Server标识列(即自动增长列)

一.标识列的定义以及特点SQL Server中的标识列又称标识符列,习惯上又叫自增列.该种列具有以下三种特点:1.列的数据类型为不带小数的数值类型2.在进行插入(Insert)操作时,该列的值是由系统按一定规律生成,不允许空值3.列值不重复,具有标识表中每一行的作用,每个表只能有一个标识列.由于以上特点,使得标识列在数据库的设计中得到广泛的使用.二.标识列的组成创建一个标识列,通常要指定三个内容:1.类型(type)在SQL Server 2000中,标识列类型必须是数值类型,如下:decima

SQL Server -&gt;&gt; 深入探讨SQL Server 2016新特性之 --- Temporal Table(历史表)

原文:SQL Server ->> 深入探讨SQL Server 2016新特性之 --- Temporal Table(历史表) 作为SQL Server 2016(CTP3.x)的另一个新特性,Temporal Table(历史表)记录了表历史上任何时间点所有的数据改动.Temporal Table其实早在ANSI SQL 2011就提出了,而SAP HANA, DB2和Oracle早已在它们的产品中加入/实现了这一特性.所以说微软其实是落后了几个竞争对手.既然在CTP3.0中加入了,相信