SQL语言基础
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';
练习12.查询emp表,显示年薪大于30000工作类别不是MANAGER的雇员信息
SELECT *
FROM emp
WHERE 12*(sal+IFNULL(comm,0))>=30000
AND job<>'manager';
练习23.查询emp表,显示薪水在1500到3000之间且工作类别以'M'开头的雇员信息
SELECT *
FROM emp
WHERE sal BETWEEN 1500 AND 3000
AND job LIKE 'M%'
练习34.查询emp表,显示佣金为空且部门编号为20或30的雇员信息
SELECT *
FROM emp
WHERE comm IS NULL
AND deptno<>10
练习45.查询emp表,显示佣金不为空或者部门编号为20的雇员信息,要求按照薪水降序排列
SELECT *
FROM emp
WHERE comm IS NOT NULL
OR deptno=20
ORDER BY sal DESC
练习56.查询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