-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSQLnote
133 lines (128 loc) · 7.44 KB
/
SQLnote
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
概念
SQL是结构化查询语言,所有关系型数据库都使用SQL作为标准数据库语言
SQL架构: SQL query --> query language processor(parse and optimizer) -->DBMS engine(file manager and transaction manager)-->physical database
SQL语句分为数据定义语言(DDL)、数据操纵语言(DML)、数据控制语言(DCL)
数据库中的数据结构:表、字段、记录/行、列(列包括字段名)
SQL约束:对数据进行储存或者处理的规则,约束可能是针对表或者列的。常见的约束:确保不能有NULL值(NULL不代表没有数据,代表的是未知数据),确保一列中所有的值是唯一的
RDBMS:关系型数据库管理系统
数据完整性:(1)实体完整性: 表中没有重复行;(2)域完整性: 通过限制的类型,格式或值的范围强制对于一个给定列的有效条目;
(3)参考完整性: 行不能被删除,被其他记录使用;(4)用户定义的完整性: 强制执行不属于实体,域和参照完整性一些具体的业务规则;
一、数据库约束
1.NOT NULL约束:在创建表的时候标注 或者通过SQL语句
例子:
CREATE TABLE CUSTOMERS(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25) ,
SALARY DECIMAL (18, 2),
PRIMARY KEY (ID) --设置主键
);
ALTER TABLE CUSTOMERS MODIFY SALARY DECIMAL (18,2) NOT NULL;
2.DEFAULT 约束
CREATE TABLE CUSTOMERS(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25) ,
SALARY DECIMAL (18, 2) DEFAULT 5000.00, --默认值为5000
PRIMARY KEY (ID)
);
或者用ALTER TABLE CUSTOMERS MODIFY SALARY DECIMAL (18, 2) DEFAULT 5000.00;
另外有ALTER TABLE CUSTOMERS ALTER COLUMN SALARY DROP DEFAULT;--删除DEFAULT约束
3.唯一约束
CREATE TABLE CUSTOMERS(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL UNIQUE,--UNIQUE是唯一约束
ADDRESS CHAR (25) ,
SALARY DECIMAL (18, 2),
PRIMARY KEY (ID)
);
还可以ALTER TABLE CUSTOMERS ADD CONSTRAINT myUniqueConstraint UNIQUE(AGE, SALARY); --设置多个字段的唯一性约束
4.主键外键
主键是一个在一个数据库表中唯一标识每个行/记录表中的一个字段。主键必须包含唯一值。主键列不能有NULL值。
一个表只能有一个主键,它可以由单个或多个字段组成。当多个字段被用来作为主键,它们被称为复合键。
如果一个表有任何字段定义为主键,那么就不能有两个记录具有字段的值相同。
CREATE TABLE CUSTOMERS(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25) ,
SALARY DECIMAL (18, 2),
PRIMARY KEY (ID)
);
或者ALTER TABLE CUSTOMERS ADD CONSTRAINT PK_CUSTID PRIMARY KEY (ID, NAME);--多个主键
删除主键: ALTER TABLE CUSTOMERS DROP PRIMARY KEY ;
外键是用于两个表链接在一起的键。这有时被称为一个参考项。
外键是一列或多列的值匹配在不同的表的主键的组合。
如果一个表有字段定义的主键,那么就不能有两个记录具有字段的值相同。
CREATE TABLE ORDERS (
ID INT NOT NULL,
DATE DATETIME,
CUSTOMER_ID INT references CUSTOMERS(ID),--来自CUSTOMERS的外键
AMOUNT double,
PRIMARY KEY (ID)
);
ALTER TABLE ORDERS ADD FOREIGN KEY (Customer_ID) REFERENCES CUSTOMERS (ID);
5.CHECK约束
CREATE TABLE CUSTOMERS(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL CHECK (AGE >= 18),
ADDRESS CHAR (25) ,
SALARY DECIMAL (18, 2),
PRIMARY KEY (ID)
);
ALTER TABLE CUSTOMERS MODIFY AGE INT NOT NULL CHECK (AGE >= 18 );
ALTER TABLE CUSTOMERS ADD CONSTRAINT myCheckConstraint CHECK(AGE >= 18);--可以设置多个字段的约束
6索引约束
索引是用来快速创建并从数据库中检索数据。索引可以通过使用单个或一组的列在一个表中创建,对一列或多列进行排序。 当创建索引时,它被分配一个ROWID在每一行进行排序出来的数据之前。
索引的数据结构基础是B+树
B+树
CREATE INDEX index_name ON table_name ( column1, column2.....);
7.三个范式
1NF:数据项不可再分;
2NF:每个数据项都和主键相关,不能与主键的一部分相关(这一条针对联合主键);
3NF:所有非主键字段不依赖于其他非主键,也可以说是跟主键直接相关而非间接相关(例如学生性别和学生年龄直接依赖学会说呢过姓名,
如果把学号当做主键则不满足第三范式)
(1)1NF(2)(3)
二、SQL语言
1.常用语句
SELECT - 从数据库中提取数据 SELECT DISTINCT 输出非重复字段
select column_name1,column_name2.... from table_name where column_name operator value;
operator的种类常见的> < = >= <= <>(不等于,有时也写作!=) LIKE(搜索某种模式,用通配符标识,需用单引号。同理还有NOT LIKE) IN(某个列有多个可能值,这些val放在括号中,逗号隔开) BETWEEN val1 AND val2
逻辑判断 NOT AND OR IS
UPDATE - 更新数据库中的数据,使用时要格外小心,如果后面没有WHERE子句,会把所有的数据都修改
UPDATE table_name SET column1=value1,column2=value2,... WHERE some_column=some_value;
DELETE - 从数据库中删除数据
DELETE FROM Websites WHERE name='Facebook' AND country='USA';不加WHERE子句则删除所有表中记录只留下表
INSERT INTO - 向数据库中插入新数据
INSERT INTO table_name VALUES (val1,val2,val3...);
INSERT INTO table_name (column1,column2,column3,...) VALUES (value1,value2,value3,...);在表中插入新的记录,两种都可
CREATE DATABASE - 创建新数据库
ALTER DATABASE - 修改数据库
CREATE TABLE - 创建新表
ALTER TABLE - 变更(改变)数据库表
DROP TABLE - 删除表
CREATE INDEX - 创建索引(搜索键)
DROP INDEX - 删除索引
ORDER BY column_name 默认升序排序,降序在后面再加一个DESC 升序加ASC. 后面跟多列的时候,先按前面的排序 再按后面的排序
LIMIT i,n 从i开始输出n条记录
LIkE 'G%'(以G开头) LIkE '%s'(以s结尾) LIkE '%is%'(包含is)
REGEXP 或 NOT REGEXP来操作正则表达式,类似于LIKE. ^本身标识字符串开始的位置,但是用在方括号中表示不匹配方括号中字母 _用来替代一个字母 %用来替代多个字母
SELECT * FROM Websites WHERE name BETWEEN 'A' AND 'H';BETWEEN作用于字母的时候表示在这两个字母为开头的字符串中筛选
AS 标识别名 SELECT column_name(s) FROM table_name AS alias_name;SELECT column_name AS alias_name FROM table_name;分别表示表的别名进和列的别名
SELECT name, CONCAT(url, ', ', alexa, ', ', country) AS site_info FROM Websites;CONCAT将多个列的记录连接起来
SELECT w.name, w.url, a.count, a.date
FROM Websites AS w, access_log AS a
WHERE a.site_id=w.id and w.name="菜鸟教程";
SQL连接(join)https://www.runoob.com/sql/sql-join.html 之后再细看
EXISTS也是操作符 判断记录是否存在
HAVING 使用聚合函数之后无法使用where进行筛选 因此使用HAVING
例如
SELECT Websites.name, Websites.url, SUM(access_log.count) AS nums FROM (access_log
INNER JOIN Websites
ON access_log.site_id=Websites.id)
GROUP BY Websites.name
HAVING SUM(access_log.count) > 200;