SQL语言基础知识(二)

简介: 向员工表中插入一条记录,要求符合以下条件

01

INSERT练习


向员工表中插入一条记录,要求符合以下条件:

  • 员工号为6
  • 姓名为“kevin”
  • 部门号为1
  • 工资为10000.00
  • 其它字段为空

参考答案如下:


insert into emp(empno,ename,deptno,sal) values(6,'Kevin',1,10000.00);


02

SELECT查询


SELECT中的字段



-- columns in SELECT statementselect * from emp;select EMPNO,ENAME,DEPTNO,HIREDATE,SAL,COMM from emp;-- 上面两个SQL语句的效果一样,但规范的做法是把每个select字段都写出来
-- 查询部分字段select ename,sal from emp;select ename,sal,sal*12 from emp;select ename,sal,sal*12 as annual_salary from emp;-- as也可以省略select ename,sal,sal*12 annual_salary from emp;-- 对查询的字段可以增加别名增加字段的可读性-- 为了更加容易阅读,我们甚至可以使用汉字,这对中国人更加友好select ename,sal,sal*12 annual salary from emp; -- 出错select ename,sal,sal*12 "annual salary" from emp;select ename,sal,sal*12 select from emp;select ename,sal,sal*12 "select" from emp;select sal,sal/100 sal% from emp;select sal,sal/100 "sal%" from emp;


对查询的字段可以增加别名增加字段的可读性

练习

编写一个SQL语句,输出下面的结果(注意设置字段的别名是中文):


答案:






mysql> select empno 员工号,salary 月薪, salary*14 14薪 from employees;+-----------+----------+-----------+| 员工号    | 月薪     | 14薪      |+-----------+----------+-----------+|         1 | 20000.00 | 280000.00 ||         2 | 19100.00 | 267400.00 ||         3 | 23900.00 | 334600.00 ||         4 | 15000.00 | 210000.00 ||         5 | 14200.00 | 198800.00 ||         6 |  9700.00 | 135800.00 ||         7 |  8900.00 | 124600.00 ||         8 | 14900.00 | 208600.00 ||         9 | 15000.00 | 210000.00 |+-----------+----------+-----------+9 rows in set (0.00 sec)


DISTINCT 去重复值


同一字段中可能会出现重复值,使用关键词distinct可以去掉重复值,用法如下:

select distinct 字段名 from 表名;

使用下面的SQL语句查询出员工表中的所有的部门:



-- the DISTINCT keyword select deptno from emp;
select distinct deptno from emp;

但这些部门中有重复的,我们可能只想知道有哪些部门,可以加上distinct关键字去掉重复的记录。


WHERE条件过滤


where的用法

如果需要从表中选取指定的数据,可将where子句添加到select语句,语法如下:

select 字段名 from 表名 where 字段 运算符 值;

where子句中的运算符




-- the WHERE clause-- 查询2010年之后入职的员工select ename,sal,deptno,hiredate from emp where hiredate>='2010-01-01';
select ename,sal,deptno,hiredate from emp where sal<10000;select ename,sal,deptno,hiredate from emp where deptno=3;-- 查询3部门的员工信息
-- 查询不是3部门的员工信息select ename,sal,deptno,hiredate from emp where deptno!=3;-- 另一种不等于的写法select ename,sal,deptno,hiredate from emp where deptno<>3;

下面的运算符可在 WHERE 子句中使用:



运算符 说明
= 等于
<> 或!= 不等于
> 大于
< 小于
>= 大于等于
<= 小于等于


AND、OR 和NOT运算符


and和or可以用在where子句中把两个或多个条件结合起来。and 运算符要求两个条件都成立;or运算符要求二个条件中只要有一个成立即可。语法如下:

下面的SQL语句查询出第2部门里工资大于等于一万的员工:






-- The AND,OR and NOT Operatorsselect * from emp where deptno=2 and sal>=10000; * from emp where deptno=2 or sal>=10000;

下面的SQL语句查询出第2部门或者工资大于等于一万的员工:


select * from emp where deptno=2 or sal>=10000;


AND和OR还可以结合起来使用,例如我们再增加一个and的条件要求在2015年以后入职的员工







postgres=#  select * from employees where deptno=2 or salary>10000 and hire_date>'2015-01-01'; empno |     name     | deptno |        email        | hire_date  |  salary  | managerno | manager_name-------+--------------+--------+---------------------+------------+----------+-----------+--------------     4 | 赵六         |      1 | zhaoliu@qq.com      | 2019-12-01 | 15000.00 |           |     5 | 李明         |      3 | liming@qq.com       | 2021-09-11 | 14200.00 |           |     7 | 钱杰         |      3 | qianjie@outlook.com | 2019-06-12 |  8900.00 |           |     8 | 程娟         |      3 | chengjuan@gmail.com | 2013-07-22 | 14900.00 |           |(4 rows)

