SQL(Structured Query Language)结构化查询语言
组成:DQL 数据查询语言
DDL数据定义语言
DML数据操作语言
DCL数据控制语言
TPL事务处理语言
CCL指针控制语言
接下来开始正式学习,首先要安装mysql,然后控制台输入mysql -u root -p 回车输入密码,如果出现welcome...说明已经成功了,show databases;看看有哪些库
接着看看上面的几种组成语言
DDL 数据定义:定义库和表的结构,比如create,alter,drop
创建库:create database 库名 character set 字符集 collate 校对规则;
create database testdb character set gbk collate gbk_chinese_ci;
校对规则我理解为用于一些特殊的比较,比如字符串的比较规则,这个和字符集需要对应(查文档),一般直接create database 数据库;就可以了。
show create database 库名;可以查看数据库信息。
show variables like 'character%';查看数据库的各种编码
删除库:drop database 库名;
drop database testdb;
选择数据库:use 库名;
创建表:create table 表名 (列名 类型,列名 类型...) character set 字符集 collate 校对规则;
create table student( id int, name varchar(100), birthday date, grade float(4,1), other text );date为日期格式,float第一位表示总位数,第二位表示小数点后有几位.如果表名或字段名要与关键字同名需要用``(esc下面的按键)括起来
查看表:show tables;
查看表结构:desc 表名;
查看表的细节:show create table 表名;
修改表:这个太多了,大家可以查看文档,这里只列出几个常用的
添加一列 alter table 表名 add image blob;添加一个字段,二进制类型
删除列 alter table 表名 drop 要删的字段名;
修改某列类型:alter table 表名 modify name varchar(150);modify 要修改成什么样
修改列名:alter table 表名 change 原字段名 新字段名;
alter table student change job newjob varchar(50);
修改表字符集:alter table 表名 character set 字符集;
修改某表名:例如将student表修改名字 为stu
rename table student to stu;
删除表 drop table 表名;
DML 数据操作:操作表中的数据
插入数据:insert into 表名(字段) values (值);
insert into stu(id,sname,birthday,grade,other) values(1,'zhang','1992-01-21',99.9,'三好学生');
发现插入中文会出现编码问题
编码问题怎么解决
有一种临时更改字符集的方法:set character_set_client=gbk;执行完会这样
这时再插入就会成功了,但执行查询会出现乱码
怎么办?依旧是改字符集 set character_set_results=gbk;然后再查询就正常了
这种方法只是临时改变了字符集,并不会对以后在成影响,重新运行mysql会发现依然都是utf-8
修改数据:update 表名 set 要改的内容 where 条件;若不加where则所有数据都会改变
一个简单的学生表为例,改了所有的sname字段
update stu set sname='aaa';
可同时修改多个字段,用逗号隔开
可执行算术运算
删除表数据:delete table 表名 where 条件;删除表中所有符合条件的数据
delete from stu where sname='wangwu';
truncate 表名;也能删除表,但它是摧毁整张表再重构表,而delete是逐条删除数据
DQL:数据查询
查询数据:select * from 表名;一般不建议这么写,效率低
select id,sname... from stu where...;建议这么写
select distinct grade from stu;distinct表去除重复数据(这个distinct 所修饰的需要写在第一个,不然会报错,我也不清楚什么原因...)
select sname as 姓名 from stu;这样查询结果sname列会显示为姓名,但这并不会更改原表中的字段名
where条件可加运算,可以做比较运算或逻辑运算等等
下面给出几个例子
select sname,grade+id from stu where grade>60;
seelct id from stu where grade between 5 and 80;分数在5到80之间
select id from stu where grade in(10,60,80);in代表在所规定的数据中
select id from stu where sname like '赵%';模糊查询
select id from stu where id=1 and sname like '李%';逻辑运算,and与 ,or或,is null 为空
select * from stu where id>1 order by grade desc;order by为排序,desc是降序,asc或默认为升序
表约束、、、、、、
主键约束 create table mydb(id int primary key auto_increment); primary key 代表主键,非空且唯一 ,auto_increment代表自动增长
非空约束 create table mydb(id int not null);该字段不允许为空
唯一约束 create table mydb(id int unique);该字段值不可重复,非空和唯一结合即为主键约束
外键约束
/////////////////////复杂些的查询
连接查询 : from 表1 连接类型(交叉,内连接,外连接)表2 [on 连接条件][where 查询条件];
1.交叉连接:笛卡尔积 ,假设 有a,b两个表 ,select a.name,b.num from a,b;或select a.name,b.num from a cross join b;可查出a*b条数据
2.内连接 :隐式内连接,不使用on,用where---------select * from customer c,orders o where c.id = o.id;
显示内连接,使用on-------------------select * from customer c inner join orders o on c.id = o.id;
3.外连接:左外连接,返回左表所有数据和右表符合连接条件的数据
select * from customer c left join orders o on c.id = o.customer_id;
右外连接,返回右表所有数据和左表符合连接条件的数据
select * from customer c right join orders o on c.id = o.customer_id;
嵌套查询:select * from orders where customer_id=(select id from customer where name='张三');
联合查询:union会查询表中符合条件的并集数据并去除重复
select * from orders where price>500 union select * from orders where customer_id=3;
报表查询:
select count(*) from orders where price>600;查询有几条满足条件的数据
select sum(price),sum(customer_id) from orders;查询列求和
select avg(price) from orders;求某列平均数
select max(price) from orders;求列最大值
select min(price) from orders;求列最小值
分组查询:group by ... having ...将数据归类并按having条件查询
select * from orders group by price having price>600 order by id desc;
数据备份:假如mydb库里新创建了一个test表,要如何备份到本地磁盘呢?
运行cmd到命令行直接执行mysqldump -u root -p mydb test>c:/test.sql 回车输密码,这样就把mydb库中的test表数据保存到了c盘中,然后 我们可以进mydb中把这个表删除,再利用数据恢复 mysql -u root -p mydb
还可以用mysqldump -u 用户名 -p --databases 库1 库2>路径 ,来备份多个数据库
mysqldump -u 用户名 -p -all-databases > 路径 ,备份所有库
还有一种恢复数据的方式,这种需要先选择该数据库,就是use database;然后执行 source c:/test.sql; 路径自己换,会发现执行了一堆query ok, 然后就发现数据也是恢复了。