1、MySQL的DDL语句
MySQL中字符的大小写
SQL关键字及函数名不区字符大小写;
数据库、表、索引及视图的名称是否区分大小写取决于低层的OS及FS;
存储过程、存储函数及事件调度器不区分字符大小写;但触发器区分;
表别名不区分大小写;
字段中字符数据,类型为binary、blog、varbinary时区分大小写;其它的不区分;
DDL:CREATE/ALTER/DROP
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE '%char%';
DROP {DATABASE | SCHEMA} [IF EXISTS] db_name
表:
约束:PRIMARY KEY, UNIQUE KEY, FOREIGN KEY
索引:特殊的数据结构,用于快速找到数据记录(行)
键可用作索引;并非所有索引都是键;
索引类型:B-Tree (B+ Tree) (左前缀), hash (key-value), R-Tree, FullText
索引优点:
减少服务器扫描数据量
创建索引后该字段本身就为排序后结果,查找时可以尽量避免排序时创建临时表
索引可以将随机I/O转换为顺序I/O
B-Tree (B+ Tree) (左前缀)索引:
全值匹配:比较操作符=、<=>
左前缀匹配:like ‘string%’
列前缀匹配:
匹配范围值:
组合索引:第一列必须为精确匹配,之后可以为范围匹配。
聚集索引、非聚集索引
聚簇索引:索引和数据一起存放;
非聚簇索引:索引和数据分开存放,而数据记录未必顺序存放;但索引数据一般顺序存放;
MyISAM为非聚集索引,InnoDB为聚集索引。 一个表只能有一个聚集索引,对InnoDB来说一般为主键索引,
注意事项:
MyISAM是支持全文索引的,但不支持外键。InnoDB不支持全文索引。现在大多引擎为InnoDB ,只有InnoDb可以设置表空间 TABLESPACE tablespace_name [STORAGE {DISK|MEMORY|DEFAULT}]
常用命令:
help create | alter | drop;查看相关创建语句帮助。
show global variables like '%char%';:显示字符集
help create table: 查看创建表的相关信息
create temporary table test (name char(20));:创建临时表。临时表内存不能超16M,如超变为磁盘临时表,性能很差。
create table tb1 (name char(20),gender enum('m','f'),primary key(name)); 创建带主键的表
create table tb2 (name char(20),gender enum('m','f'),primary key(name)) engine 'innodb';:修改存储引擎
create table tb5 select * from tb1;:把tb1中的表结构和数据 一起复制到tb5中,表中属性不复制。
create table tb3 like tb2;:复制tb2表结构创建新表tb3只复制表结构,并复制表中所有属性;
insert into tb1 values('xj','f'),('tan','m'),('zhang','m');:插入数据
show index form tables;:显示索引
show global variables like '%storage%';:显示存储引擎。
show engines;:查看当前支持的存储引擎。
show table status like 'tb1'\G:查看表的相关属性。
2、MySQL的DDL语及索引的使用策略
help drop table tbname;:查看删除表的命令。
常用语句:
alter table tb3 drop primary key;:删除主键。
alter table tb3 add index (gender);:在gender字段上添加索引。默认为b-tree索引。
alter table tb3 drop index name;:删除tb3表中name的索引。
alter table tb3 rename to tb4;修改tb3表名为tb4。
drop index index_name on tb_name;删除索引;
3、SELECT查询语句 DML(CRUD)
INSERT INTO
UPDATE
DELETE
INSERT的3种表达方式:
INSERT [INTO] tbl_name [(col_name,...)] {VALUES | VALUE} (...),...
批量插入
例如:insert into tb5 (name,geder) values ('zhangsan','m'),('lisi','f')...
INSERT [INTO] tbl_name SET col_name={expr | DEFAULT}, ...
例:insert into tb5 set name='zhangsan',geder='f';
INSERT [INTO] tbl_name [(col_name,...)] SELECT ...
例:DESC tb2;查看是否有效字段
select * from tb2 (将tb2的查询结果插入tb5)
insert into tb5 (name,gender) select * from tb2 where gender='f';
select * from tb5;
UPDATE:实现单表更新
UPDATE table_reference SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
[WHERE where_condition]
[ORDER BY ...] [LIMIT row_count]
判断某字段值为空:IS NULL 不空:IS NOT NULL
ORDER BY col1[,...] {ASC|DESC} LIMIT #
例如:#cp hellodb.sql
>mysql < /tmp/hellodb.sql
>use hellodb.sql
>update students set age=70 where classid is null; ###classid为空的年龄改为70
>updata students set classID=3 where age<=20;将年龄小于20的classID改成3
>update students set classID=3 order by age {ASC|DESC}limit 3;根据年龄排序,只改前3个classID,默认升序;DESC为降
>update * from students where age<20 order by age;
DELETE:
DELETE FROM tbl_name [WHERE where_condition]
[ORDER BY ...] [LIMIT row_count]
例如:help delete
delete from tb_name where --- order by --- limit n;
delete from students where age >60; 删除60岁的
delete from students order by age limit 3; 年龄排序,删除前三用户
SELECT:
SELECT @@GLOBAL.query_cache_size;
+---------------------------+
| @@GLOBAL.query_cache_size |
+---------------------------+
| 16777216 |
+---------------------------+
SELECT @@GLOBAL.query_cache_type;
+---------------------------+
| @@GLOBAL.query_cache_type |
+---------------------------+
| ON |
+---------------------------+
DEMAND:按需进行缓存,意思是只有明确写明要缓存结果的SELECT语句的结果才会进行缓存;
注意:几乎所有的缓存中,缓存的内容都是key-value格式
key: 查询语句的hash码;
value: 查询的语句的执行result;
SELECT values_to_display
FROM table_name
WHERE expression 逻辑表达式,between 30 and 50, in
GROUP BY how_to_group 根据指定条件分组,为了聚合,如求和,求平均数等
HAVING expression 对group by 的结果做过滤
ORDER BY how_to_sort 排序
LIMIT row_count; 限定返回值范围
distinct: 去除重复值。select distinct name form tb5;
聚合函数:
AVG(), SUM(), MAX(), MIN(), COUNT();having对聚合结果做过滤。
连接查询:
cross join:笛卡尔积,
inner join:内连接
outer join:外连接,分为lift outer join左外连接和right out join右外连接
SELECT US.user_name,x.FK_ROLE_ID FROM USER US LIFT JOIN USER_ROLE x on US.PK_ID = x.FK_USER_ID
natural join:等值连接
常用语句:
update tb5 set name='xxxx' where name='xj';
update tb5 set gender='f' order by name limit 1;:只修改排序后的第一条用limit 1。
show global variables like 'query_cache%';:查询缓存大小,只要大于0的值都为开启缓存,0表示缓存关闭
SELECT @@GLOBAL.query_cache_size;:也可以查看缓存是否启用。
select current_time();:显示时间。
SELECT @@GLOBAL.query_cache_type;:查询后有三种值(demand、on、off)
demand:按需进行缓存,由用户决定哪些语句需要缓存,
on:又mysql决定哪些查询语句结果需要缓存。
4、子查询、视图及EXPLAIN
联合查询:
SELECT statement UNION SELECT statement:把多个查询结果联合在一起为一个结果,字段数必须一样。
视图:VIEW,存储下来的select语句
create view view_name as select * from tabel_name ;
explain :分析执行的sql语句。肯以更具分析结果优化数据库。
explain select * from tb5\G