sql 进阶

    • aliases 别名
    • 约束
    • not null
    • unique
    • primary key
    • foreign key
    • default
    • check
    • join(join方式决定条数)
      • inner join
      • left join
      • right join
      • full join
        • full join = left join + right join
      • 笛卡儿连接
        • 语法:
    • union
    • 索引
      • 单列索引:
      • 唯一索引
      • 聚簇索引
    • 子查询
      • Insert
      • update
      • delete
    • truncate table
    • sql 注入
    • Having 子句
    • 事务

https://www.w3cschool.cn/sql/9d4hffpw.html

aliases 别名

使用sql, 可以为表名称或者列名称指定别名

  • sql 别名用于为表或表中的列提供临时名称
  • sql 别名通常用于使表明更具可读性
  • sql 一个别名只存在于查询期间

语法:

SELECT column_name AS alias_name
FROM table_name;

SELECT column_name(s)
FROM table_name AS alias_name;

约束

作用于数据表中列上的规则,用于限制表中数据的类型,约束的存在保证了数据库中数据的精确性和可靠性

约束有列级和表级之分,列级约束作用于单一的列,而表级约束作用于整张数据表

  • not null
  • default
  • unique
  • primary key
  • foreign key
  • check

not null

约束强制列不接受null 值

如果不向字段添加值,就无法插入新记录或者更新记录

unique

约束唯一标识数据库表中的每条记录

primary key

主键 是 not null 的

包含唯一的值

foreign key

一个表的外键指向另一个表的主键

foreign key 约束用于预防破坏表之间连接的行为

foreign key 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。


在Orders 表创建时,在P_Id 列上创建foreign key约束

CREATE TABLE Orders

(

O_Id int NOT NULL,

OrderNo int NOT NULL,

P_Id int,

PRIMARY KEY (O_Id),

FOREIGN KEY (P_Id) REFERENCES Persons(P_Id)

)

添加外键约束

alter table Orders
add foreign key(P_Id)
references Persons(P_Id)

default

向列中插入默认值

在 Persons 表创建时在City 列上创建default 约束

CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT 'Sandnes'
)

添加约束

alter table Persons
alter City set default 'sandnes'

check

约束用于限制列中的值的范围

如果对单个列定义check约束,那么该列只允许特定的值

如果对一个表定义check 约束, 那么次约束会基于行中其他列的值在特定的列中的值进行限制

check 约束规定‘P_Id’ 列包含大于0的整数

CREATE TABLE Persons

(

P_Id int NOT NULL,

LastName varchar(255) NOT NULL,

FirstName varchar(255),

Address varchar(255),

City varchar(255),

CHECK (P_Id>0)

)

join(join方式决定条数)

字段是在select 之后自己选择的,条数由join方式决定。

customers:
sql 进阶_第1张图片

orders:
sql 进阶_第2张图片

inner join

select ID, NAME, AMOUNT, DATE
from CUSTOMERS
INNER JOIN ORDERS
ON CURTOMERS.ID = ORDERS.CUSTOMER_ID;

sql 进阶_第3张图片

left join

让customers 在左边,orders 在右边

select ID, NAME, AMOUNT, DATE
FROM CUSTOMERS 
LEFT JOIN ORDERS
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID

sql 进阶_第4张图片

right join

sql 进阶_第5张图片

full join

和笛卡儿积不一样

SELECT  ID, NAME, AMOUNT, DATE
     FROM CUSTOMERS
     FULL JOIN ORDERS
     ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

full join = left join + right join

sql 进阶_第6张图片

笛卡儿连接

语法:

SELECT  ID, NAME, AMOUNT, DATE
     FROM CUSTOMERS, ORDERS;

sql 进阶_第7张图片

union

在使用union 的时候,每个select 语句必须有相同数量的选中列,相同数量的列表达式、相同的数据类型、并且它们出现 的次序要一致,不过长度不一定要相同。

索引

索引提高select 查询和where 子句的速度,但降低了update 或inset 语句数据输入过程的速度

单列索引:

基于单一字段创建,基本语法

create index index_name
on table_name;

唯一索引

不止用来提高查询性能,还用于保证数据完整性,不允许向表中插入任何重复值

create unique index index_name
on table_name;

聚簇索引

在表中两个或多个列的基础上建立

create index index_name
on table_name(column1, column2);

创建单列索引还是聚簇索引 ,要看每次查询中,哪些列作为过滤条件的where 子句中最常出现。如果只需要一列,那么就应当创建单列索引,如果作为过滤条件的where 子句用到了两个或者更多列,那么聚簇索引就是最好的选择。

隐式索引

由数据库服务器在创建某些对象的时候自动生成,例如: 对于主键约束和唯一约束,数据库服务器就会自动创建索引。

子查询

子查询, 内查询,嵌套查询

SELECT * 
     FROM CUSTOMERS 
     WHERE ID IN (SELECT ID 
                  FROM CUSTOMERS 
                  WHERE SALARY > 4500) ;

Insert

INSERT INTO CUSTOMERS_BKP
     SELECT * FROM CUSTOMERS 
     WHERE ID IN (SELECT ID 
                  FROM CUSTOMERS) ;

update

UPDATE CUSTOMERS
     SET SALARY = SALARY * 0.25
     WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP
                   WHERE AGE >= 27 );

delete

DELETE FROM CUSTOMERS
     WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP
                   WHERE AGE > 27 );

truncate table

删除现有数据表中所有数据,保留表结构

语法:TRUNCATE TABLE table_name;

sql 注入

name 由字母、数字、下划线长度8到20

if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
{
   $result = mysql_query("SELECT * FROM CUSTOMERS 
                          WHERE name=$matches[0]");
}
else 
{
   echo "user name not accepted";
}

Having 子句

指定过滤条件,从而控制结果中哪些组可以出现在最终结果里面

SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY

筛选出现次数大于或等于2的所有记录

SELECT ID, NAME, AGE, ADDRESS, SALARY
FROM CUSTOMERS
GROUP BY age
HAVING COUNT(age) >= 2;

事务

事务的属性

  • 原子性: 保证任务中所有操作都执行完毕;否则,事务会出现错误时终止,回滚之前所有操作到原始状态
  • 一致性: 如果事务成功执行,则数据库的状态得到了进行了正确的转变
  • 隔离性: 保证不同的事务相互独立
  • 持久性:即使出现系统故障,之前成功执行的事务结果也会持久存在

你可能感兴趣的:(sql 进阶)