SQL语言基础

2018-08-07  本文已影响0人  Rannio

1.SQL概述

SQL语言(Structured Query Language)是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。

sql 语句就是对数据库进行操作的一种语言。

2.SQL语言分类

1)数据定义语言(DDL)Data Definition language,DDL使我们有创建或删除表格的能力,也可以定义索引(键),规定表与表的连接,以施加表间的约束。

CREATE DATABASE            创建数据库

ALTER DETABASE                修改数据库

CREATE TABLE                      创建新表

ALTER TABLE      修改(改变)数据库表

DROP TABLE                            删除表

CREATE INDEX        创建索引(搜索键)

DROP INDEX                          删除引索

2)数据操控语言(DML)Data Manipulation Language,供用户实现对数据的追加、删除、更新、查询等操作。

SELECT              从数据库表中获取数据

UPDATE              更新数据库表中的数据

DELETE                从数据库表中删除数据

INSERT INTO        向数据库表中插入数据

3)数据控制语言(DCL)Data Control Language。

GRANT                                        授权

REVOKE                                撤销授权

DENY                                    拒绝授权

4)事务控制语言(TCL)Transaction Control Language。

SAVEPOINT                            保存节点

ROLLBAKE                                  回滚

COMMIT                                      提交

3.SQL语言基础

快速了解SQL 的常用定义语句:数据库的创建,表的创建,修改数据库的创建。

CREATE DATABASE 数据库名 [CHARACTER SET 'utf8' COLLATE 'utf8_general_ci'] 设置数据库字符集及字符集校对规则。

【例】CREATE DATABASE exam CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';

切换database:use 数据库名。

【例】USE exam

数据库的修改。

alter database exam character set utf8;

数据库的删除 。

drop database 数据库名

表的创建。

CREATE TABLE 表名(属性1 数据类型[长度] [约束],......) [ENGINE=INNODB DEFAULT CHARSET=utf8];(存储引擎及字符集)如

约束 数据类型介绍:

表的修改

Alter table 表名

添加字段  Alter table add column 列名  类型

添加约束  Alter  table 表名 alter  column  列名  set  default  ‘value';

alter  table  表名  add  constraint  主键名  primary  key  表名(主键字段);

alter  table  表名  add  constraint  外键名  foreign  key  (外键字段)  references  关联表名(关联字段);

修改字段    Alter  table 表名 change  原字段名  新字段名  数据类型  [ 属性 ];

删除字段  alter  table  表名  drop  字段名

修改约束 alter  table  表名  add  constraint  外键名  foreign  key  (外键字段)  references  关联表名(关联字段);

表的删除

Drop table 表名;

表的数据的插入

Insert into 表名(列1,列2,。。。。) values ();

表的数据的更新

update  表名  set  列名  =  更新值 [ where  更新条件];

表的数据的删除

Delete from  表名  [ where  更新条件]。

4.SELECT语句的语法

SELECT { * 、column、[ alias ]、...}

FROM tables

SELECT 识别什么列

FROM    识别那个表


明确的规范

sql语句的所有表名、字段名全部小写,系统保留字、内置函数名、sql保留字大写。

连接符号 or、in、and、以及=、<=、>=等前后加上一个空格

对较为复杂的sql语句、过程、函数加上注释、说明算法、功能。

单行注释:#

多行注释:/*  ....  */ 出于之间的都会被注释

多表连接时,试用表的别名来引用例。

SQL语句规则

SQL语句大小写不敏感

SQL语句可写成一行可写成多行

一个关键字不能跨多行或进行缩写

子句通常位于独立行,以便编辑,并易读。

空格和缩进使程序易读

关键字大写,其他小写


SELECT *

FROM tables

‘ * ’ 可以使用需要查询的列替换

‘ tables ’ 可以使用需要查询的表替换

算数表达式

对NUMBER和DATE类型数据类型可以进行数学运算穿件表达式

+  -  *  /

乘法和除法的优先级高于加法和减法

