首页 > Java > MySQL(SQL入门)
2014
08-21

MySQL(SQL入门)

01. MySQL(SQL入门)13

1、SQL简介

1)SQL:Structured Query Language,结构化查询语言。一种定义和操作关系型数据库的标准计算机语言,由ANSI(美国国家标准协会,ISO成员之一)管理维护。

2)SQL标准和SQL方言:本文使用MySQL,在遇到MySQL特有的内容时会标示出来。

3)SQL的组成部分

  • DQL,数据查询语言:select
  • DML,数据操作语言:insert、update、delete
  • DDL,数据定义语言:create、alter、drop、truncate
  • DCL,数据控制语言:grant、revoke
  • TPL,事务处理语言:commit、rollback、savepoint

4)数据库客户端、数据库服务器和数据库的关系如下图:

01. MySQL(SQL入门)349

所谓安装数据库服务器,只是在机器上装了一个数据库管理程序,这个管理程序可以管理多个数据库,一般开发人员会针对每一个应用创建一个数据库。

从上图也可以看出SQL就是客户端向服务器请求用的语言。

2、DDL:数据定义语言

DDL用于描述数据库中要存储的现实世界实体,可完成库操作和表结构操作。

常用关键词:CREATE、ALTER、DROP、TRUNCATE

请试着在MySQL中完成以下练习:

1)库操作:

① 创建数据库

创建一个名称为mydb1的数据库。

create database mydb1;

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

create database mydb2 character set gbk;

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

create database mydb3 character set gbk collate gbk_chinese_ci;

查看当前有多少库。

show databases;

查看数据库的创建细节

show create database mydb1;

② 修改

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

alter database mydb2 character set utf8;

③ 删除

删除前面创建的mydb3数据库

drop database mydb3;

2)表(结构)操作

查看当前选择的数据库

select database();

选择一个数据库

use mydb1;

① 创建表:

创建一个员工表

create table employee(

id int,

name varchar(100),

gender varchar(10),

birthday date,

entry_date date,

job varchar(100),

salary float(8,2),

resume longtext

); #注:创建表前,要先使用use db语句使用库。

查看表结构

desc employee;

附:MySQL中常用数据类型:

mysql data type

注:VARCHAR、BLOB和TEXT类是变长类型。每个类型的存储需求取决于列值的实际长度。

② 修改表结构:使用 ALTER TABLE 语句追加、修改或删除列

在上面员工表的基本上增加一个image列。

alter table employee add (image longblob);

修改job列,使其长度为60。

alter table employee modify job varchar(60);

删除image列。

alter table employee drop image;

此外,MySQL还提供了两种SQL方言:

重命名表:

alter table employee rename to USER

完全改变列定义:

alter table user change name username varchar(30);

③ 删除表:drop table user,USER表不见了

④ 清空表:truncate user,USER表还在,里面的数据被干掉了

3、DML:数据操作语言

DML用于向数据库表中插入、删除、修改数据。

常用关键字:INSERT、UPDATE、DELETE

1)插入:

向数据库中插入数据时应注意:

① 字符或字符串数据,用单引号引起来

② 日期或时间,用单引号引起来,日期的格式用yyyy-MM-dd

③ 空值:不指定或者插入null。

使用insert语句向表中插入2个员工的信息

insert into user values (1,’aaa’,'unknown’,’1943-09-08′,’2014-07-30′,’ceo’,10000,’baidu’);

insert into user (id,username,gender,birthday,entry_date,job,salary,resume) values (3,’bbb’,'男性’,’1999-09-08′,’2014-07-30′,’cto’,10000,’帅锅’);

☆ MySQL中文乱码问题:

MySQL共有六处使用字符集,可以使用show variables like ‘character_set%’ 命令查询:

01. MySQL(SQL入门)2797

当从windows命令行界面(client)操作数据库时使用的是GBK编码,需修改client、results的编码为GBK,以避免中文乱码问题。设置方法为:

set character_set_client=gbk; //告诉服务器,客户端使用的编码是GBK

set character_set_results=gbk; //告诉服务器,返回的结果用GBK编码

2)修改:没有where语句,会全部更新指定的字段

将所有员工薪水修改为5000元。

update user set salary=5000;

将姓名为’aaa’的员工薪水修改为3000元。

update user set salary=3000 where username=’aaa’;

将姓名为’aaa’的员工薪水修改为4000元,job改为ccc。

update user set salary=6000,job=’ufo’ where username=’aaa’;

将aaa的薪水在原有基础上增加1000元。

update user set salary=salary+1000 where username=’aaa’;

3)删除:没有where语句,删除所有的记录(truncate)

删除表中名称为’aaa’的记录。

delete from user where username=’aaa’;

删除表中所有记录。

delete from user; (逐条删除,效率没有truncate user;高)

从一个表中删除记录将引起其它表的参照完整性问题,解决办法:

①(☆)在表中设置一个DELETE_FLAG字段:假删除(DELETE),真修改(UPDATE)。

② 级联删除。。。。

4、DQL(上):单表查询

常用关键字:SELECT

本节练习单表查询,练习前请在MySQL中导入下面的数据表(学生成绩表)。百度网盘

1)基本语法:SELECT [DISTINCT] * | {column1|expression, column2|expression,…} FROM 表名;

查询表中所有学生的信息。

select * from student;

查询表中所有学生的姓名和对应的英语成绩。

select name,english from student;

显示英语成绩,过滤表中重复数据

select distinct english from student;

在所有学生数学分数上加10分特长分。

select name,math+10 from student;

统计每个学生的总分。

select name,math+chinese+english from student;

在select语句中可使用as语句给表名或列名取个别名:SELECT column [as] 别名 from 表名;

用别名改写上例:select name 姓名,math+chinese+english 总分 from student;

2)带where子句的查询

查询姓名为’王五’的学生成绩

select * from student where name=’王五’;

查询英语成绩大于90分的同学

select * from student where english>90;

查询总分大于200分的所有同学

select * from student where (math+chinese+english)>200;

在where子句中经常用的运算符:

operator in where clause

注:like语句中,%代表零个或多个任意字符,_代表一个字符,例first_name like ‘_a%’;

查询英语分数在 80-90之间的同学。

select * from student where english between 80 and 90;

查询数学分数为89,90,91的同学。

select * from student where math in (89,90,91);

查询所有姓李的学生成绩。

select * from student where name like ‘李%’;

查询数学分>80,语文分>80的同学。

select * from student where math>80 and chinese>80;

3)带order by子句的查询

对数学成绩排序后输出。

select name,math from student order by math;

对总分排序后输出,然后再按从高到低的顺序输出

select name 姓名,math+chinese+english 总分 from student order by 总分 desc;

对姓李的学生语文成绩排序输出

select name,chinese from student where name like ‘李%’ order by chinese;


留下一个回复

你的email不会被公开。