现在的位置: 首页 > 综合 > 正文

MySql学习

2013年09月02日 ⁄ 综合 ⁄ 共 9097字 ⁄ 字号 评论关闭

SQL--->structured query language 结构化查询语言。

查看本服务器上的所有数据库:

mysql> show databases;

查看某数据库下的所有表

mysql>show tables;

创建一个名称为mydb1数据库

create database mydb1;

使用数据库(在创建表之前要指定好)

use mydb1;

创建一个使用gbk字符集的数据库mydb2

create database mydb2  character set gbk;

创建一个使用utf8字符集,并带校对规则的mydb3数据库。

mysql> create database mydb2 character set utf8 collate utf8_general_ci;

查看当前创建的数据库的定义信息

mysql> show create database mydb3;

删除数据库mydb1

mysql> drop database mydb1;

查看服务器的数据库,并把其中的mydb2字符集修改为utf8

mysql> use mydb2;

mysql> show create database mydb2;

mysql> alter database mydb2 character set utf8;

(在windows命令行下备份数据库,注意结尾不能有分号)
shell>mysqldump -u root -p mydb2>d:/mydb2.sql
在mysql命令行删除数据库
mysql>drop database mydb2;
恢复数据库(并不会恢复数据库本身,只是恢复表的结构和数据,所以要先创建原来数据库)
mysql>create database mydb2;
mysql>use mydb2;

mysql>source d:\mydb2.sql;  (从指定路径导入备份的数据)
(另外一种恢复数据库的方式在windows命令行下,注意结尾不能有分号)
shell>mysql  -u root -p mydb2<d:/mydb2.sql

创建一个订单表(注意:order是关键字,所以要特殊处理)
mysql>create table `order`(id int(11));

创建一个员工表
create table employee(
 id  int(11),
 name varchar(30),
 gender varchar(4),
 birthday date,
 job varchar(30),
 salary float(10,2),
 resume text
)character set utf8 collate utf8_general_ci;

查看当前表的定义信息
mysql> show create table employee;

在上面的员工表上增加一个image字段
mysql>alter table employee add(image blob);

修改job列使其长度为60
mysql>alter table employee modify job varchar(60);

删除gender列
mysql>alter table employee DROP gender;

表名修改为user
mysql>RENAME TABLE employee to user;

修改表的字符集为gbk
mysql>alter table user character set gbk;

修改数据库[mydb2]的字符集
mysql>alter database mydb2 character set gbk;

列名name修改为username
mysql>alter table user change column name username varchar(255);

删除image列
mysql>alter table user drop image;
增加一个入职日期 [entry_date]列
mysql>alter table user add(entry_date date);
使用insert语句向表中插入三个员工的信息
mysql>insert into user(id,username,birthday,entry_date,job,salary,resume) values (1,'aaa','1990-10-1','2000-1-1','coder','8000','good boy');
mysql>insert into user(id,username,birthday,entry_date,job,salary,resume) values (2,'张三','1980-10-1','1999-1-1','经理','9000','good boy');
mysql>insert into user(id,username,birthday,entry_date,job,salary,resume) values (3,'李四','1991-10-1','2003-5-1','coder','7000','good boy');
(以上后两句插入中文数据的时候失败。。为什么?)
查看编码:以下语句查看以character开头的字段值
mysql>show variables like 'character%';

-----+
| Variable_name            | Value
     |
+--------------------------+----------------------------------------------------
-----+
| character_set_client     | utf8
     |
| character_set_connection | utf8
     |
| character_set_database   | gbk
     |
| character_set_results    | utf8
     |
| character_set_server     | utf8
     |
| character_set_system     | utf8
     |
| character_sets_dir       | C:\Program Files\MySQL\MySQL Server 5.0\share\chars
ets\ |

更改客户端的编码(只对当前窗口有效)
mysql>set character_set_client=gbk;

更改客户端显示编码(只对当前窗口有效)
mysql>set character_set_results=gbk;

查询表user
mysql>select * from user;

