mysql数据库

 数据库三个范式:

 1,第一范式:每一列都是不可分割的数据项,即列不可重复

2,第二范式:每一个实例的非主属性都依赖于主属性,每一行都是一个单独的尸体。

3,第三范式:属性不依赖于非主属性。

数据库引擎:

1,innoDB(支持事务和外键)

2,ISAM(查询速度快,但是不支持事务机制)

第一部分(DDL)
一、查看语句
一、查看所有的数据库: show databases; 二、查看数据库中所有的表: use database_name; show tables; 三、查看数据库支持的编码: show variables like 'character%'; 四、查看表的具体结构 desc table_name; 或者 show columns in|from table_name; 五、查看数据库引擎 show engines;
六、查看数据库中的触发器
show triggers in db_name;
七、查看是否开启事件调度器
SHOW VARIABLES LIKE ‘EVENT_SCHEDULER’;
如果想要开启事件调度器:
SET GLOBAL EVENT_SCHEDULER=TRUE;
以上查看语句都可以加上like或者where子句 二、创建语句
一、创建数据库: CREATE DATABASE IF NOT EXISTS sql_test; 二、创建表格: CREATE TABLE IF NOT EXISTS customers ( cust_id INT NOT NULL AUTO_INCREMENT, cust_name CHAR(50) NOT NULL, cust_sex CHAR(1) NOT NULL DEFAULT 0, cust_address CHAR(50) NULL, cust_contact CHAR(50) NULL, PRIMARY KEY (cust_id) ) ENGINE=InnoDB;
三,创建触发器
CREATE TRIGGER trigger_name trigger_time trigger_event
ON table_name FOR EACH ROW trigger_body;
触发器分为三种:insert,update,delete触发器。insert关联一个new临时表,delete关联一个old临时表,update关联一个old和new临时表。
三种都可以选择trigger_time为BEFORE或者AFTER;如果希望验证新书据是否满足使用限制,那么使用before,如果希望在激发叉发起之后执行的操作,则使用after;
四、创建事件
CREATE
EVENT IF NOT EXISTS
event_name
ON SCHEDULE (AT timestamp【+INTERVAL】|EVERY interval STARTS timestamp[+interval] ENDS timestamp[+interval] )
DO (EVENT_BODY<包括在begin..end语句中>)
注意如何开启、关闭、重命名事件(ALTER子句)
五、创建存储过程(存储过程实际上就是一组预先编译的sql语句) CREATE PROCEDURE sp_name (参数列表,分IN,OUT,INOUT)
BEGIN...(任何有效的sql语句)...END
在创建事件、存储过程等包括begin...end的语句中,一般需要这么两句:
EDLIMITER $$...END $$;
中间可能会使用到各种诸如局部变量、流程控制、游标等知识点。
存储过程的调用 CALL sp_name(参数列表)
六、创建存储函数<不能拥有输出参数>
CREATE FUNCTION 函数名(参数列表)
RETURNS TYPE
BEGIN。。。END 
存储函数的调用:
SELECT func_name(参数列表);
七、创建用户
select password('bobo');//得到bobo的密文
CREATE USER ‘bobo’@'localhost' IDENTIFIED BY'bobo'
'bobo2'@'localhost' IDENTIFIED BY  PASSWORD 上步的结果。
关于赋予用户权限(GRANT)或者撤销(REVOKE)权限的操作,可以参见教材。 三、删除(DROP)语句[一般可以加上IF EXISTS判断]
(ddl即对数据库或者数据表结构的删除使用drop,对于数据的删除使用delete) 一、删除数据库: DROP DATABASE IF EXISTS mysql_test; 二、删除表格: DROP TABLE IF EXITS customer 三、删除数据表中的某一列 ALTER TABLE mysql_test.customers DROP COLUMN cust_name; 四、删除原表格中的主键: ALTER TABLE customers DRAP PRIMARY KEY;
五、删除触发器
DROP TRIGGER IF EXISTS trigger_name;
六、删除事件
DROP EVENT event_name;
七、删除存储过程
DROP PROCEDURE IF EXISTS sp_name;
八、删除存储函数
DROP FUNCTION IF EXISTS function_name;
九、删除用户
DELETE USER userName@host;(注意@子句是不能缺少的) 四、重命名语句
1,数据库重命名 RENAME {DATABASE | SCHEMA} db_name TO new_db_name; 但是这个方法在新版本中貌似会报错,一般采用复制数据库的方法 2,数据表重命名 RENAME TABLE old_table_name TO new_table_name; 或者 ALTER TABLE old_table_name RENAME TO new_table_name; 表格复制的语句如下: CREATE TABLE IF EXITES table_name LIKE old_table_name; 不过这种复制仅仅复制表的结构,数据并没有复制;如果需要可以利用关键字as复制表的内容 3,数据表中的列重命名 ALTER TABLE customers CHANGE COLUMN cust_sex sex CHAR(1) NULL DEFAULT 'm'; 五、修改语句
一、修改数据库 ALTER DATABASE sql_test DEFAULT CHARACTER SET utf8 DEFAULT COLLATE bb2312_chinese_ci; 二、修改表格结构 1 向数据表中增加新列 ALTER TABLE customers ADD COLUMN cust_city CHAR(10) NOT NULL DEFAULT 'wuhan' AFTER cust_sex; 2删除原表格中的主键: ALTER TABLE customers DRAP PRIMARY KEY; 3 向数据表中增添主键、外键或者索引 ALTER TABLE customers ADD PRIMARY KEY (ADD FOREIGN KEY)(ADD INDEX); 7,4 修改列的名称或者数据类型 ALTER TABLE customers CHANGE COLUMN cust_sex sex CHAR(1) NULL DEFAULT 'm'; 5修改列的默认值 ALTER TABLE mysql_test.customers ALTER COLUMN cust_city SET DEFAULT 'beijing' 6修改列的数据类型 ALTER TABLE mysql_test.customers MODIFY COLUMN cust_name char(20) first; 7删除数据表中的某一列 ALTER TABLE mysql_test.customers DROP COLUMN cust_name; 第二部分(DML):
上面都是对数据库或者数据表的结构进行修改。(DDL语句);下面则是对数据库中数据的操作(dml语句)
一、插入语句 INSERT INTO customers(cust_id,cust_name,cust_sex,cust_address,cust_contacts) VALUES (null,'bobo',DEFAULT,'zhengzhou','123456'); 注意: (1)对于dml语句只可能针对table,因此不需要显式知名table (2)对于自动增长列,若指定null,那么系统自动赋值,也可在插入时候将此列忽略;如果插入某个具体的值,如果》当前值,那么接下来的列将在这个值的基础上增长。而且建议省略该列 (3)对于具有默认值的列,可以用DEFAULT关键字进行指定,也可以在插入时候省略 (4)对于可以为空的列,可以使用null关键字进行指定,也可以在插入时候省略。 (5)如果该列是char类型,那么在赋值时候需呀使用‘’包括 (6)如果该列是TIMESTAMP类型,那么系统会进行自动赋值 可以使用INSERT 。。。SET。。语句,插入部分列的值。 INSERT INTO mysql_test.customers SET cust_name='bobo2',cust_address='henan'; 可以一次插入多条语句 INSERT INTO customers (cust_name,cust_sex,cust_address,cust_contacts) VALUES ('bobo',DEFAULT,'zhengzhou','123456') ('bobo2','f','henan','654321'); 因此如果仅仅是复制一张空表: CREATE TABLE customers_copy LIKE customers; 如果需要和数据一起复制: 可以使用INSERT...SELECT...(此时不再需要values) INSERT INTO customers_copy (cust_id,cust_name,cust_sex,cust_address,cust_contacts) SELECT cust_id,cust_name,cust_sex,cust_address,cust_contacts FROM customers; 不需要名称一样,但是需要对应的数据类型相同 或者 CREATE TABLE customers_copy AS SELECT cust_id,cust_name,cust_sex,cust_address,cust_contacts FROM customers;
REPLACE插入表数据
如果存在冲突(主要是主键,unique类型限制的冲突),就替代,否则直接插入,语法和insert是相同的
REPLACE INTO customers (cust_id)values(6);
二、删除语句 DELETE FROM语句: delete from customers where cust_id = 3;
delete还能够从多表中删除记录:
delete from tbl1,tbl2 FOME tbl1,tbl2,tbl3 WHERE tbl1.id=tbl2.id AND tbl2.id=tbl3.id;
TRUNCATE语句:
如果是将表格清空:TRUNCATE customers;
三、修改语句
UPDATE语句:
UPDATE customers SET cust_address='zhengzhou' WHERE cust_id=1;
类似delete,update也可以修改多张表
四、查询语句(这也是数据库最关键的部分) 关于这部分,可以查看自己之前的笔记,这里仅做部分补充。
一、查询子句种类
1,select(必须,函数或者返回的列)
2,from(非必须,如查询函数值)
3,where(非必须,进行行级过滤)
4,group by(非必须,分组时用到)
5,having(非必须,必须用在group by之后)
6,order by(非必须,排序用)
7,limit(非必须,要检索的行数)
注意,所有子句必须按照上面的顺序罗列使用
二、查询结果进一步处理
(希望对查询结果分析结果,而不是查询得到的原始数据)

