sql基础(适用于mysql)

创建数据库
CREATE DATABASE 数据库名;

删除数据库
DROP DATABASE 数据库名;

mysql关闭/打开安全模式
SET SQL_SAFE_UPDATES = 0;
SET SQL_SAFE_UPDATES = 1;

创建表
CREATE TABLE T_Person (FName VARCHAR(20),FAge INT,FRemark VARCHAR(20),PRIMARY
KEY (FName));

CREATE TABLE T_Debt (FNumber VARCHAR(20),FAmount DECIMAL(10,2) NOT NULL,
FPerson VARCHAR(20),PRIMARY KEY (FNumber),
FOREIGN KEY (FPerson) REFERENCES T_Person(FName)) ;

删除表中数据
TRUNCATE TABLE 表名;
DELETE FROM 表名;

删除表
DROP TABLE 表名

简单的增删改
INSERT INTO tablename(字段名) VALUES(字段值);
字段顺序任意,字段数量任意(非空约束字段必须插入)
INSERT INTO T_Person(FName,FAge,FRemark) VALUES('Tom',18,'USA');

UPDATE tablename SET 字段名=值
UPDATE tablename SET 字段名=值 WHERE ...
UPDATE T_Person SET FAge = 12 WHERE FNAME='Tom';

DELETE FROM 表名 WHERE ...
DELETE FROM T_Person WHERE FAge > 20 or FRemark = 'Mars';

查询语句
SELECT * FROM 表名;
SELECT 字段名 FROM 表名;
SELECT * FROM 表名 WHERE ...;

别名机制
SELECT 字段名 as 别名 FROM 表名;
SELECT 别名.字段名 FROM 表名 as 别名;

max,min,avg,sum函数

count函数
SELECT COUNT(*),COUNT(FNumber),COUNT(FName) FROM T_Employee
#COUNT(*)统计的是结果集的总条数,而COUNT(字段)统计的则是除了结果集中字段不为空值(也就是不等于NULL)的记录的总条数。

排序功能(ASC生序-默认,DESC降序)
SELECT * from t_employee order by FAge desc,FSalary desc;
#ORDER BY 子句位于SELECT 语句的末尾

LIKE以及通配符
SELECT * FROM T_Employee WHERE FName LIKE '_erry';
#'_'单字符匹配,'%'多字符匹配

NOT非
SELECT * FROM T_Employee WHERE NOT(FName LIKE 'S%') AND NOT(FName LIKE 'J%');

sql判断NULL,NOT NULL
select * from T_Employee where FName is null;

select * from T_Employee where FName is not null;

IN子句
SELECT FAge,FNumber,FName FROM T_Employee WHERE FAge IN (23,25,28);

BETWEEN(mysql默认包含边界)
SELECT * FROM T_Employee WHERE FAGE BETWEEN 23 AND 27
#等价于>=23 and <=27

GROUP BY分组功能
SELECT FAge FROM T_Employee GROUP BY FAge;
#GROUP BY必须在select语句的后面

SELECT FAge,sum(FSalary) FROM T_Employee GROUP BY FAge;

#GROUP BY子句中可以指定多个列,只需要将多个列的列名用逗号隔开即可。指定多个分组规则以后,
#数据库系统将按照定义的分组顺序来对数据进行逐层分组,首先按照第一个分组列进行分组,
#然后在每个小组内按照第二个分组列进行再次分组……逐层分组,从而实现“组中组”的效果,而查询的结果集是以最末一级分组来进行输出的。
SELECT FSubCompany,FDepartment FROM T_Employee GROUP BY FSubCompany,FDepartment;

HAVING
#只检索人数多余1个的年龄段
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge HAVING COUNT(*)>1

需要特别注意,在HAVING语句中不能包含未分组的列名,比如下面的SQL语句是错误的:
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge HAVING FName IS NOT NULL
执行的时候数据库系统会提示类似如下的错误信息:
HAVING 子句中的列'T_Employee.FName' 无效,因为该列没有包含在聚合函数或GROUP BY 子句中。
需要用WHERE语句来代替HAVING,修改后的SQL语句如下:
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee WHERE FName IS NOT NULL GROUP BY FAge

LIMIT
MYSQL中提供了LIMIT关键字用来限制返回的结果集,LIMIT放在SELECT语句的最后位置,
语法为“LIMIT 首行行号,要返回的结果集的最大数目”。比如下面的SQL语句将返回按照工
资降序排列的从第二行开始(行号从0开始)的最多五条记录:
SELECT * FROM T_Employee ORDER BY FSalary DESC LIMIT 2,5;

DISTINCT
SELECT DISTINCT FDepartment FROM T_Employee;
SELECT FDepartment FROM T_Employee;
#DISTINCT是对整个结果集进行数据重复抑制的,而不是针对每一个列,执行下面的SQL语句:
SELECT DISTINCT FDepartment,FSubCompany FROM T_Employee;

索引
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。上述SQL语句,在没有索引的情况下,数据库会遍历全部200条数据后选择符合条件的;而有了相应的索引之后,数据库会直接在索引中查找符合条件的选项。
虽然索引可以提高数据查询的速度,但是任何事物都是双刃剑,它也有一些缺点:索引占据一定磁盘空间,索引减慢了数据插入和删除的速度。因为每次插入和删除的时候都需要更新索引,一个表拥有的索引越多,则写操作的平均性能下降就越大。
CREATE INDEX 索引名 表名(字段1,字段2,...)
DROP INDEX 索引名ON 表名;

约束(:非空约束;唯一约束; CHECK 约束;主键约束;外键约束)
非空约束:
NOT NULL

