Mysql基础语法
Posted 素然止步
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql基础语法相关的知识,希望对你有一定的参考价值。
mysql数据库管理
查看数据库
show databases
创建数据库
如果没有修改my.ini配置文件的默认字符集,在创建数据库时,指定字符集
create database 数据库名 character set \'utf8\';
特殊字符(关键字)用反引号
例如:create database `create`;
显示数据库创建信息
show database 数据库名
删除数据库
drop database 数据库名
进入(使用)数据库
use 数据库名;
显示当前打开的数据库
select database();
表结构管理
创建数据表
create table 表名(字段 字段类型...);
mysql\\data目录下的数据库目录中将生成一个对应名称的.fm文件
删除数据表
drop table 表名;
修改数据表结构
给数据表增加一个字段:alter table 表名 add (column) 新增属性 属性类型;
修改表名称:alter table 表名 rename 新表名;
修改表的存储引擎:alter table 表名 engine= MyISAM;
删除字段:alter table 表名 drop 字段名称;
修改字段名称及重新定义字段类型:alter table 表名 change 字段名 新字段名 新字段类型;
单独修改字段的类型:alter table 表名 modify 字段名 新的字段类型;
指定位置后面添加字段:alter table 表名 add (column) 新增字段 字段类型 after 指定的字段;
在第一个位置添加字段:alter table 表名 add (column) 新增字段 字段类型 first;
查看数据表
show tables; 查看当前数据库所有的数据表
查看字母‘abc\'开头的表
show table like \'abc%\';
%是通配符
查看表创建信息
show create table 表名;(查看表创建的语句)
查看数据表结构
desc 表名;
MySQL用户管理
登录
MySQL是基于C/S架构,必须在客户端通过终端窗口,连接MySQL服务器,进行操作。
mysql -h host - u usr -p / mysql -u root -p密码
输入密码:xxxx
用户管理
超级用户root
修改账号密码:
例:DOS命令下修改,将root账号密码修改为1234
mysqladmin -u root password 1234 语句最后不要加分号,否则密码就是1234;
例:mysql命令
set password for \'root\'@\'localhost\' =password(\'1234\');
创建用户
使用create语句进行创建用户,语句格式如下:
create user \'username\'@’host\' identified by \'password\';
其中,username表示要创建的用户名,host表示指定该用户在哪个主机上可以登录,如果是本地用户可用localhost,如果想让该用户可以从任意远程主机登录,可以使用通配符%;password表示该用户的登录密码,密码可以为空,如果为空则该用户可以不需要密码登录服务器。
例:create user \'zhangsan\'@\'localhost\' identified by\'123456\';
删除用户
删除用户使用drop语句,语句格式如下:
drop user \'username\'@\'host\';
修改配置文件my.ini
字符集
MySQL默认字符集是Latin,改变为utf8才能正确显示中文
[mysql]下添加
prompt="mysql(\\d)>"
默认数据库
information_schema
提供了访问数据库元数据的方式。什么是元数据呢?元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。有些时候用于表述该信息的其他术语包括”数据词典“和”系统目录“。
performance_schema
mysql5.5版本新增了一个性能优化的引擎。
mysql
这个是MySQL的核心数据库,主要负责存储数据库的用户,权限设置,关键字符MySQL自己需要使用的控制和管理信息。不可以删除,也不要轻易修改这个数据库里面的信息。
test
安装时候创建的一个测试用数据库,空数据库,没有任何表,可以删除(新版本MySQL已取消)。
SQL基本语法
基本规范
SQL对大小写不敏感,一般数据库名称,表名称,字段名称全部小写
MySQL要求在每条SQL命令的末端使用分号。
注释
#这个注释直到该行结束
-这个注释直到该行结束(在dos好像没效果了)
/*这是一个在行中间的注释*/
/*
这个是一个
多行注释格式
*/
MySQL基本数据类型
字段类型
数据类型是指列,存储过程,表达式和局部变量的数据特征,它决定了数据的存储方式,代表了不同的信息类型,不同的数据库,数据类型有所不同,MySQL数据库有以下几种数据类型:
字符串型
注意:char和varchar需要指定长度,例如:char(10)
整数型
很多人喜欢定义数据时,这样写:
create table tbl_name( age int(10) );
int 后面()中的数字,不代表占用空间容量,而代表最小显示位数。这个东西基本没有意义,除非你对字段指定zerofill,MySQL会自动分配长度;int(11),tinyint(4),smallint(6),mediumint(9),big(20)。所以,建议在使用时,就用这些默认的显示长度就可以了,不用再去自己填长度。(比如:int(10), tinyint(1)之类的基本没用).
浮点型
M(精度),代表总长度(整数位和小数位)限制
D(标度),代表小数位的长度限制。
M必须大于等于D
日期型
列举与枚举
create table students( id tinyint, #微小整型 name varchar(10), #变长字符
age int, #整型 sex enum(\'m\',w\'), #单选 birthday date, #日期型 tel char(11), #定长字符 city char(1), #城市 hobby set(\'1\',\'2\',\'3\',\'4\'), #多选 introduce text #个人介绍 );
字段属性
数据的增、删、改
增删改查(简称:CURD)
增
#方法1:指定字段 insert into students(name,age) values(\'张三\',20); #方法2:省略字段名,字段位置一一对应,不能跳过(auto_increment 字段,可以使用null 或 default ) insert into students values(1,\'张三\',\'m\',null,\'110\',\'2\',\'3\',\'haha\',23); #方法3:批量增加数据 insert into students(name,age) values(\'张三\',20),(\'李四“,21),(\'王五\',32),......
删
#用delete删除积累,一定要加where条件,否则表数据全部删除!!
delete from 表名 where xxx=xxx;
#用truncate删除记录,不能加where条件,直接删除全部记录,id索引重新从1开始
truncate table 表名;
改
#单条修改
update 表名 set xx=xx,xxx=xx where xxx=xx and xxx=xxx;
#多条修改 update students set name = case id #id字段 when 1 then \'zhangsan\' when 2 then \'lisi\' when 3 then \'wangwu\' when 4 then \'zhaoliu\' end, city = case id when 1 then \'2\' when 2 then \'4\' when 3 then \'1\' when 4 then \'2\' end where id in (1,2,3,4);
数据的查
查询表达式
#当前使用的数据库 select database(); #查看当前MySQL版本 select version(); #查看当前用户 select user(); #查看运算结果 select 1+2;
条件表达式
from 子句
#字段用逗号隔开,至少有一个字段,最终结果集按照这个顺序显示 select 字段1,字段2.. from 表名; # *代表所有字段 select * from 表名;
distinct(去重)
#去重后的结果,distinct 必须紧挨着select 后面 select distinct 字段 from 表名; #统计不重复的个数 select count(distinct 字段) from 表名;
where 子句
where子句适用于对记录的删,改,查等操作
对记录进行过滤,如果没有指定where子句,则显示所有记录
在where表达式中,可以使用函数或运算符,运算符包括:
#搜索id<20的所有数据 select * from students where id < 20; #搜索id编号为偶数的数据 select * from students where id % 2 = 0;
where条件关键字
in: 查询一个集合的数据
#搜索id 在(1,3,7)之中的数据 select * from students where id = 1 || id =3 || id =7; select * from students where id in (1,3,7); #一次删除多条记录 delete from students where id = 3 || id =15 || id =23; delete from students where id in (3,15,23);
between..and..:查询一个区间的数据
#搜索id在20-40之间的数据 select * from students where id > 20 && id < 40; select * from students where id between 20 and 40; #删除id在20-40之间的数据 delete from students where id between 20 and 40;
not :排除
#搜索id除了20-40之间的数据 select * from students where id not between 20 and 40;
like子句
用于模糊查询 %:任意字符长度
_ : 一个字符长度
#搜索name名字以5结尾的数据 select * from students where name like \'%5’; #搜索name名字包含字母s的数据 select * from students like \'%s%\'; #搜索id以5结尾的两位数 数据 select * from students where id like \'_5\';
limit子句
控制查询记录条数,数据表中的记录,索引从0开始
select * from students limit 2 #返回两条记录 select * from students limit 3,4 #从索引为3的记录开始,返回4条记录 #php中的分页功能,偏移值的计算:(当前页-1) * 每页记录数 select name from students limit 3 offset 4; #还可以使用offset(偏移):从索引为3的记录开始,返回4条
group by(结果分组)
根据给定数据列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表利用group by分组信息进行统计,常见的是配合max等聚合函数筛选数据后分析。
select指定的字段要么作为分组的依据(Group By语句的后面),要么就要被包含在聚合函数中。
#简单分组,根据性别分成两组 select sex from students group by sex; #聚合函数分组,根据cityf分组,计算每个城市的学生有几个 select count(*),city from students group by city;
order by(结果排序)
按照给定的字段进行排序,asc:升序(默认),desc:降序
如果同时选择多个字段,先按第一个字段排序,如果第一个字段值相等,再尝试第二个字段,以此类推
#默认升序 select * from students order by birthday; #降序 select * from students order by birthday desc;
查询语句的书写顺序
select -—> 字段-—> from -—> 表名 -—> where -—> group by -—> order by -—> limit
别名
给表起别名,使用as关键字,但是可省略as.
比如 select a.name Aname from students a; 这里给a.name起了别名Aname,也给students起了别名a.
多表查询
score表和course表的创建语句,数据就自己插入吧。
#score表创建 create table score( user_id int, course_id int, score int ); #course表创建 create table course( id int, name varchar(4) );
分别查询张三同学对应科目的成绩。
这里先查询张三同学的语文成绩:
a 表 人名 select a.name from student as a where a.id=6; b表 分数 select b.score from score as b where b.user_id=6 and b.course_id=4; c表 科目 select c.name from course as c where c.id=4;
上面3条语句 合并语句 并添加 字段别名
select a.name,c.name as course,b.score from students as a, score as b, course as c where a.id=6 and b.user_id=6 and b.course_id=4 and c.id=4;
最终结果
#上面的语句中的where 语句还可以修改 select a.name,c.name,b.score from students a, score b ,course c where b.user_id=a.id and b.course_id=c.id;
表连接
内连接
join : 如果表中有至少一个匹配,则返回行
select 需要查询的信息 from 表1 表1别名 join 表2 表2别名 on 表1和表2的连接条件
select sc.id,s.name from score sc join students s on sc.user_id = s.id;
内连接和上面的=连接区别在于,例子:
=连接:select sc.id,s.name from score sc,students s where sc.user_id=s.id;
对比上面的内连接明显发现,=连接是多个表在一起,用逗号隔开,内连接是使用join分开每个表,然后使用on代替where使用,而且添加on之后,还可以加where,但是=连接使用了where,后面就不能再出现where了。
外连接
左外连接 left join:即使右表中没有匹配,也从左表返回所有的行.(左表指的是left join 语句左边的表)
select 需要查询的信息 from 表1 表1别名 left join 表2 表2别名 on 表1和表2的连接条件
select sc.user_id,s.name from score sc left join students s on sc.user_id=s.id #这里的语句意思是:无论students的信息是否匹配score表,都会返回score表中所有数据
右外连接 right join :即使左表中没有匹配,也从右表返回所有的行. (右表指的是right join 语句右边的表)
select 需要查询的信息 from 表1 表1别名 right join 表2 表2别名 on 表1和表2的连接条件
select sc.user_id,s.name from students s right join score sc on sc.user_id=s.id; #这和上面的左连接已经换了students表和score表的位置了,这里的语句意思是:无论students的信息是否匹配score表,都会返回score表中所有数据
全连接(比较少使用)
full join : 只要其中一个表中存在匹配,就返回行(MySQL不支持),但是可以通过另类的方式实现全连接。
mysql不支持全连接,但可以通过左外连接+ union+右外连接实现。
额外:自连接
自连接不属于一类,应该是属性内连接的一种,自连接是把一张表当成两张表使用。
应用场景:找出当前表中高于平均值的所有数据,就要先把当前表的平均值计算出来,把结果当作一张表,然后再对这张结果表比较原来的表,就可以找出高于平均值的数据了。
子查询
子查询是指出现在其他SQL语句内的select子句(嵌套在查询内部,且必须始终出现在圆括号内)
#城市表创建语句 create table city(id int , name varchar(10)); #查询城市名称是北京的 #普通方式查询 select * from students where city=2;#2是北京 #子查询方式 select * from students where city=(select id from city where name = \'北京\');
注意:on关键字和where关键字作用不相同,on只是作用于连接,where是条件过滤,如果使用on作为条件过滤会出现“笛卡儿积”。笛卡儿积:两表数据记录条数相乘,比如a表有3条记录,b表有2条记录,那么笛卡儿积就是6条记录。
子查询可以包含多个关键字或条件,如:distinct,group by ,order by ,limit,函数等
子查询的外层可以是:select,insert,update
视图与事务
视图
视图是从一个或几个基本表(或视图)中导出的虚拟的表。在系统的数据字典中仅存放了视图的定义,不存放视图对应的数据。视图是原始数据库数据的一种变换,是查看表中数据的另外一种方式。可以将视图看成是一个移动的窗口,通过它可以看到感兴趣的数据。视图时从一个或多个实际表中获得的,这些表的数据存放在数据库中。那些用于产生视图的表叫做该视图的基表。一个是视图也可以从另一个视图中产生。
数据库中视图是一个重要的概念,其优势在于:
安全:有的数据是需要保密的,如果直接把表给出来进行操作会造成泄密,那么可以通过创建视图把相应视图的权限给出来即可保证数据的安全。
高效:复杂的连接查询,每次执行时效率比较低,建立视图,每次从视图中获取,将会提高效率。
定制数据:将常用的字段放置在视图中。
创建视图
create view 视图名 as select 字段名 from 表名 where 条件;
修改视图
#alter语句: alter view 视图名 as select 字段名 from 表名 where 条件;
删除视图
drop 视图名
查询视图
show tables;
show tables status;
这两个命令不仅可以显示表名及表信息,而且会显示出所有视图名称及视图信息。
除此之外,使用show create view 命令可以查看某个视图的定义,格式如下:
show create view 视图名;
关系数据库表时用于存储和组织信息的数据结构,数据结构的不同,直接影响操作数据的效率和功能,对于MySQL来说,它提供了很多类型的存储引擎,可以根据对数据处理的需求,选择不同的存储引擎,从而最大限定的利用MySQL强大的功能。
事务
MyISAM引擎
MyISAM表是独立于操作系统的,这说明可以轻松地将其从Windows服务器移植到Linux服务器,建立一个MyISAM引擎的tb_Demo表,就会生成以下三个文件:
tbdemo.frm存储表定义,tbdemo.MYD存储数据,tb_demo.MYI存储索引。
MyISAM无法处理事务,特别适合以下几种情况使用:
1. 选择密集型的表。MyISAM存储引擎在筛选大量数据时非常迅速,这是它最突出的优点。
2. 插入密集型的表。MyISAM的并发插入特性允许同时选择和插入数据。例如:MyISAM存储引擎很适合管理邮件或Web服务器日志数据。
InnoDB引擎
InnoDB是一个健壮的事务型存储引擎,InnoDB还引入了外键约束,在以下场合下,
使用InnoDB是最理想的选择:
1. 更新密集的表。InnDB存储引擎特别适合处理多重并发的更新请求。
2. 事务。InnoDB存储引擎是支持事务的标准MySQL存储引擎。
3. 外键约束。MySQL支持外键的存储引擎只有InnoDB。
4. 自动灾难恢复。与其他存储引擎不同,InnoDB表能够自动从灾难中恢复。
事务处理
以银行转账业务为例,张三——》李四转账100元,这是一个完整事务,需要两步操作:
1. 张三数据表减去100元
2. 李四数据表增加100元
如果1步完成后,操作出现错误(断电,操作异常等),使2步没有完成,此时,张三减去了100元,而李四却没有收到100元。
为了避免这种情况的发生,就将整个操作定义为一个事务,任何操作步骤出现错误,都会回滚到上一次断点位置,避免出现其他错误。
#开始 begin: update tb1_a set money=money-100 where name=\'zhangsan\'; update tb1_bmoney=money+100 where name=\'lisi\'; #提交 commit; #回滚 rollback;
索引约束分区
索引
索引是帮助MySQL高效获取数据的数据结构
数据库在保存数据之外,还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。索引可以大大提高MySQL的检索速度。
在MySQL中,对于一个Primary Key的列,MySQL已经自动对其建立了Unique和Index.
#创建索引 create table 表名( id int not null, username varchar(16) not null, index(username(length)) ###用username字段作为索引 ): #显示索引 show index from 表名; #删除索引 alter table 表名 drop index name;
约束
约束保证数据的完整性和一致性,根据约束的字段数目的多少,约束又分为表级约束和列级约束
列级约束:针对某一字段来使用
表级约束:针对两个或两个以上的字段使用
约束类型包括:
not null (非空约束)
primary key (主键约束)
unique key (唯一约束)
default(默认约束)
foreign key (外键约束)
唯一(unique)约束
unique 约束唯一标识数据库表中的每条记录。
unique 和 primary key 约束均为列提供了唯一性的保证。
primary key 被自动定义为unique 约束。
注意:每个表可以有多个unique 约束,但是每个表只能有一个primary key 约束。
#第一种方式 create table persons( id int not null, address varchar(255), city varchar(155), phone varchar(11) unique #定义字段的同时,定义约束 ); #第二种方式 create table persons( id int not null, address varchar(155), phone varchar(11), unique (phone) #单数一行命令,定义约束 ); #第三种方式 alter table persons add unique (city); #修改表
默认(default)约束
用于约束对应列中的值的默认值(除非默认为空值,否则不可插入空值)
create table persons( id tinyint primary key auto_increment, name varchar(30), sex enum(\'m\',\'w\') default \'m\' #定义sex默认值为:\'m\' );
主键(primary key) 约束
每张数据表只能存在一个主键,主键保证记录的唯一性,主键自动为not null (同时作为表的索引)。
#为没有主键的表添加主键 alter table 表名 add primary key (字段名); #在创建表的时候,定义主键 create table persons( id int not null primary key, name varchar(10) ); #在创建表的最后,定义主键,通常是定义联合主键 create table persons( id int not null, address varchar(10), primary key(id,address) );
外键(foreign key)约束
外键约束是为了保存数据一致性,完整性,实现一对一或一对多关系
子表(具有外键列的表)和 父表(子表所参照的表),存储引擎只能为InnoDB。
外键列和参照列必须具有相似的数据类型。
- 如果是数字类型,数字的长度、是否有符合位 必须相同
- 字符类型的长度则可以不同
外键列和参照列必须创建索引(如果外键列不存在索引的话,MySQL将自动创建索引)。
外键的好处:可以使得两张表关联,保证数据的一致性和实现一些级联操作。保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值!可以使得两张表关联,保证数据的一致性和实现一些级联操作;
#先建父表 子表才能建外键 父表和子表必须都是 innodb引擎 #city父表 create table city( id tinyint primary key, name varchar(10) not null )engine=INNODB; #students子表 create table students( id tinyint primary key auto_increment, #id #定义字段时同时定义 city tinyint, #外键字段类型要于主表相同 foreign key(city) references city(id) #city字段作为外键,引用city表中的id )engine=INNODB; #主表的数据可以修改,但不能删除 #删除city中的记录 delete from city where id=1;
#创建外键以后,再删除city记录,就会报错:
因为students的外键引用city的记录,如果直接删除city的记录,students外键列找不到依赖的列就会报错,所以MySQL规定不能删除外键所依赖的数据,子表的外键列也不能插入被引用的父表中不存在的数据。
总结:设置外键的列,就全依赖于父表,外键列的数据全部依赖父表的数据,外键列插入的数据必须是父表被引用的列中存在的,父表的数据可以修改,但不能删除。
补充:通常设置外键会自动生成外键名,不够最好是自己设置外键名。
#给外键设置名字 create table students( id tinyint primary key auto_increment, #id #定义字段时同时定义 city tinyint, #外键字段类型要于主表相同 constraint 外键名 foreign key(city) references city(id) )engine=INNODB;
删除约束
删除primary key
alter table 表名 drop primary key;
删除index
alter table 表名 drop index 索引名;
删除外键约束
alter table drop foreign key 外键名;
索引于约束的关系
索引是面向数据库本身的,用于查询优化等操作。约束则更多的是业务上的关系。
通常,创建唯一约束就自动获取唯一索引,是因为数据库认为数据库进行唯一检查时,如果该字段上有索引会很快,所以创建唯一约束就默认创建唯一索引。同样,常见的主键即是唯一性的约束,也是个索引。但对于not null 这样的约束,数据库是不会创建索引的。
分区
如果一张表的数据量太大,不仅查找数据的效率低下,而且难以找到一块集中的存储来存放。为了解决这个问题,数据库退出了分区的功能。MySQL表分区主要有以下四种类型:
RANGE分区:
RANGE即范围分区,根据区间来判断于哪个分区。这些区间要连续且不能相互重叠,使用VALUES LESS THAN 操作符来进行定义。
create table test( id int default null, name char(30), datedata date ) partition by range(year(datedata))( partition part1 values less than(1990), partition part2 values less than(1995在下面的代码片段中的剩余 ='passthrough' 处的代码中出现语法错误