很多同学对这个SQL的结果看不懂,例如第二个记录李明的入职时间并不符合2015年以后入职的要求。我们前面讲了运算符的优先级的问题,乘除的优先级高于加减,这里and的优先级高于or,所以这个SQL语句又可以写成






select * from emp where deptno=2 or sal>=10000 and hiredate>'2015-01-01';
select * from emp where deptno=2 or (sal>=10000 and hiredate>'2015-01-01');

这样可读性性就强多了。

NOT可以否定条件,例如







select * from emp where not deptno=2;-- 相当于 select * from emp where deptno!=2;

练习


用两种写法(一种用not,另外一种不用not)写出符合下面条件的SQL。

查询员工表中部门号不是3并且工资大于10000的员工。

参考答案如下:


select * from emp where deptno<>3 and sal>10000;
select * from emp where not (deptno=3 or sal<=10000);


IN匹配多个值


in运算符是在where子句中指定多个搜索条件时可以匹配的值。in运算符实际是多个or条件的合并。语法如下:

select 字段名 from 表名 where 字段名 in(值1,值2,...);

判断1是否在集合内

如果我们查询员工号为3、4或6的员工,我们可以写成




-- the IN operatorselect ename,empno from emp where empno=3 or empno=4 or empno=5;

但是另外一种更加简洁和容易理解的写法是:


select ename,empno from emp where empno in (3,4,5);

这两种写法是等价的,但第二种写法在or的条件中的值多的时候更加有优势。

还可以用NOT判断不包括的值



select ename,empno from emp where empno not in (3,4,5);


BETWEEN指定范围


between运算符用于选取介于两个值之间的数据范围内的值,这些值可以是数字,字符串或日期。between 运算符包括开始和结束值,相当于>= and <=。

语法如下:

select 字段名 from 表名 where 字段名 between 值1 and 值2;

下面的SQL语句查询出在2013年之间入职的员工的姓名:




-- the BETWEEN operatorselect ename,hiredate from emp where hiredate>= '2013-01-01' and hiredate <='2013-12-31';


可以使用between把这个SQL改写成




select ename,hiredate from emp where hiredate between '2013-01-01' and '2013-12-31';

Not between是只不包括,如果把上面的between 改成not between,就是查询出不在2013年入职的员工:



select ename,hiredate from emp where hiredate not between '2013-01-01' and '2013-12-31';

相当于



select ename,hiredate from emp where hiredate<'2013-01-01' or hiredate>'2013-12-31';


LIKE搜索匹配的字符串


在 WHERE 子句中使用 LIKE 运算符来搜索匹配字符串中的指定模式,百分号(%)匹配零个、一个或多个字符,下划线(_)匹配单个字符。语法如下:

select 字段名 from 表名 where 字段 like 字符串;

下面的SQL语句找出名字中"J"开头的员工:





-- the LIKE operatorselect * from emp where ename like 'J%';

我们查询名字中有个“a”字的员工




select * from emp where ename like '%a%';

找出第三个字符是a的




select * from emp where ename like '__a%';

not like与like相反


ORDER BY排序


order by用于对结果集进行排序,默认按升序(asc)进行排序,也可以指定desc按降序对结果集进行排序。语法如下:

select 字段名 from 表名 order by 字段1,字段2,... asc|desc;

下面SQL语句按工资从低到高列出员工姓名和工资:




-- the ORDER BY clauseselect ename,deptno,sal from emp order by sal;

如果要按从高到低输出,加上desc的关键字:



select ename,deptno,sal from emp order by sal desc;

还可以用别名排序

还可以用多字段排序



select ename,deptno,sal from emp order by deptno,sal;

这里是先按部门号,再按工资进行排序。

对不同的字段可以分别采用升序和降序进行排列,其中升序asc默认可以省略。



select ename,deptno,sal from emp order by deptno desc,sal asc;

可以看到MySQL和SQL Server是把NULL作为最大值,而Oracle和PostgreSQL则相反。


SQL语言的注释


单行注释用- - 开头,MySQL还要加一个空格,其它三种数据库不用加空格。

多行注释与C语言相同的程序注释符号,即“/**/”。






-- 单行注释/* 这是一个多行的注视这里是新的一行结束行*/select name from employees where empno=1;

两个减号后面有空格。

如果我们有一个写好的SQL暂时不想执行,也可以用注释封起来



















