SQL基础

来源:互联网 发布:里约社会治安数据 编辑:程序博客网 时间:2024/06/03 20:53

1.数据表创建和管理

SQL 关键字不区分大小写,为了可读性高,一般写成大写。

创建表,下面语句定义了非空约束,默认值,主键和外键

CREATE TABLE Person(id INT, schoolid INT, name VARCHAR(20) NOT NULL, age INT DEFAULT 0, PRIMARY KEY(id), FOREIGN KEY(schoolid) REFERENCES School(id));

修改表

ALTER TABLE Person ADD 字段名 字段类型;
ALTER TABLE Person DROP 字段;
删除数据表
DROP TABLE Person;

2.数据增删改

插入数据
插入单行数据
INSERT INTO Person(id,name, age) values(1,"chen", 18);
插入多行数据
INSERT INTO Person SELECT * FROM Person;
更新数据
UPDATE Person SET name = "chen";数据表全部更新UPDATE Person SET name = "chen" WHERE name="li";更新部分行
删除数据
DELETE FROM Person;删除数据表全部数据DELETE FROM Person WHERE name="chen";//删除部分数据

3.数据检索

取出所有数据
SELECT * FROM Person;
取出部分列
SELECT name FROM Person;
列别名
SELECT name AS "姓名" FROM Person;AS可以省略
数据不重复
SELECT DISTINCT name FROM Person;
条件检索
SELECT name FROM Person WHERE age>18 OR age < 60;
SQL聚合函数 MAX MIN AVG SUM COUNT
SELECT MAX(age) AS "最高年龄" FROM Person;
排序
默认排序是ASC升序,降序是DESC
SELECT name FROM Person ORDER BY age ASC,name DESC;
分组
SELECT * FROM Person GROUP BY age;有几种年龄显示几行,name字段被掩盖
SELECT * FROM Person GROUP BY age HAVING COUNT(*)>1;使用聚合函数和HAVING语句过滤
通配符过滤,单字符匹配'_',多字符匹配'%'
SELECT * FROM Person WHERE name LIKE '_h%';
空值检测
没有添加非空约束列可以为空值(NULL),检测字段是否为空使用"IS NULL"和"IS NOT NULL"
SELECT * FROM Person WHERE age IS NOT NULL;
范围值检测
SELECT * FROM Person WHERE age IN(18,19,20,21);
SELECT * FROM Person WHERE age>=18 AND age<=21;
SELECT * FROM Person WHERE age BETWEEN 18 AND 21;
限制结果集行数,只显示若干行
不同数据库处理不同
MYSQL
SELECT * FROM Person ORDER BY age LIMIT 2,5;返回从第三行开始的最多5条数据,行号从0开始
ORACLE
SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY age) row_num, name FROM Person)p where p.row_num >=3 AND p.row_num<=5;返回第三行到第五行的数据
ORACLE为每个结果集都增加了默认表示行号的列
SELECT * FROM Person WHERE rownum<=6 ORDER BY age;//返回前六条数据,rownum从1开始
下列语句无法实现范围取值的功能
SELECT * FROM Person WHERE rownum BETWEEN 3 AND 5 ORDER BY age;//返回空集
当进行检索时,对于第一条数据,rownum为1,不符合条件,没有被放入检索结果中,当检索到第二条数据,因为第一条数据不在结果集中,所以第二条数据的rownum依然为1,以此类推,所有数据的rownum都为1。因此要实现范围取值必须使用ROW_NUMBER().
SQL SERVER
SQL SERVER2000提供关键字TOP
SELECT TOP 5 * FROM Person ORDER BY age;
TOP无法范围取值,可以使用子查询实现
SELECT TOP 5 * FROM Person WHERE name NOT IN(
 TOP 3 * FROM Person ORDER BY age;)ORDER BY age;
SQL SERVER2005 开始支持ROW_NUMBER()

3.表连接

内连接,基于两张表的关联关系连接它们,大多数数据库系统中内连接是默认连接方法,所以INNER可以省略。连接条件可使用小于大于等于不等于等运算符,还可以使用LIKE,BETWEEN AND等,还可以使用函数。
SELECT number,price FROM Order JOIN Custom ON customId = Custom.id;
交叉连接,不存在ON字句,将涉及到的所有表的所有记录都包含到结果集中,分为隐式连接(多表查询)和显式连接(指定CROSS JOIN)。一般可以直接使用隐式连接。
自连接,表与其自身连接。比如检索订单表中订单类型相同的订到列表
SELECT o1.number,o1.price,o1.typeId,o2.number,o2.price,o2.typeId FROM Order o1 JOIN Order o2 ON o1.typeId = o2.typeId AND o1.id<o2.id;
外连接,内连接要求组成连接的两个表必须具有匹配的记录,对于NULL值内连接无法处理。外连接语法和内连接几乎一样,主要区别就是对NULL值的处理,外连接不需要两个表具有匹配记录,可以指定某个表的记录总是放到结果集中,根据那个表的结果总是放到结果集中,外连接可以分为右外连接,左外连接和全部外连接。

4.子查询

SQL允许将一个查询语句作为一个结果集共其他SQL语句使用,就好像使用一个普通的表一样,被当做结果集的查询语句成为子查询。
单值子查询,又称标量子查询,子查询返回一行一列数据。
列值子查询,子查询返回多行多列的结果集,这种子查询又称为表子查询,可以将结果集视作简单的表。列值子查询可以使用集合运算符进行操作,包括IN,ANY,ALL以及EXISTS。

0 0
原创粉丝点击