1.SQL概述
•SQL语言(Structured Query Language)是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统.
•sql 语句就是对数据库进行操作的一种语言。
2.语句分类
3.sql语言基础
•快速了解SQL 的常用定义语句:数据库的创建,表的创建,修改数据库的创建
3.1数据库的操作
•CREATE DATABASE 数据库名 [CHARACTER SET 'utf8' COLLATE 'utf8_general_ci'] 设置数据库字符集及字符集校对规则
•【例】CREATE DATABASE exam CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
#2 ENGINE=INNODB DEFAULT CHARSET=utf8;(加到创建表后面 如);
CREATE TABLE product (pro_id INT PRIMARY KEY,pro_name VARCHAR(14) NOT NULL,pro_sub_id INT(2),pro_num INT(4),pro_price number(7,2))ENGINE=INNODB DEFAULT CHARSET=utf8;
~取小数点后几位数用number float会失精 number(a,b) a数据的最长长度,b数据小数显示的长度
~float设置精度 只有一个值 float(a) a数据的最长长度,数据的小数默认显示2位
~int(无需设置字符长度)
•切换database:use 数据库名
•【例】USE exam
数据库的修改 (中文字符的改变)
alter database exam character set utf8;
数据库的删除
drop database 数据库名
3.2 表的操作
表的创建
•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 原字段名 新字段名 数据类型 [ 属性 ];(mysql)
•alter table emp modify e_name varchar(100) (oracle修改字符长度)
•删除字段 alter table 表名 drop 字段名
修改约束 alter table 表名 add constraint 外键名 foreign key (外键字段) references 关联表名(关联字段);
表的删除
•Drop table 表名;
表的数据的插入
•Insert into 表名(列1,列2,。。。。) values ();
表的数据的更新
•update 表名 set 列名 = 更新值 [ where 更新条件];
表的数据的删除
•Delete from 表名 [ where 更新条件];
3.3 基本的SELECT 命令
SELECT 识别什么列
FROM 识别哪个表
书写规范
1、sql语句的所有表名、字段名全部小写,系统保留字、内置函数名、sql保留字大写。
2、连接符or、in、and、以及=、<=、>=等前后加上一个空格。
3、对较为复杂的sql语句、过程、函数加上注释,说明算法、功能。
4、单行注释:#
5、多行注释:/* ... */,在这之间的所有语句都会被注释
6、多表连接时,使用表的别名来引用列。
语句规则
SQL 语句是大小写不敏感
SQL 语句可写成一行或多行
一个关键字不能跨多行或缩写
子句通常位于独立行,以便编辑,并易读
空格和缩进使程序易读
关键字大写,其他小写
3.3.1 列的操作
选择所有列
SELECT * FROM deptf; (deptf 是表名,* 代表所有列)
选择指定列
SELECT asd FROM deptf ;( asd时列的名字)
3.3.2 算术表达式
对NUMBER和DATE型数据可用算数运算创建表达式
+ - * /
空值是指不可用,不知道,不适用的值;空值不等于零或空格;
包括空值的算法表达式等于空;
所以若一个表中,有属性的值为空(NULL);如现在有两个属性,sal和comm,其中,sal的值为3000,comm的值为NULL,则他们的相加运算可如下
sal + IFNULL(comm,0) ;可理解为若comm的值为空时,sal的值3000与0相加
定义列的别名
改变列的标题头
使用计算结果
列的别名
如果使用特殊字符,或大小写敏感,或有空格时,需加引号
(三种该别名的方法)
SELECT ename "Name", sal*12 "Annual Salary" FROM emp
SELECT ename Name, sal*12 AnnualSalary FROM emp
SELECT ename AS Name, sal*12 AS ‘Annual Salary’ FROM emp
删除重复行 DISTINCT
SELECT DISTINCT deptno FROM emp
限制返回行数 LIMIT
SELECT * FROM emp LIMIT 5 ;返回5行数数据
SELECT * FROM emp LIMIT 2 OFFSET 3 ;从第三行开始,返回2行的行数
SELECT * FROM emp LIMIT 3,2 ;从第三行开始,返回2行的行数
使用选择限定记录 WHERE ; ORDER BY
SELECT ename, job, deptno FROM emp WHERE job='CLERK' :从emp表中查找 jop 是CLERK的 ename, job, deptno
字符串和日期要用单引号扩起来
字符串是大小写敏感的,日期值是格式敏感的
缺省的日期格式是 'DD-MON-YY'
比较运算符
SELECT ename, sal, comm FROM emp WHERE sal<=comm;
其它的比较运算符
使用BETWEEN ...and... 运算符(显示某一 值域范围的记录)
SELECT ename, sal FROM emp WHERE sal BETWEEN 1000 AND 1500
使用IN运算符
SELECT empno, ename, sal, mgr FROM emp WHERE mgr IN (7902, 7566, 7788) ; 查找mgr 在 (7902, 7566, 7788) 之中的empno, ename, sal, mgr
使用LIKE运算符
使用LIKE运算符执行通配查询
查询条件可包含文字字符或数字
1. % 可表示零或多个任意字符
2. _ 可表示一个字符
SELECT ename
FROM emp
WHERE ename LIKE 'S%' ; (在emp表中查找 ename 以S开头后面任意 的 ename)
SELECT ename
FROM emp
WHERE ename LIKE '_A%' ;(在emp表中 查找 ename 第一个字符任意第二是A后面任意字符的 ename)
3. [ ] :表示括号内所列字符中的一个(类似正则表达式)。指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。
比如 SELECT * FROM [user] WHERE u_name LIKE '[张李王]三'
将找出“张三”、“李三”、“王三”(而不是“张李王三”);
如 [ ] 内有一系列字符(01234、abcde之类的)则可略写为“0-4”、“a-e”
SELECT * FROM [user] WHERE u_name LIKE '老[1-9]'
将找出“老1”、“老2”、……、“老9”;
4. [^ ] :表示不在括号所列之内的单个字符。其取值和 [] 相同,但它要求所匹配对象为指定字符以外的任一个字符。
比如 SELECT * FROM [user] WHERE u_name LIKE '[^张李王]三'
将找出不姓“张”、“李”、“王”的“赵三”、“孙三”等;
SELECT * FROM [user] WHERE u_name LIKE '老[^1-4]';
将排除“老1”到“老4”,寻找“老5”、“老6”、……
5,查询内容包含通配符时
由于通配符的缘故,导致我们查询特殊字符“%”、“_”、“[”的语句无法正常实现,而把特殊字符用“[ ]”括起便可正常查询。据此我们写出以下函数:
function sqlencode(str)
str=replace(str,"[","[[]") '此句一定要在最前
str=replace(str,"_","[_]")
str=replace(str,"%","[%]")
sqlencode=str
end function
在查询前将待查字符串先经该函数处理即可,并且在网页上连接数据库用到这类的查询语句时侯要注意:
如Select * FROM user Where name LIKE '老[^1-4]';上面 《'》老[^1-4]《'》是要有单引号的,别忘了,我经常忘
使用IS NULL运算符
SELECT ename, mgr
FROM emp
WHERE mgr IS NULL ;(在emp表中查找 mgr 是空值的 ename,mgr)
逻辑运算符
AND需要条件都为TRUE
SELECT empno, ename, job, sal
FROM emp
WHERE sal>=1100
AND job='CLERK';
OR需要条件之一是TRUE
SELECT empno, ename, job, sal
FROM emp
WHERE sal>=1100
OR job='CLERK'
SELECT ename, job
FROM emp
WHERE job NOT IN ('CLERK','MANAGER','ANALYST');
优先级规则(括号大于所有优先级)
ORDER BY
使用ORDER BY 子句将记录排序
ASC: 升序,缺省(升序,有时不用ASC;如下)
DESC: 降序
SQL> SELECT ename, job, deptno, hiredate
FROM emp
ORDER BY hiredate DESC; 降序
SQL> SELECT ename, job, deptno, hiredate
FROM emp
ORDER BY hiredate ASC;升序
SQL> SELECT ename, job, deptno, hiredate
FROM emp
ORDER BY hiredate ;升序
使用列的别名排序
SELECT empno, ename, sal*12 annsal
FROM emp
ORDER BY annsal
多个列排序
SQL> SELECT ename, deptno, sal
FROM emp
ORDER BY deptno ASC, sal DESC ;(先是以deptno升序排列,若deptno有相同的,再以sal降序排列)