三、mysql中的聚合函数:
COUNT,MIN,MAX,SUM,AVG,STD,VARIANCE,GROUP_CONCAT,BIT_AND,BIT_OR,BIT_XOR;
聚合函数一般和group by一起使用,此时聚合函数对所有列其作用;否则仅仅对一行起作用。

四、from中的连接子句:
1,交叉连接或者内连接,返回两个表格的迪卡尔积。总条目为两个表条目的积。
2,外联接。
如果是LEFT OUTER JOIN,则左表格不匹配的行依旧存在。右外连接与之相反。
五、where中的相关运算(不能包含聚合函数)
1,比较运算符=,<>,!=,<,<=,>,>=,<=>(不会返回unknown);
2,like
match_express [not] like match_expression [escape 'escape_char']
其中,match_expression中%代表任何字符,_代表一个。如果想改变其通配符意义,使用前面一个字符和escape来实现。
3,正则表达式匹配
match_express [not] regexp match_express ;
正则具体的用法见教材75
4,between...and...范围匹配;in 选择匹配
5,判断控制   IS 【NOT】 NULL;
6,子查询
分为四类:表自查询、行子查询、列子查询、标量子查询。
六、GROUP BY子句
group by中不能是聚合函数,其中的每个列或者表达式必须在select子句中出现。
七、having子句
经常和group by子句结合使用,where用于过滤行,having用来过滤分组;where实在分组之前过滤,having在分组之后过滤,where不能使用聚合函数,having可以。
八、ORDER BY子句
order by cust_name asc,cust_id desc;
九、LIMIT子句
LIMIT 4,3;(结果集从第四条开始取3条)
十、UNION子句
用来连接多个查询结果集,其中每个select必须包含相同或者兼容的列、表达式或者聚合函数。
(查询语句是sql的核心,这部分的内容,建议看看之前的听课笔记。)

