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;