“数据库”是以一定方式储存在一起、能够多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。
用来创建数据库中的各种对象-----表、视图、索引、同义词、聚簇等.----CREATE
用来授予或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果,对数据库实行监视等
1) GRANT:授权。
2) ROLLBACK [WORK] TO [SAVEPOINT]:回退到某一点。
回滚---ROLLBACK
回滚命令使数据库状态回到上次最后提交的状态。其格式为:
SQL>ROLLBACK;
3) COMMIT [WORK]:提交。
在数据库的插入、删除和修改操作时,只有当事务在提交到数据
库时才算完成。在事务提交前,只有操作数据库的这个人才能有权看
到所做的事情,别人只有在最后提交完成后才可以看到。
提交数据有三种类型:显式提交、隐式提交及自动提交。下面分
别说明这三种类型。
(1) 显式提交
用COMMIT命令直接完成的提交为显式提交。其格式为:
SQL>COMMIT;
(2) 隐式提交
用SQL命令间接完成的提交为隐式提交。这些命令是:
ALTER,AUDIT,COMMENT,CONNECT,CREATE,DISCONNECT,DROP,
EXIT,GRANT,NOAUDIT,QUIT,REVOKE,RENAME。
(3) 自动提交
若把AUTOCOMMIT设置为ON,则在插入、修改、删除语句执行后,
系统将自动进行提交,这就是自动提交。其格式为:
SQL>SET AUTOCOMMIT ON;
主要有三种形式:插入:INSERT;更新:UPDATE;删除:DELETE
数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE子句组成的查询块:
SELECT <字段名表>
FROM <表或视图名>
WHERE <查询条件>
索引是一种有效组合数据的方式,为快速查找到指定记录
索引作用
索引分类
常用索引
ALTER TABLE table_name ADD INDEX index_name (column_name);
ALTER TABLE table_name ADD UNIQUE (column_name);
ALTER TABLE table_name ADD PRIMARY KEY (column_name);
ALTER TABLE table_name ADD INDEX index_name(column1,column2,...);
ALTER TABLE table_name ADD FULLTEXT (column_name);
查看和删除索引
//查看索引
SHOW INDEX FROM table_name;
//查看全部索引
SHOW INDEX FROM table_name\G;
//删除索引
DROP INDEX index_name ON table_name;
创建索引的指导
注意事项
事务的特性,简称ACID属性
事务是一个完整的操作,事务的各步操作是不可分的,要么全执行,要么都不执行
当事务完成时,数据必须处于一致状态
并发事务之间彼此隔离、独立,它不应以任何方式依赖于或影响其他事务
事务完成后,它对数据库的修改被永久保存
事务的操作(需要存储引擎支持)
关闭自动提交后,从下一条语句开始则开启新事务,需使用commit或rollback语句结束该事务(默认情况下,每条单独的SQL语句视为一个事务)
视图是一张虚拟表,其结构和数据时简历在对表的查询基础上,表示一张表的部分数据或多张表的综合数据;视图中不存放数据;一个原始表可以创建不同的视图。
CREATE VIEW view_name AS SELECT (值列表) FROM table_name;
DROP VIEW [IF EXISTS] view_name;
//用if exists 关键字判断视图是否存在
SELECT (值列表) FROM view_name;
//查看所有视图
SHOW TABLE STATUS WHERE COMMENT='view';
CREATE DATABASE testdatabase;
DROP DATABASE testdatabase;
CREATE TABLE test2(uid INT(4) PRIMARY KEY AUTO_INCREMENT,uname VARCHAR(20) NOT NULL);
//修改表名
ALTER TABLE old_table_name RENAME new_table_name;
DROP TABLE test2;
INSERT INTO table[(列名列表)] VALUES(值列表);
//自增列不赋值,其他列一一对应;
- 批量添加
- 现有表插入新表,如新表已存在不能重复创建:
CREATE TABLE new_table_name(查询语句)//一个表只能执行一次
create table phonelist(select stuno,stuphone from student);
- 插入多条数据:
INSERT INTO table[(列名列表)] VALUES(值列表1),(值列表2),...,(值列表n);
UPDATE table_name SET 列1=值,列2=值,...,列n=值 [WHERE 更新条件];
DELETE FROM table_name [WHERE 删除条件];//删除表中数据
批量删除:TRUNCATE TABLE table_name;
TRUNCATE TABLE注意:*如删除所有数据,推荐使用此命令
1.删除数据无法恢复
2.自增列重新计数
3.无法删除有外键关联的主表
//添加字段
ALTER TABLE table_name ADD column1_name column1_type,...;
//删除字段:
ALTER TABLE table_name DROP COLUMN column_name;
//修改字段:
ALTER TABLE table_name ALTER COLUMN column_name column_type;
//修改字段名
ALTER TABLE table_name CHANGE column_name new_name column_type;
//组合主键
ALTER TABLE table_name ADD CONSTRAINT primary_key_name PRIMARY KEY table_name(column1,column2,...);
//添加外键
ALTER TABLE foreign_table_name ADD CONSTRAINT foreign_key_name FOREIGN KEY (column_name) REFERENCES primary_table_name(column_name);
//删除外键
ALTER TABLE foreign_table_name DROP FOREIGN KEY foreign_key_name;
SELECT */列名列表 FROM table [WHERE 查询条件]
select * from user where id=1;
GROUP BY (column1[,column2,...])
//select后的表达式对每一个分组只能返回一个值
SELECT * FROM user where id>20 GROUP BY gender;
HAVING 筛选条件(只能是聚合函数的形式)
//将使用聚合函数计算并分组后的数据按条件筛选
SELECT *,COUNT(score) FROM user where id>20 GROUP BY name HAVING COUNT(score)>60;
ORDER BY (colunm1 [ASC/DESC],column2 [ASC/DESC],...)
//ASC默认升序/DESC降序
SELECT *,COUNT(score) FROM user where id>20 GROUP BY name HAVING COUNT(score)>60 ORDER BY id DESC;
MySQL分页:
LIMIT [起始值(下标从0开始),]页容量;
Oracle分页:
select column1,column2 from
(select column1,column2,rn from
(select column1,column2,rowNum rn from table)
where rn<=最大值)
where rn>最小值
1.内连接(等值连接/取交集)
SELECT u.*,r.roleName FROM smbms_user u
INNER JOIN smbms_role r ON u.`userRole`=r.`id`
INNER JOIN ... ON ...
[WHERE 查询条件];
2.外连接(以左/右表为主,未匹配的字段为null)
SELECT u.*,r.roleName FROM smbms_user u RIGHT [OUTER] JOIN smbms_role r ON u.`userRole`=r.`id`;
//所有的表连接查询都可以用子查询替换,反之不对。
//LIKE :一般与字符串字段配合使用
通配符:%(匹配N多字符)
_(匹配一个字符)
[](该位置取值在给定范围内)
[^](取值不在给定范围内)
SELECT *
FROM smbms_user
WHERE userName LIKE '%张%'
WHERE userName LIKE '张_'
WHERE phone LIKE '13[5-9]%'
//between:取值是连续的区间
SELECT *
FROM smbms_user
WHERE birthday BETWEEN '1971-1-1' AND '1999-12-12';
//IN / NOT IN:取值为集合,可以跟随返回多条记录的子查询
SELECT * FROM smbms_user where id IN(1,2,3);
SELECT * FROM smbms_user where id NOT IN(SELECT id FROM smbms_user WHERE userRole>1);
可以出现在任何表达式可以出现的位置
//例如查询年龄小于赵燕的用户
SELECT userName FROM smbms_user
WHERE age<(SELECT age FROM smbms_user
WHERE userCode='zhaoyan');
//子查询和比较运算符联合使用时,必须保证子查询返回的结果不能多于一个
设置表的存储引擎
CREATE TABLE testtable(
id int(10) primary key auto_increment
)ENGINE=InnoDB;
数据表的存储位置,可查看my.ini
count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL
count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL
count(列名)只包括列名那一列,在统计结果的时候,某个字段值为NULL时,不统计。
列名为主键,count(列名)会比count(1)快
列名不为主键,count(1)会比count(列名)快
如果表多个列并且没有主键,则 count(1) 的执行效率优于 count(*)
如果有主键,则 select count(主键)的执行效率是最优的
如果表只有一个字段,则 select count(*)最优。
mysql -u[username] -p[password]
show databases;
use database_name;
show tables;
exit