同级运算的顺序是从左到右

表达式中使用括号可强行改变优先级的运算顺序

定义列的别名

改变列的标题头

使用计算结果

列的别名

如果使用特殊字符,或大小写敏感,或有空格时,需加双引号

SELECT ename AS name

FROM tables

SELECT ename ‘ Name ’

FROM tables

将ename在表中的名字改为name

返回限制

实用LIMIT关键字限制返回

SELECT *

FROM tables

LIMIT 5

显示tables中的所有列表中的前五列

SELECT *

FROM tables

LIMIT 7 OFFSET 4

SELECT *

FROM tables

LIMIT 4,7

显示tables中从第五行(4+1)开始后的七个数据

比较的表示

=                                                          等于
<                                                          大于

>                                                          小于
>=                                                      大于等于

<=                                                        小于等于
<>                                                        不等于
BETWEEN ... AND ...                          在两个值之间(包含)
IN(list)                                              匹配列出值
LIKE                                                      匹配一个字符模式
IS NULL                                                是空值

WHERE的用法

SELECT *

FROM tables

WHERE job=' sealman '

显示tables中的所有“ job=sealman ”的数据

逻辑运算符

NOT                                        如果条件为假则返回真值

AND                                        如果组合的条件都为真则返回真值

OR                                          如果组合的条件 之一是真值,返回真值

NOT                不属于(一般用作 NOT IN(...,...))

SELECT *

FROM tables

WHERE NOT job=' clerk '

显示tables中除了' job='clerk' '的所有数据

SELECT *

FROM tables

WHERE job NOT IN (sealman,clerk)

显示tables中job不属于sealman和clerk的所有数据

AND                两者都包含

SELECT *

FROM tables

WHERE job='sealman'

AND sal>3000

显示tables中既满足‘ job=sealman ’还满足‘ sal>3000 ’的所有数据

OR                  两个条件满足一个即可

SELECT *

FROM tables

WHERE job='sealman'

OR sal>3000

显示tables中' job=sealman '或者' sal>3000'的所有数据

优先级规则

括号拥有最高优先级

优先级规则

SELECT *

FROM tables

WHERE job='clerk'

OR job='sealman'

AND sal>3000

优先进行' job='sealman' AND sal>3000'在进行' OR job='clerk' '

SELECT *

FROM tables

WHERE ( job='clerk'

OR job='sealman')

AND sal>3000 

优先进行' (job='clerk' OR job='sealman') '在进行' AND sal>3000 '

ORDER BY 子句

使用ORDER BY 子句将记录排序

ASC: 升序,缺省

DESC: 降序

ORDER BY 子句在SELECT语句的最后

SELECT *

FROM tables

ORDER BY sal  (ASC)/DESC

显示tables肿的所有数据按照sal的升序(升序)/降序

通过ORDER BY 列表的顺序来排序

    SELECT job sal

    FROM tables

    ORDER BY job ASC, sal DESC;

显示job的升序和‘ job升序后 ’sal的降序


练习:

练习数据库搭建:

create table `dept` (

`deptno` int (2),

`dname` varchar (60),

`loc` varchar (60),

primary key(deptno),

index dept_index(deptno)

)ENGINE=INNODB DEFAULT CHARSET=utf8;

insert into `dept` (`deptno`, `dname`, `loc`) values('10','ACCOUNTING','NEW YORK');

insert into `dept` (`deptno`, `dname`, `loc`) values('20','RESEARCH','DALLAS');

insert into `dept` (`deptno`, `dname`, `loc`) values('30','SALES','CHICAGO');

insert into `dept` (`deptno`, `dname`, `loc`) values('40','OPERATIONS','BOSTON');

CREATE TABLE `emp` (

`empno` INT (4) primary key,

`ename` VARCHAR (60),

`job` VARCHAR (30),

`mgr` INT (4),

`hiredate` DATE ,

`sal` FLOAT ,

`comm` FLOAT ,

`deptno` INT (2),

index emp_index(deptno),

foreign key(deptno) references dept(deptno) on delete cascade on update cascade

)ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO `emp` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES('7369','SMITH','CLERK','7902','1980-12-17','800.00',NULL,'20');