五、数据库的完整性约束

完整性包括:
实体完整性(PRIMARY KEY(col_name,...)、UNIQUE);
参照完整性:外键约束
CREATE TABLE orders
(order_id INT NOT NULL AUTO_INCREMENT,
 order_name CHAR(50) NOT NULL,
 PRIMARY KEY(order_id),
FOREIGN KEY(order_name)
REFERENCES customers(cust_id)
ON DELETE RESTRICT
ON UPDATE RESTRICT
);
用户定义的完整性:
主要是not null约束、check约束。check后可以是任何的sql子句。
可以使用CONSTRAINT给约束起名字。这样就可以对约束进行删除或者修改。
表格维护语句:
ANALYZE TABLE tableName;检查索引的散列程度
CHECK TABLE tableName;检查表格是否有错误
CHECKSUM TABLE tableName;计算校验和
OPTIMIZE TABLE tableName;重新利用未使用的空间,并整理文件的碎片。
REPAIR TABLE tableName;尝试修复表格。

六、触发器





第三部分:依照教材顺序排列的相关语句

1,创建数据库: CREATE DATABASE IF NOT EXISTS sql_test; 2,选择数据库 USE sql_test; 3,修改数据库 ALTER DATABASE sql_test DEFAULT CHARACTER SET utf8 DEFAULT COLLATE bb2312_chinese_ci; 4,查看数据库的编码 SHOW VARIABLES like 'character%' 5,删除数据库 DROP DATABASE IF EXISTS sql_test; 6,创建数据表 CREATE TABLE IF NOT EXISTS customers ( cust_id INT NOT NULL AUTO_INCREMENT, cust_name CHAR(50) NOT NULL, cust_sex CHAR(1) NOT NULL DEFAULT 0, cust_address CHAR(50) NULL, cust_contact CHAR(50) NULL, PRIMARY KEY (cust_id) ) ENGINE=InnoDB; 7, 修改数据表结构 7,1 向数据表中增加新列 ALTER TABLE customers ADD COLUMN cust_city CHAR(10) NOT NULL DEFAULT 'wuhan' AFTER cust_sex; 7,2删除原表格中的主键: ALTER TABLE customers DRAP PRIMARY KEY; 7,3 向数据表中增添主键、外键或者索引 ALTER TABLE customers ADD PRIMARY KEY (ADD FOREIGN KEY)(ADD INDEX); 7,4 修改列的名称或者数据类型 ALTER TABLE customers CHANGE COLUMN cust_sex sex CHAR(1) NULL DEFAULT 'm'; 7.5修改列的默认值 ALTER TABLE mysql_test.customers ALTER COLUMN cust_city SET DEFAULT 'beijing' 7.6修改列的数据类型 ALTER TABLE mysql_test.customers MODIFY COLUMN cust_name char(20) first; 7.7删除数据表中的某一列 ALTER TABLE mysql_test.customers DROP COLUMN cust_contact;
原文地址:https://www.cnblogs.com/bobodeboke/p/3191361.html