+------+----------+------------+-------+---------+----------+------------+
| id   | username | birthday   | job   | salary  | resume   | entry_date |
+------+----------+------------+-------+---------+----------+------------+
|    1 | aaa      | 1990-10-01 | coder | 8000.00 | good boy | 2000-01-01 |
|    2 | 张三         | 1980-10-01 | 经理      | 9000.00 | good boy | 1999-01-0
 |
|    3 | 李四         | 1991-10-01 | coder | 7000.00 | good boy | 2003-05-01 |
+------+----------+------------+-------+---------+----------+------------+
如果我们再修改客户端显示编码,再查询下user表会发现乱码了!
mysql>set character_set_results=utf8;
mysql> select * from user;
+------+----------+------------+--------+---------+----------+------------+
| id   | username | birthday   | job    | salary  | resume   | entry_date |
+------+----------+------------+--------+---------+----------+------------+
|    1 | aaa      | 1990-10-01 | coder  | 8000.00 | good boy | 2000-01-01 |
|    2 | 寮犱笁     | 1980-10-01 | 缁忕悊   | 9000.00 | good boy | 1999-01-01 |
|    3 | 鏉庡洓     | 1991-10-01 | coder  | 7000.00 | good boy | 2003-05-01 |
+------+----------+------------+--------+---------+----------+------------+

当然以上的中文插入和中文乱码显示问题在可视化工具下是不存在的。

将所有的员工薪水修改为5000
mysql>update user set salary=5000;

将姓名为‘aaa’的员工薪水修改为3000
mysql>update user set salary=3000 where username='aaa';

将姓名为’张三’的员工薪水修改为4000元,job改为‘销售经理’
mysql>update user set salary=4000,job='销售经理' where username="张三";

将aaa的薪水在原有的基础上增加1000
mysql>update user set salary=salary+1000 where username='aaa';

删除表中名称为’李四’的记录
mysql>delete from user where username='李四';

删除表中所有记录
mysql>delete from user;

使用TRUNCATE删除表中记录(摧毁表格结构,然后重建,在删除大量数据的时候效率高)
mysql>truncate table user;

使用下面的sql语句创建学生表,并且插入数据
create table student(
id int,
name varchar(20),
chinese float,
english float,
math float
);

insert into student(id,name,chinese,english,math) values(1,'张小明',89,78,90);
insert into student(id,name,chinese,english,math) values(2,'李进',67,98,56);
insert into student(id,name,chinese,english,math) values(3,'王五',87,78,77);
insert into student(id,name,chinese,english,math) values(4,'李一',88,98,90);
insert into student(id,name,chinese,english,math) values(5,'李来财',82,84,67);
insert into student(id,name,chinese,english,math) values(6,'张进宝',55,85,45);
insert into student(id,name,chinese,english,math) values(7,'黄蓉',75,65,30);

查询所有学生信息(不建议用‘*’,效率不行,要明确字段名)
mysql>select id,name,chinese,english,math from student;

查询表中所有学生的姓名和对应的英语成绩。
mysql>select name,english from student;

过滤表中重复数据(把英语成绩相同的只保留一个)
mysql>select distinct english from student;

在所有学生英语分数上加10分特长分(注意显示的结果是查询结果,数据库的数据并未发生变化)
mysql>select name,english+10 as '英语加分' from student;
mysql> select name,english+10 英语加分了 from student; (as可以省略)

统计每个学生的总分
mysql>select name,english+math+chinese as 总分 from student order by 总分 desc;

查询姓名为"张小明"的学生成绩
mysql>select id,name,chinese,english,math from student where name='张小明';

查询英语成绩大于90分的同学
mysql>select name from student where english>90;

查询总分大于200分的所有同学
mysql>select name,math+english+chinese as 总分 from student where math+english+chinese>200;

查询英语分数在 80-90之间的同学。
mysql>select name,english from student where english between 80 and 90;

查询数学分数为89,90,91的同学
mysql>select name,math from student where math in(89,90,91);

查询所有姓李的学生成绩
mysql>select id,name,math,english,chinese from student where name like '李%';

查询数学分>80,语文分>80的同学
mysql>select name,math,english from student where math>80 and english>80;

对数学成绩排序后输出(默认是升序排序 asc)
mysql>select id,name,math from student order by math;