-- 单行注释/* 多行的注释这里是新的一行结束行*/select ename,sal,hiredate from emp where hiredate>'2020-01-01' order by sal;  -- select ename,sal,hiredate from emp where hiredate>'2020-01-01' order by sal;   /* select ename,sal,hiredate from emp where hiredate>'2020-01-01' order by sal;   */
select ename,sal,hiredate from emp -- where hiredate>'2020-01-01' order by sal;
select ename,sal,hiredate from emp /* where hiredate>'2020-01-01' order by sal */;


未完,请查看SQL语言基础(三)

相关文章
|
3月前
|
SQL 关系型数据库 MySQL
在MySQL中,什么是结构化查询语言 (SQL)
【8月更文挑战第20天】在MySQL中,什么是结构化查询语言 (SQL)
61 1
|
1月前
|
SQL Oracle 关系型数据库
SQL语言的主要标准及其应用技巧
SQL(Structured Query Language)是数据库领域的标准语言,广泛应用于各种数据库管理系统(DBMS)中,如MySQL、Oracle、SQL Server等
|
1月前
|
SQL 关系型数据库 MySQL
Go语言项目高效对接SQL数据库:实践技巧与方法
在Go语言项目中,与SQL数据库进行对接是一项基础且重要的任务
54 11
|
3月前
|
SQL 关系型数据库 MySQL
|
3月前
|
SQL 存储 大数据
SQL 语言发展史简直太震撼啦!从诞生到现代数据处理,见证一场奇妙的演变之旅,快来感受!
【8月更文挑战第31天】SQL(结构化查询语言)自20世纪70年代由IBM研究员E.F. Codd提出以来,已成为现代数据处理不可或缺的一部分。它最初简化了层次和网状模型中复杂的存储与检索问题,通过基本的SELECT、FROM和WHERE关键字实现了数据查询。80年代,SQL在商业数据库中广泛应用,引入了GROUP BY、HAVING和ORDER BY等功能,增强了数据分析能力。90年代,互联网和企业信息化推动了SQL的进一步优化与扩展,支持分布式数据库和数据仓库等技术。
47 0
|
3月前
|
SQL 存储 NoSQL
从SQL到NoSQL:理解不同数据库类型的选择与应用——深入比较数据模型、扩展性、查询语言、一致性和适用场景,为数据存储提供全面决策指南
【8月更文挑战第31天】在信息技术飞速发展的今天,数据库的选择至关重要。传统的SQL数据库因其稳定的事务性和强大的查询能力被广泛应用,而NoSQL数据库则凭借其灵活性和水平扩展性受到关注。本文对比了两种数据库类型的特点,帮助开发者根据应用场景做出合理选择。SQL数据库遵循关系模型,适合处理结构化数据和复杂查询;NoSQL数据库支持多种数据模型,适用于非结构化或半结构化数据。SQL数据库在一致性方面表现优异,但扩展性较差;NoSQL数据库则设计之初便考虑了水平扩展性。SQL使用成熟的SQL语言,NoSQL的查询语言更为灵活。
76 0
|
3月前
|
SQL 数据可视化 数据挖掘
SQL 在数据分析中简直太牛啦!从数据提取到可视化,带你领略强大数据库语言的神奇魅力!
【8月更文挑战第31天】在数据驱动时代,SQL(Structured Query Language)作为强大的数据库查询语言,在数据分析中扮演着关键角色。它不仅能够高效准确地提取所需数据,还能通过丰富的函数和操作符对数据进行清洗与转换,确保其适用于进一步分析。借助 SQL 的聚合、分组及排序功能,用户可以从多角度深入分析数据,为企业决策提供有力支持。尽管 SQL 本身不支持数据可视化,但其查询结果可轻松导出至 Excel、Python、R 等工具中进行可视化处理,帮助用户更直观地理解数据。掌握 SQL 可显著提升数据分析效率,助力挖掘数据价值。
68 0
|
3月前
|
SQL Java 数据库连接
|
3月前
|
SQL 数据库 索引
SQL语言入门:如何表达你的数据需求
在数据库的世界里,SQL(Structured Query Language)是一种至关重要的语言,它允许用户与数据库进行交互,执行数据的查询、更新、插入和删除等操作
|
3月前
|
SQL 关系型数据库 MySQL
Go语言中进行MySQL预处理和SQL注入防护
在现代Web应用开发中,安全性至关重要。SQL注入是一种常见的攻击方式,攻击者可通过构造特殊SQL查询来非法访问或修改数据库数据。本文介绍如何利用Go语言中的预处理SQL语句来防范此类攻击。预处理不仅能提升安全性,还能提高性能并简化代码。通过使用`?`作为占位符,Go自动处理参数转义,有效避免SQL注入。此外,文章还提供了连接MySQL数据库、执行预处理查询以及最佳实践的示例代码。务必遵循这些指导原则,确保应用程序的安全性。
99 0