SQL学习笔记

1.数据库是保存表和其它相关SQL结构的容器

常用数据类型: CHAR VARCHAR INT DEC DATE DATETIME BLOG,INT DEC的值不加引号''

2.常用命令:

CREATE DATABASE dbname;

DROP DATABASE dbname;

USE dbaname;

CREATE TABLE listname(filedname DATATYPE(len) [NOT NULL[ DEFAULT va[AUTO_INCREASE]]]l,...);

DESC listname;//查看表的结构

DROP TABLE listname;

INSERT INTO listname (colname) VALUES (val),(val2);

SELECT * FROM tablename;

SELECT *(colname) FORM tablename WHERE  fieldname='val';

SELECT *(colname) FORM tablename WHERE  fieldname=(<,>,<>,>=,<=)'val' AND(OR) anotherfield='val';

SELECT *(colname) FORM tablename WHERE   fieldname IS NULL;

WHERE fieldname LIKE '%val'; //以val结尾,%任意字符串,_任意一个字符

WHERE fieldname BETWEEN  val1 IN val2;(val1 val2也包含在内)

WHERE fieldname IN (val1,...); //NOT IN

WHERE NOT fieldname AND (OR) NOT fieldname LIKE..;

DELETE FROM tablename WHERE .. ;(先用SELECT确认情况);

UPDATE tablename SET fieldnam='newval',fieldnam2='NV'.. WHERE ..;

UPDATE tablename SET fieldnam=fieldnam+1 WHERE ..;(update能用在表的多条记录上,可以和基础数学符一起使用,可以操作数值数据)

SHOW CREATE TABLE tablename;

SHOW COLUMNS FROM tablename;

SHOW INDEX FROM tablename;

SHOW WARNING;

PRIMARY KEY(colname);

ALTER TABLE tablename ADD COLUMN colname INT NOT NULL AUTO_INCREMENT FIRST[AFTER colname](列的位置),ADD PRIMARY KEY(colname);//在原来的基础上增加表,其它修改命令 :

  CHANGE:可同时改变现有列的名称和数据类型,MODIFY:修改现有列的数据类型或位置;DROP从表中删除一列

ALTER TABLE oldtablename RENAME TO newtablename;

ATER TABLE tablename CHANGE COLUMN oldcolname newcolname INT NOT NULL AUTO INCREMENT,ADD PRIMARY KEY(newcolname );

如果把数据改变成另一种类型,可能会丢失数据

ATER TABLE tablename DROP COLUMN  colname;

ATER TABLE tablename DROP PRIMARY KEY;移除主键不改变该列的数据

每个表中只有一列可以加上AUTO_INCREMENT 该列必须为整型数据而且不能包含NULL

字符串功能函数选出文本列中的部分内容

SELECT RIGHT(colname,2) FROM tablename;

SELECT SUBSTRING_INDEX(colname,'str',num(寻找第几个字符)) FROM tablename;

等,字符串函数不会修改存储在表中的内容,只是把修改的摸样当成查询结果返回

UPDATE tablename SET colname=RIGHT(colname,2);//不加where条件

UPDATE tablename SET colname=

  CASE 

    WHEN colname='val' THEN 'val'

    ELSE 'VAL'

  END;

ORDER BY colname,colname..[DESC[ASC]];

SELECT firstname,SUM(salse) FROM tablename ORDER BY SUM(salse) GROUP BY firstname;

常用函数SUM MIN MAX AVG

DISTINCT去重复 SELECT COUNT(DISTINCT(sales_date)) FROM cookies_sales;

LIMIT返回查询结果的数量 SELECT first_name,SUM(sales) FROM cookies_sales GROUP BY first_name ORDER BY SUM(sales) DESC LIMIT 2;

 

 

使用数据的方式影响数据表的设置方式

设计表:

列之间如何产生关系,来一起描述某项事物

1.挑出事物,挑出你希望表描述的某样事物

2.列出一份关于那样事物的信息列表,这些信息都是使用表的必要信息

3.使用信息列表吧关于那样事物的综合信息拆分成小块信息,以便于组织表

当数据具有原子性,表示数据已经被分割至最小块了,不能或不应该再被分割了

原子性数据的规则:

一、具有原子性数据的列中不会有多个类型相同的值

二、具有原子性数据的表中不会有存储多个类型相同的列

让数据具有原子性时规范表的第一步

 

主键用于独一无二识别出每条记录,让每一列成为唯一的

主键不可以为NULL 插入新纪录时必须指定主键值 主键必须简洁 主键值不可以被修改

 

 

 对数据库内的数据描述(列和表),以及任何相关对象和各种连接方式的描述成为SCHEMA,模式。

外键是表中的某一列,它引用到另一个表的主键

外键使用的主键也被称为父键,主键所在的表被称为父表

外键能用于确认一张表中的行与另一张表中的 行相对应

外键值可以是NULL,即使主键值不可以为NULL

外键值不需唯一

确保外键有意义,用约束

插入外键列的值必须已经存在于父表的来源列中,这是引用完整性

外键不一定必须是父表的主键,但必须有唯一性

