我爱编程

Mysql

2018-04-09  本文已影响0人  Gukson666

Mysql是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS

主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
外键:外键用于关联两个表.。

1.数据以表格的形式出现
2.每行为各种记录名称
3.每列为记录名称所对应的数据域
4.许多的行和列组成一张表单
5.若干的表单组成database

具体连接参照node连接数据库笔记,使用navicat。

这里主要记录需要重点掌握的:

数值类型;INTEGER DECIMAL(M,D) NUMERIC FLOAT DOUBLE
日期和时间类型:DATETIME(YYYY-MM-DD HH:MM:SS混合)、DATE(YYYY-MM-DD)、
TIMESTAMP、TIME(HH:MM:SS)和YEAR(YYYY)
字符串类型:CHAR(定长)、VARCHAR(变长)、TEXT(长文本数据)

show databases 显示数据库 use 某个库 show tables 显示有什么表
CREATE TABLE table_name;
DROP TABLE table_name ;
修改:修改数据表使用 RENAME 子句来实现。
ALTER TABLE testalter_tbl RENAME TO alter_tbl;
修改字段的默认值:
ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;
修改字段类型及名称:把字段 c 的类型从 CHAR(1) 改为 CHAR(10)
ALTER TABLE testalter_tbl MODIFY c CHAR(10);
使用 ADD 子句来向数据表中添加列
ALTER TABLE testalter_tbl ADD i INT;
使用了 ALTER 命令及 DROP 子句来删除以上创建表的 i 字段:
ALTER TABLE testalter_tbl DROP i;

查询
SELECT column_name,column_name FROM table_name [WHERE Clause] [OFFSET M ][LIMIT N]

插入
INSERT INTO table_name ( field1, field2,...fieldN ) VALUES ( value1, value2,...valueN );
INSERT INTO table_name (field1, field2,...fieldN) VALUES (valueA1,valueA2,...valueAN),(valueB1,valueB2,...valueBN),(valueC1,valueC2,...valueCN)......;

Where子句:
你可以在 WHERE 子句中指定任何条件。
你可以使用 AND 或者 OR 指定一个或多个条件。
WHERE 子句也可以运用于 SQL 的 DELETE 或者 UPDATE 命令。

更新
UPDATE table_name SET field1=new-value1, field2=new-value2 可以同时更新一个或多个字段。
[WHERE Clause] 可以在 WHERE 子句中指定任何条件。

删除
DELETE FROM table_name [WHERE Clause]

Like子句及通配符:
SELECT field1, field2,...fieldN FROM table_name WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'

UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT 语句会删除重复的数据。
select ... UNION [ALL | DISTINCT] select ...

排序:
SELECT field1, field2,...fieldN table_name1, table_name2... ORDER BY field1, [field2...] [ASC [DESC]]

分组:
GROUP BY 语句根据一个或多个列对结果集进行分组。
在分组的列上我们可以使用 COUNT, SUM, AVG,等函数,所以一般有聚集函数都有分组
SELECT column_name, function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name;

过滤分组:所有类型的where子句都可以用having代替,区别在于where过滤行,having过滤分组。
一般使用group by子句时,应该也给出order by子句。

联结:
简单联结:通过where子句将两个表中相同属性列关联起来
如:where Vendors.vend_id = Products.vend_id 多个表则用and拼在一起

高级联结:
自联结:select c1.cust_name, c1.cust_contact from Customers as c1 , Customers as c2 where c1.cust_name = c2.cust_name and c2.cust_contact = 'Jim'

Select Customers.cust_id,Orders.order_num
From Customers inner join Orders
On Customers.cust_id = Orders.cust_id;

Select Customers.cust_id,Orders.order_num
From Customers left join Orders
On Customers.cust_id = Orders.cust_id;

Select Customers.cust_id,Orders.order_num
From Customers right join Orders
On Customers.cust_id = Orders.cust_id;

NULL值:

补充正则:
[...] 字符集合。匹配所包含的任意一个字符
[^...] 负值字符集合。匹配未包含的任意字符
. 匹配除 "\n" 之外的任何单个字符
*匹配前面的子表达式零次或多次
^ 匹配输入字符串的开始位置
$ 匹配输入字符串的结束位置
+匹配前面的子表达式一次或多次
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。

查找name字段中以'st'为开头的所有数据:
SELECT name FROM person_tbl WHERE name REGEXP '^st';
查找name字段中以'ok'为结尾的所有数据:
SELECT name FROM person_tbl WHERE name REGEXP 'ok$';

Mysql事务处理

1、事务的原子性:一组事务,要么成功;要么撤回。
2、稳定性 :有非法数据(外键约束之类),事务撤回。
3、隔离性:事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。
4、可靠性:软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改。可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit 选项 决定什么时候吧事务保存到日志里。

事务控制语句:
BEGIN或START TRANSACTION;显式地开启一个事务;
COMMIT;也可以使用COMMIT WORK,不过二者是等价的。COMMIT会提交事务,并使已对数据库进行的所有修改称为永久性的;
ROLLBACK;有可以使用ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;
SAVEPOINT identifier;SAVEPOINT允许在事务中创建一个保存点,一个事务中可以有多个SAVEPOINT;
RELEASE SAVEPOINT identifier;删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;
ROLLBACK TO identifier;把事务回滚到标记点;
实例:

mysql> begin;  # 开始事务
Query OK, 0 rows affected (0.00 sec)
mysql> insert into runoob_transaction_test value(5);
Query OK, 1 rows affected (0.01 sec)
mysql> insert into runoob_transaction_test value(6);
Query OK, 1 rows affected (0.00 sec)
mysql> commit; # 提交事务
Query OK, 0 rows affected (0.01 sec)

mysql> begin;    # 开始事务
Query OK, 0 rows affected (0.00 sec)
mysql>  insert into runoob_transaction_test values(7);
Query OK, 1 rows affected (0.00 sec)
mysql> rollback;   # 回滚
Query OK, 0 rows affected (0.00 sec)

补充: INSERT IGNORE INTO与INSERT INTO的区别就是INSERT IGNORE会忽略数据库中已经存在的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据。

所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
我们永远不要信任用户的输入,我们必须认定用户输入的数据都是不安全的,我们都需要对用户输入的数据进行过滤处理。
可以通过正则表达式,或限制长度;对单引号和 双"-"进行转换等。
永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。

导出数据:可以使用SELECT...INTO OUTFILE语句来简单的导出数据到文本文件上。
SELECT * FROM runoob_tbl INTO OUTFILE '/tmp/tutorials.txt';

导入数据:LOAD DATA INFILE语句来插入数据。 以下实例中将从当前目录中读取文件 dump.txt ,将该文件中的数据插入到当前数据库的 mytbl 表中。
LOAD DATA LOCAL INFILE 'dump.txt' INTO TABLE mytbl;

文本处理函数:LENGTH() LOWER() UPPER()
聚集函数:AVG() COUNT() MAX() MIN() SUM()

视图是虚拟的表:只包含使用时动态检索数据的查询。
主要作用是保护基础数据,简化数据处理。
create view pc as select........

完全限定列名即表示字段前面要指明表名,这样不容易混淆,可读性好。

补充子查询:从内向外处理,但是性能低。
select id from orders where or_num in (select or_num from orderitems where prod_id = 'R01')

上一篇下一篇

猜你喜欢

热点阅读