SQL语言对大小写不敏感,但一般使用大。
1.创建数据库
CREATE DATABASE test;
2.授予权限
CRANT ALL ON test.* to user(s);
3.使用指定数据库
USE test;
4.删除数据库(可删除数据库里所有的表数据,并将其从系统中删除)
DROP DATABASE test;
5.创建一个字符串列,login,两个整形列,userid、projid
CREATE TABLE user (login VARCHAR(8),userid INT,projid INT);
6.删除数据库中的一个表,并清空其中的所有数据
DROP TABLE users;
7.向数据库插入一个新行,需要指定表名以及其中每列的值。
INSERT INTO users VALUES('leanna',211,1);
8.更新行
UPDATE users SET projid=4 WHERE projid=2;
UPDATE users SET projid=1 WHERE userid=311;
修改以及存在的行用UPDATE语句。使用SET来确定需要修改的列,并提供条件
来确定修改的行。在一个例子,所有的 project id为2的改为4.
在第二个例子中,将UID为311的用户移动到编号为#1的项目组中。
9.删除行
DELETE FROM users WHERE projid=%d;
DELETE FROM users;
例子1删除指定行,例子2没指定,将所有行删除。
******************************************************************************
例:
+----+--------------+---------------------------+-------+---------+
| id | name | url | alexa | country |
+----+--------------+---------------------------+-------+---------+
| 1 | Google | https://www.google.cm/ | 1 | USA |
| 2 | 淘宝 | https://www.taobao.com/ | 13 | CN |
| 3 | 菜鸟教程 | http://www.runoob.com/ | 4689 | CN |
| 4 | 微博 | http://weibo.com/ | 20 | CN |
| 5 | Facebook | https://www.facebook.com/ | 3 | USA |
+----+--------------+---------------------------+-------+---------+
10.从数据库中选取数据
SELECT name,country FROM Websites;
从Websites选取name,country
SELECT *FROM websites;
从Websites选取所有列。
11. SELECT DISTINCT country FROM Websites;
从websites选country取出唯一不同的值,也就是说去除重复的。
12.WHERE 用于过滤
SELECT * FROM websites WHERE country ='CN';
从websites取出,country为CN所有国家的网站。
13.''单引号只用作文本,如果是数字不可以用引号。
SELECT *FROM websites WHERE id=1;
14.AND 和 OR 运算符
在使用WHERE可以配上AND 和 OR以增加过滤条件
SELECT *FROM websites WHERE contry='CN' AND alexa > 50;
SELECT *FROM websites WHERE alexa >50 AND(country='CN' OR country='USA' );
15.ORDER BY 用于对结果集排序
ORDER BY 默认从小到大,若想从大到小,需在后面加上DESC
SELECT * FROM websites ORDER BY alexa;
按照alexa从小到大排序
SELECT * FROM websites ORDER BY alexa DESC;
按照alexa从大到小排序
SELECT * FROM websites ORDER BY country,alexa;
按照country和SELECT进行排序
16.INSERT INTO插入语句
不在指定列插入
INSERT INTO websites(name, url, alexa, country) VALUES('百度','https://www.baidu.com/','4','CN');
在指定列中插入行
INSERT INTO websites(name, url,country) VALUES('百度','https://www.baidu.com/',CN');
17.UPDATE 更新数据
UPDATE websites
SET alexa='5000',country='USA'
WHERE name='菜鸟教程';
如果不加WHERE会把表里所有所有alexa和country更改
18.DELETE 删除数据
DELETE FROM websites WHERE name='百度' AND country='CN';
如果要将所有行删除,则不需加WHERE。这个时候会保留表的结构、属性、索引。
DELETE FROM table_name;
DELETE * FROM table_name;
************************************************************************
+-----+---------+-------+------------+
| aid | site_id | count | date |
+-----+---------+-------+------------+
| 1 | 1 | 45 | 2016-05-10 |
| 2 | 3 | 100 | 2016-05-13 |
| 3 | 1 | 230 | 2016-05-14 |
| 4 | 2 | 10 | 2016-05-14 |
| 5 | 5 | 205 | 2016-05-14 |
| 6 | 4 | 13 | 2016-05-15 |
| 7 | 3 | 220 | 2016-05-15 |
| 8 | 5 | 545 | 2016-05-16 |
| 9 | 3 | 201 | 2016-05-17 |
+-----+---------+-------+------------+
SQL函数
19.SQL COUNT()函数 函数返回指定列值的数目
SQL COUNT(*)函数 返回所有行的数目
SQL COUNT(DISTINCT) 返回指定列不同行的数目
SELECT COUNT(count) AS nums FROM access_log //括号里的count什么意思。
WHERE site_id=3;
求sit_id=3时总访问量
SELECT COUNT(*) AS nums FROM access_log;
求"access_log" 表中总记录数
SELECT COUNT(DISTINCT site_id) As nums FROM access_log;
20.SQL SUM()函数 求 指定数字的那一列(count) 的总数。
SELECT SUM(count) As nums FROM access_log;
21.SQL SELECT LIMIT语句
从websites库中选取头两条
SELECT * FROM websites LIMIT 2;
当指定了位置偏移量时,从websites库第3条起取4条时,默认偏移量为0
SELECT * FROM websites LIMIT 1,4;
22.SQL SELECT TOP 语句 也表示取前多少数据
TOP PERCENT:SELECT TOP 50 PERCENT * FROM websites;
表示从websites取前百分之50
23.SQL GROUP BY 语句用于结合聚合函数,根据一个或多个列对结果集进行分组。
SELECT site_id,SUM(count) As nums FROM access_log GROUP BY sit_id;
24.SQL HAVING 语句 与WHERE关键字对比去记,因为WHERE无法与聚合函数一起使用。HAVING 子句可以让我们筛选分组后的各组数据。
25.WHERER 与 SELECT连用,在查询数据时做筛选的;在筛选的时候,除了用'=' '>' '<' and or等条件判断之外
还可以使用:'in' 'BETWEEN 1 AND 20' 表示范围。
26.在查询中涉及超过一个表,在查询中使用了函数,列名称很长或者可读性差,需要把两个列或者多个列结合在一起
以上四个条件适合将表或列改为别名。
AS +name
具体用法:SELECT name AS n, country AS c FROM Websites;
就是查询表Websites,将name列与country更名为n或c在输出。同理表的名也可如此更改。AS一般放FROM后使用
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="菜鸟教程";
27.SQL INNER JOIN 连接两个表格
找到两个表格的公共部分,一般都是id。将两个表格连接成一个表格。并将将所需要信息提取出来。
SELECT websites.name,access_log.count, access_log.date
FROM websites INTER JOIN access_log
ON websites.id = access_log.site_id
ORDER BY access_log.count;
28.SQL CREATE DATABASE 语句 创建一个库
CREATE DATEBASE my_db; 创建一个名为 "my_db" 的数据库
29.SQL CREATE TABLE 语句 创建一个表
现在想要创建一个名为 "Persons" 的表,包含五列:PersonID、LastName、FirstName、Address 和 City。
CREATE TABLE Persons
(
【column_name1 data_type(size),】
PersonID int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
30.LIKE 与WHERE 用于筛选字符串
'%a' //以a结尾的数据
'a%' //以a开头的数据
'%a%' //含有a的数据
‘_a_’ //三位且中间字母是a的
'_a' //两位且结尾字母是a的
'a_' //两位且开头字母是a的
SELECT * FROM Websites
WHERE name LIKE '%k';
输出name以k结尾的的行。
--------------------------------------------
1.事物---->保证业务逻辑的完整性
四大特性ACID
1)原子性:数据库操作是不可分割的,要么全做完,要么不执行
2)一致性:数据库操作的顺序与结果无关
3)隔离性:加锁,不受其他事物干扰
4)持久性:任意提交事物,系统保证改变不被丢失,即使数据库出现故障。
2.数据库引擎
* 引擎:数据库操作的底层代码,内部设计数据结构与算法
3.使用事物的情况:当数据被更改时:insert update delete
* 表锁--------必须等到一个人操作完了解锁以后另一个人才能操作
* 行锁--------允许多个人操作一张表,即只要不操作被锁的那一行即可。
* begin开始事物------>上锁----->sql语句---------->产生内存级临时表
* commit------------->将刚刚临时表里的数据转移到数据库
* rollback-------->撤销刚刚操作
4.索引----索引是一种加快检索速度的数据结构
* 数据默认是按照主键索引存储的。
* 索引的分类:
按照建索引的方式
单列索引,即索引只包含一个类
组合索引,即一个索引包含多个列
聚集索引
非聚集索引
* 使用索引的缺点:
建立太多了索引会导致物理开销太大,即会占用太多的内存空间。
增加了对表的维护成本。在对表更改时,不仅要保存数据,还有保存索引文件。
* 对某个列建索引,尽量让这个有比较间单的数据类型,越小处理越快,避开NULL
* 没有索引WHERE一行一行查,有了索引一步到位。
* 对于范围查找的字段索引可能会失效,等值往前写,范围往后写,尽量不用or
* 查看索引 show index from 字段名;
* 创建索引 create index 索引名 on 表名(字段名(字段长度)) 数字可以不用指定长度
* 删除索引 DROP index [索引名] on 表名
5.最左前缀原则
如果对column1,column2,column3建立了联合索引,那么在使用该索引时只有三种组合,它们分别是:column1 、column1 and column2、column1 and column2 and column3,
概括起来就是想要使用右边的索引,必须用上左边的所有索引。如果只使用column2作为where的查询条件,将不会用到所建好的索引。这是为什么呢?请看表2。这就好比直接用月薪作为查询条件,
有没有发现月薪是呈全局乱序的状态,尽管它是局部有序的。
如果业务上要求只能用月薪来查询,可行的解决办法是在建立联合索引时把月薪放在最左边,或者直接建立单列索引。
建立联合索引时,数据粒比较小的放大左边
6.索引的本质其实就是新建了一张表,而表本质上的数据结构就是树形结构,所以索引也是树形结构
7.聚集索引:聚集索引的顺序就是数据存储的物理顺序,一个表只能包含一个聚集索引。所以查找更快
非聚集索引:非聚集索引存储在一个地方,数据存储在另一个地方,索引带有指针指向数据存储位置。
索引中的项目按引健值的顺序存储,而表中的信息按另一种顺序存储。
InnoDB的数据文件本身就是索引文件。从上文知道,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。
8.聚合
COUNTMAXMIN(id) SUMAVG---必须是(int 或 double)
原始数据看到了,只能看结果。
9.子查询,查询里面嵌套查询
10.分组
分组一般与聚合连用。分组的目的为了更好的统计,非聚合字段不能出现结果集。
分组依据一般是一个字段里相同的会被分到一块去
11.分组后筛选用WHERE
WHERE对原始集进行筛选,HAVING 对分组后的结果集进行筛选。
12.关联表查询
连接分为内链接inner JOIN、左连接 left JOIN 、 右right JOIN
三种连接的差异就在于结果集能显示出来的数据不同,使用内链接,结果集只能显示出两个表匹配上的信息。
使用left join 在显示两个表匹配上信息的基础上,额外还会增加的是左边表独有的信息,没匹配上的用NULL
使用right join 在显示两个表匹配上信息的基础上,额外还会增加的是右边表独有的信息,没匹配上的用NULL
具体操作方式 SELECT 查询的信息用.表示 FROM tablename1
INNER JOIN/LAFT JOIN/ RIGHT JOIN ON tablename1. = tablename2.
13.查询语句顺序
先结果集——然后关联——然后WHERE 筛选——然后GROUP BY/ORDER BY ——然后HVING 对分组过的结果集筛选
14.分页用limit 每页m条数据,当前显示n页
limit n *m ,m n从0开始
15.一索引二级索引
一级索引:
innoDB会自动建立聚集索引,即将数据与索引存放在一起。使用B+tree的数据结构,将数据存储在叶子结点,
各个叶子结点通过指针相连。
1) InnoDB通常根据主键值(primary key)进行聚簇
2) 如果没有创建主键,则会用一个唯一且不为空的索引列做为主键,成为此表的聚簇索引-----自增id
3) 上面二个条件都不满足,InnoDB会自己创建一个虚拟的聚集索引,隐藏。
辅助索引:
在聚簇索引之上创建的索引称之为辅助索引,辅助索引访问数据总是需要二次查找。辅助索引叶子节点存储的不再是行的物理位置,而是主键值。
通过辅助索引首先找到的是主键值,再通过主键值找到数据行的数据叶,再通过数据叶中的Page Directory找到数据行。
即二级索引是我们后建的,它只存储了部分的数据。如果根据键值查找到的数据不能包括全部目标数据时
(就是无法使用到覆盖索引),就需要通过二级索引的指针,也就是键值对中的值,来找到聚簇索引的全部数据,
然后根据完整的数据取出所需要的列的过程就称之为回表。
16.行级锁和页级锁会出现死锁,表锁不会。
表锁的好处是上锁解锁快,并且能避免出现死锁。
17.使用锁是为了保持数据的一致性,但要避免死锁,死锁是两个或多个事物在同一资源上相互占用,并请求锁定对方的资源,
从而导致恶性循环的现象。
常见的解决死锁的方法
1、如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表,可以大大降低死锁机会。
2、在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率;
3、对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率;
如果业务处理不好可以用分布式事务锁或者使用乐观锁
18.乐观锁与悲观锁
悲观锁:
悲观锁指对数据被意外修改持保守态度,依赖数据库原生支持的锁机制来保证当前事务处理的安全性,
防止其他并发事务对目标数据的破坏或破坏其他并发事务数据,
将在事务开始执行前或执行中申请锁定,执行完后再释放锁定。这对于长事务来讲,
可能会严重影响系统的并发处理能力。 自带的数据库事务就是典型的悲观锁。
乐观锁:
乐观锁(Optimistic Lock),顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,
但是在提交更新的时候会判断一下在此期间别人有没有去更新这个数据。乐观锁适用于读多写少的应用场景,这样可以提高吞吐量。
一般是加一个版本号字段 每次更新时候比较版本号
19.innodb的主键是主索引,MyISAM的主键与辅助没什么区别,存的是数据的地址。
所以InnoDB要求表必须有主键(MyISAM可以没有)InnoDB的所有辅助索引都引用主键作为data域。
聚集索引搜索是很高效的,而辅助索引必须遍历两遍。遍历第一遍获得主键,根据主键检索。