创建带有外键的表

CREATE TABLE interests (

int_id INT NOT NULL AUTO_INCREAMENT PRIMARY KEY,

interest VARCHAR(50) NOT NULL,

contact_id INT NOT NULL,

CONSTRAINT my_contacts_contact_id //约束 my_contacts 外键来源表

FOREIGN KEY (contact_id)//contact_id//外键名字 可以随意命名

REFERENCES my_contacts (contact_id)//外键列在另一表中的列名

)

数据表模式:

一对一:父表只有一行与子表的某行相对应

一对多:

多对多:创建中间表 转换为一对多的关系

 组合键就是有多个数据列构成的主键,组合各列后形成具有唯一性的键

 当某一列的数据必须随着另一列的数据改变而改变时,表示第一列函数依赖于第二列

第二范式 符合1NF,没有部分函数依赖性

第三范式 符合2NF,没有传递函数依赖性

AS 能把SELECT查询结果放到新表中/创建别名

联接:

1.交叉联接(笛卡尔积) SELECT t.toy,b.boy FROM toys AS t CROSS JOIN boys AS b;

2.内联接 就是通过查询中的条件移除了某些结果数据行后的交叉联接 inner join,相等联接,不等联接,自然联接(NATURE JOIN存在同名列时)

SELECT nt.title,nt.content,nc.class_name

FROM notesapp_notetable AS nt INNER JOIN
notesapp_noteclasstable AS nc ON
nt.noteclass_id=nc.id;

子查询 是被另一个查询包围的查询,也叫内查询(子查询设计起来比联接简单)

非关联子查询 :如果子查询可以独立运行且不会引用外层查询的任何结果

关联子查询:内层查询的解析需要依赖外层查询的结果,常见用法是找出外层查询结果不存在于关联表里的记录 EXISTS NO EXSTS

 

外联接:

左外联接:LEFT OUTER IN会匹配左表的每一行及右表的符合条件的每行,当左表与右表存在一对多的关系时特别有用

左外连接的结果集中的NULL表示右表中没有找到与左表中相符的记录

右外联接根据左表评估右表

 

自联接:能把同一张表当成两张具有完全相同信息的表进行查询

自引用外键:出于其他目的而用于同一张表的主键 SELECT cl.name,c2.name AS boss FROM  clown_info c1 INNER JOIN clown_info c2 WHERE c1.boss_id=c2.id;

 

联合UNION (并集)把多张表的查询结果合并至一个表,UNION只能接受一个ORDER BY必须位于语句的末端

UNION规则:每个SELECT语句的列数必须一致;包含的表达式和统计函数必须相同;列的数据类型必须相同或可以相互转换;默认会清楚联合结果中的重复值,可以使用UNION ALL看到重复值

从联合创建表 CREATE TABLE tablename AS SELECT....

INTERSECT 交集 与 EXCEPT差集 (与union用法相同)

 

检查约束 CHECK 约束限定允许插入某个列的值,与WHERE子句使用相同的条件表达式,如果插入的值无法通过CHECK条件,则出现错误信息

 

创建视图:CREATE VIEW viewname AS 查询语句,虚拟表

查看视图:SELECT * FROM viewname;行为与子查询一样

利用视图插入、更新、删除

带有CHECK OPTION的视图,检查每个进行INSER INTO或DELETE的查询,根据视图中的WHERE子句来判断这些查询可否执行

 

事务:

是一群可以完成一组工作的SQL语句

在事务过程中,如果所有步骤无法不受干扰的完成,则不该完成任何单一步骤

ACID 原子性 一致性 隔离性 持久性

三种SQL事务工具可以保障账户的安全:

START TRANSACTION;持续追踪后续所有SQL语句

COMMIT;在commit之前数据库都不会发生改变

ROLLBACK;回到事务开始之前的状态

让事务在MySQL下运作:需要选用正确的存储引擎(有些不行)

存储引擎必须是BDB或InnoDB,两种支持事务的引擎之一

ALTER TABLE tablename TYPE=InnoDB

必须用START TRANSACTION告诉RDBMS事务开始

 

安全:

设置用户密码mysql:SET PASSWORD FOR 'root'@'localhost'=PASSWORD('password')

添加新用户:

CREATE USER username IDENTIFIED BY 'password';

赋予权限:GRANT

GRANT SELECT ON tablename(对表的操作) TO username;

GRANT ALL把对表所有的操作赋予赋予用户

databasename.*把权限范围运用到数据库的每张表上

A撤销权限:REVOKE

REVOKE SELECT ON tablename FROM username

 

角色:CREATE ROLE rolename;(MySQL没有角色功能)

授予角色权限:GRANT SELECT,INSERT ON tablename TO rolename;

使用角色:GRANT rolename TO username;

卸除角色:DROP ROLE rolename;

 

结合CREATE USER 与 GRANT:

GRANT SELECT ON clown_info TO username IDENTIFIED BY 'password';

558

 

 

 

posted @ 2012-09-12 00:25  Aveen  阅读(287)  评论(0编辑  收藏  举报
Top