INSERT INTO `emp` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES('7499','ALLEN','SALESMAN','7698','1981-02-20','1600.00','300.00','30');

INSERT INTO `emp` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES('7521','FORD','SALESMAN','7698','1981-02-22','1250.00','500.00','20');

INSERT INTO `emp` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES('7566','JONES','MANAGER','7839','1981-04-02','2975.00',NULL,'20');

INSERT INTO `emp` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES('7654','MARTIN','SALESMAN','7698','1981-09-28','1250.00','1400.00','30');

INSERT INTO `emp` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES('7698','BLAKE','MANAGER','7839','1981-05-01','2850.00',NULL,'30');

INSERT INTO `emp` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES('7782','CLARK','MANAGER','7839','1981-06-09','2450.00',NULL,'10');

INSERT INTO `emp` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES('7788','SCOTT','ANALYST','7566','1987-04-19','3000.00',NULL,'20');

INSERT INTO `emp` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES('7839','KING','PRESIDENT',NULL,'1981-11-17','5000.00',NULL,'10');

INSERT INTO `emp` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES('7844','TURNER','SALESMAN','7698','1981-09-08','1500.00','0.00','30');

INSERT INTO `emp` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES('7876','ADAMS','CLERK','7788','1987-05-23','2200.00',NULL,'20');

INSERT INTO `emp` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES('7900','JAMES','CLERK','7698','1981-12-03','950.00',NULL,'30');

INSERT INTO `emp` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES('7902','FORD','ANALYST','7566','1981-12-03','3000.00',NULL,'20');

INSERT INTO `emp` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES('7934','MILLER','CLERK','7782','1982-01-23','1300.00',NULL,'10');

create table `salgrade` (

`grade` int (1) primary key,

`losal` float ,

`hisal` float

);

insert into `salgrade` (`grade`, `losal`, `hisal`) values('1','700.00','1200.00');

insert into `salgrade` (`grade`, `losal`, `hisal`) values('2','1201.00','1400.00');

insert into `salgrade` (`grade`, `losal`, `hisal`) values('3','1401.00','2000.00');

insert into `salgrade` (`grade`, `losal`, `hisal`) values('4','2001.00','3000.00');

insert into `salgrade` (`grade`, `losal`, `hisal`) values('5','3001.00','9999.00');

1.查询emp表,显示薪水大于2000且工作类别是manager雇员的信息

SELECT *

FROM emp

WHERE sal>=2000

AND job='manager';

练习1

2.查询emp表,显示年薪大于30000工作类别不是MANAGER的雇员信息

SELECT *

FROM emp

WHERE 12*(sal+IFNULL(comm,0))>=30000

AND job<>'manager';

练习2

3.查询emp表,显示薪水在1500到3000之间且工作类别以'M'开头的雇员信息

SELECT *

FROM emp

WHERE sal BETWEEN 1500 AND 3000

AND job LIKE 'M%'

练习3

4.查询emp表,显示佣金为空且部门编号为20或30的雇员信息

SELECT *

FROM emp

WHERE comm IS NULL

AND deptno<>10

练习4

5.查询emp表,显示佣金不为空或者部门编号为20的雇员信息,要求按照薪水降序排列

SELECT *

FROM emp

WHERE comm IS NOT NULL

OR deptno=20

ORDER BY sal DESC

练习5

6.查询emp表,显示年薪大于30000工作类别不是MANAGER,且部门号不是10或40的雇员信息,要求按照雇员姓名进行排列

SELECT *

FROM emp

WHERE 12*(sal+IFNULL(comm,0))>30000

AND job<>'manager'

AND deptno NOT IN (10,40)

ORDER BY ename

练习6


上一篇下一篇

猜你喜欢

热点阅读