对总分从高到低的顺序输出
mysql>select name,(math+english+chinese) 总分 from student order by 总分 desc;
mysql>select name,(math+english+chinese) 总分 from student order by math+english+chinese desc;

对姓李的学生成绩排序输出
mysql>select id,name,math+english+chinese as 总分 from student where name like '李%' order by 总分 desc;

统计一个班级共有多少学生
mysql>select count(id) from student;

统计数学成绩大于90的学生有多少个
mysql>select count(*) from student where math>90;

统计总分大于250的人数有多少
mysql>select count(*) from student where math+english+chinese>250;

统计一个班级数学总成绩
mysql>select sum(math) as 班级数学总分 from student;

select sum(math) as 班级数学总分 from student;
mysql>select sum(math),sum(chinese),sum(english) from student;

统计一个班级语文、英语、数学的成绩总和
mysql>select sum(math+english+chinese) from student;

统计一个班级语文成绩平均分
mysql>select sum(chinese)/count(*) from student;
mysql>select avg(chinese) from student;

求一个班级总分平均分
mysql>select avg(math+chinese+english) from student;

求班级总分最高分和最低分
mysql>select max(math+english+chinese) as 最高分,min(math+english+chinese) as 最低分 from student;

创建一个订单表:
create table orders(
id int,
product varchar(20),
price float
);

insert into orders(id,product,price) values(1,'电视',900);
insert into orders(id,product,price) values(2,'洗衣机',100);
insert into orders(id,product,price) values(3,'洗衣粉',90);
insert into orders(id,product,price) values(4,'桔子',9);
insert into orders(id,product,price) values(5,'洗衣粉',90);

对订单表中商品归类后,显示每一类商品的总价
mysql>select product,sum(price) from orders group by product order by sum(price) desc;

查询购买了几类商品,并且每类总价大于100的商品
mysql> select product,sum(price) as 总价 from orders group by product having 总价>100 order by 总价;

注意这个次序:group by-->having(对分组结果的筛选)-->order by
*****************************************************************************************************
                                            我是华丽的分割线
*****************************************************************************************************
创建一个teacher表,定义一个主键约束(逻辑主键),并写入数据
create table teacher(
  id int primary key auto_increment,
  name varchar(10)
);

insert into teacher(name) values('刘德华');
insert into teacher(name) values('张学友');
insert into teacher(name) values('黎明');

创建一个学生表,定义主、外键约束,并写入数据
create table student(
 id int primary key auto_increment,
 name varchar(10),
 tea_id int,
 constraint tea_id_fk foreign key(tea_id) references teacher(id)
);

insert into student(name,tea_id) values('张三',1);
insert into student(name,tea_id) values('李四',1);
insert into student(name,tea_id) values('王五',1);
insert into student(name,tea_id) values('赵六',2);
insert into student(name,tea_id) values('孙七',2);

在两个表中,student表引用了teacher表的数据,这时候我去删除id=1的刘德华
mysql> delete from teacher where name='刘德华';
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constrai
nt fails (`mydb3/student`, CONSTRAINT `tea_id_fk` FOREIGN KEY (`tea_id`) REFEREN
CES `teacher` (`id`))
发现报错了!是无法删除被引用的了记录的!

那么删除没有被引用的“黎明”呢?
mysql> delete from teacher where name='黎明';
Query OK, 1 row affected (0.00 sec)
发现可以被删除的。

 在student表中我们执行如下sql语句插入数据
mysql> insert into student(name,tea_id) values('王八',6);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint f
ails (`mydb3/student`, CONSTRAINT `tea_id_fk` FOREIGN KEY (`tea_id`) REFERENCES
`teacher` (`id`))

报错了!是无法插入的,因为teacher表中没有id=6.


*****************************************************************************************************

*****************************************************************************************************

mysql中文乱码问题:
原来就有mysql服务器,安装时使用的latin1字符集
connection是连接数据库的字符集设置类型,如果程序没有指明连接数据库使用的字符集类型就按照服务器

端默认的字符集设置
数据库连接串:jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF8
//这里注意对&进行转义: &-->&amp;
xml中:jdbc:mysql://localhost:3306/mydb?useUnicode=true&amp;characterEncoding=UTF8

抱歉!评论已关闭.