唯一约束:
定义复合唯一约束需要定义在所有字段列表之后,语法如下:
CONSTRAINT 约束名 UNIQUE(字段1,字段2……字段n)
这里的“字段1,字段2……字段n”为组成约束的多个字段,如果只有一个字段则可以看做是单字段唯一约束定义的另外一种形式。通过这种形式定义的唯一约束由于有一个确定的名称,所以可以很容易的通过这个名字来删除这个约束。
为已经存在的表添加/删除唯一约束
ALTER TABLE 表名ADD CONSTRAINT 唯一约束名UNIQUE(字段1,字段2……字段n);
ALTER TABLE 表名DROP CONSTRAINT 唯一约束名
不过上边的语法不能在MYSQL中执行,MYSQL中删除约束的语法为:
ALTER TABLE 表名DROP INDEX 唯一约束名

check约束:
直接在列定义中添加CHECK约束,可以使用常量表达式,还可以使用函数。但是缺点是约束条件不能引用其他列。
要想使用其它列,需要使用
CONSTRAINT 约束名 CHECK(...)
给已经建好的表添加/删除check约束
ALTER TABLE 表名 ADD CONSTRAINT 约束名 CHECK(...);
ALTER TABLE 表名DROP CONSTRAINT 约束名
不过上边的语法不能在MYSQL中执行,MYSQL中删除约束的语法为:
ALTER TABLE 表名DROP INDEX 约束名

主键约束:
直接在建表时创建
数据类型 字段名 PRIMARY KEY,或者,
CONSTRAINT 主键名 PRIMARY KEY(字段1,字段2,...)
给已经建好的表添加/删除主键
ALERT TABLE 表名 ADD CONSTRAINT 主键名 PRIMARY KEY(字段1,字段2,...)
ALERT TABLE 表名 DROP CONSTRAINT 主键名
不过在mysql中需要写成
ALERT TABLE 表名 DROP PRIMARY KEY

外键约束:
直接在建表时创建
CONSTRAINT 外键名 POREIGN KEY(字段名) REFERENCES 关联表名(关联字段)
给已经建好的表添加/删除外键
ALERT TABLE 表名 ADD CONSTRAINT 外建名 POREIGN KEY(字段名) REFERENCES 关联表名(关联字段)
ALERT TABLE 表名 DROP CONSTRAINT 外键名
不过在mysql中需要写成
ALERT TABLE 表名 DROP FIREIGN KEY 外建名

表连接
inner join
select order from A INNER JOIN B ON A.name = ‘TOM’
查询出A表和B表中所有的名字为TOM的订单
inner join是基于两张表的关联关系来连接表,只显示两张表的并集

cross join
与inner join比起来,cross join非常简单,因为它不存在ON子句。交叉连接会将涉及到的
所有表中的所有记录都包含在结果集中

outer join
left outer join
在左外部连接中,左表中所有的记录都会被放到结果集中,无论是否在右表中存在匹配
记录。

right outer join
与左外部连接正好相反,在右外部连接中不管是否成功匹配连接条件都会返回右表中的
所有记录。

full outer join
全外部连接是左外部连
接和右外部连接的合集,因为即使在右表中不存在匹配连接条件的数据,左表中的所有记录
也将被放到结果集中,同样即使在左表中不存在匹配连接条件的数据,右表中的所有记录也
将被放到结果集中。
在mysql中不支持full outer join,需要使用UNION取左连接和右连接的合集。

UNION
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
SQL UNION 语法
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。

UNION ALL
SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2
另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。

自连接
到目前为止,我们讲解的连接都是在不同的数据表之间进行的,其实参与连接的表完全
可以是同一样表,也就是表与其自身相连接,这样连接就被称为自连接。自连接并不是独立
于交叉连接、内连接、外连接等这些连接方式之外的另外一种连接方式,而只是这些连接方
式的一种特例,也就是交叉连接、内连接、外连接等连接方式中只要参与连接的表是同一张
表,那么它们就可以被称为自连接。

子查询
SELECT语句可以嵌套在其他语句中,比如SELECT,INSERT,UPDATE以及DELETE等,这些被嵌套的SELECT语句就称为子查询,可以这么说当一个查询依赖于另外一个查询结果时就可以使用子查询。子查询有两种类型,一种是只返回一个单值的子查询,这时它可以用在一个单值可以使用的地方,这时子查询可以看作是一个拥有返回值的函数;另外一种是返回一列值的子查询,这时子查询可以看作是一个在内存中临时存在的数据表。

单值子查询
单值子查询的语法和普通的SELECT 语句没有什么不同,唯一的限制就是子查询的返回值必须只有一行记录,而且只能有一个列。这样的子查询又被称为标量子查询。

列值子查询
与标量子查询不同,列值子查询可以返回一个多行多列的结果集。这样的子查询又被称为表子查询,表子查询可以看作一个临时的表,表子查询可以用在SELECT 语句的FROM子句中、INSERT语句、连接、IN 子句等很多场合。

SELECT列表中的标量子查询
标量子查询完全可以返回随当前查询记录而变化的值。
SELECT FId,FName,(SELECT MAX(FYearPublished) FROM T_Book WHERE T_Book. FCategoryId= T_Category.FId) FROM T_Category;
返回一类图书的最新出版年份

WHERE 子句中的标量子查询
select FReaderId from t_readerfavorite where FCategoryId = (select Fid from t_category where FName="Story");
喜欢“Story”的读者主键列表

猜你喜欢

转载自cc414011733.iteye.com/blog/2285688