Mysql 常用语句

 

使用MySQL数据库
登录到MySQL
MySQL服务已经运行时,我们可以通过MySQL自带的客户端工具登录到MySQL数据库中,首先打开命令提示符,输入以下格式的命名:
mysql -h 主机名 -u 用户名 -p
    -h : 该命令用于指定客户端所要登录的MySQL主机名, 登录当前机器该参数可以省略;
    -u : 所要登录的用户名;
    -p : 告诉服务器将会使用一个密码来登录, 如果所要登录的用户名密码为空, 可以忽略此选项。
以登录刚刚安装在本机的MySQL数据库为例,在命令行下输入mysql -uroot -p 按回车确认, 如果安装正确且MySQL正在运行,就会提示输入密码
:如要在命令行输入密码-p和密码之间不能有空格

一、数据库操作
1、创建数据库:

>CREATE DATABASE db_name;    //db_name为数据库名
>CREATE DATABASE IF NOT EXISTS db_name default character set utf8 COLLATE utf8_general_ci;    //条件创建数据库

2、删除数据库:

>DROP DATABASE db_name;
>DROP DATABASE IF EXISTS db_name;

3、查看数据库:

>SHOW DATABASES;

4、选择数据库:

>USE db_name;

5、修改数据库

>ALTER DATABASE my_db CHARACTER SET latin1;    //修改数据库字符编码

 

二、的操作:
1、创建表:

(1).使用SQL语句创建

>CREATE TABLE IF NOT EXISTS tb_name(
    fid INT(11) NOT NULL DEFAULT '0',   //fid INT类型显示11位,非空,默认值为0
    ......................................
    PRIMARY KEY(id)              //主键
  )ENGINE=InnoDB DEFAULT CHARSET=utf8    //设置表的存储引擎和默认编码(防止数据库中文乱码),一般常用InnoDB和MyISAM;InnoDB可靠,支持事务;MyISAM高效不支持全文检索.

(2).根据现有的表来创建并插入指定条件的数据

>CREATE TABLE tb_name2 SELECT * FROM tb_name;

或者部分复制:

>CREATE TABLE tb_name2 SELECT id,name FROM tb_name;

(3).创建临时表:

>CREATE TEMPORARY TABLE tb_name(这里和创建普通表一样);

2查看表

(1).查看数据库中可用的表

>SHOW TABLES;

(2).查看表结构:

>DESC tb_name;
也可以使用:
>SHOW COLUMNS in/from tb_name;

3、删除表:

>DROP [ TEMPORARY ] TABLE [ IF EXISTS ] tb_name[ ,tb_name2.......];

实例:

>DROP TABLE IF EXISTS tb_name;    //存在则删除,不存在不操作

4、更改表:

>ALTER TABLE tb_name ADD[CHANGE,RENAME,DROP] [after 插入位置]...要更改的内容...

实例:

>ALTER TABLE tb_name ADD COLUMN address varchar(80) NOT NULL AFTER `column_name`;
>ALTER TABLE tb_name DROP COLUMN address;
>ALTER TABLE tb_name CHANGE scoer score SMALLINT(4) NOT NULL;    //更改列名称或列字
>ALTER TABLE name_old RENAME name_new;

段类型(:这里字段类型与表字段类型不一致会修改表字段类型)
5、增加删除主键

>ALTER TABLE tb_name ADD primary key (id);
>ALTER TABLE tb_name DROP primary key;

 

三、数据增删查改

为了便于理解以下操作的含义,模拟学校学生信息管理系统,首先创建测试表和插入测试数据

CREATE TABLE `student` (
  `fid` int(5) unsigned zerofill NOT NULL DEFAULT '00000',
  `fname` varchar(64) NOT NULL,
  `age` int(11) NOT NULL,
  `address` varchar(128) NOT NULL,
  `contace` varchar(12) NOT NULL,
  PRIMARY KEY (`fid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
insert  into `student`(`fid`,`fname`,`age`,`address`,`contace`) values (00001,'张三',11,'湖南株洲','135698332'),(00002,'李四',12,'浙江杭州','123978986'),(00003,'王五',11,'湖南长沙','469878966'),(00004,'朱六',13,'湖北武汉','987964663'),(00005,'张三',11,'北京','124534534'),(00006,'欧阳克',13,'新疆','534534534');
CREATE TABLE `score` (
  `fid` int(5) unsigned zerofill NOT NULL,
  `fchinese` int(11) unsigned NOT NULL,
  `fmatch` int(11) unsigned NOT NULL,
  `english` int(11) unsigned NOT NULL,
  `history` int(11) unsigned NOT NULL,
  PRIMARY KEY (`fid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
insert  into `score`(`fid`,`fchinese`,`fmatch`,`english`,`history`) values (00001,87,97,65,77),(00002,66,87,88,90),(00003,87,46,99,88),(00004,77,94,84,88),(00005,89,97,96,99);
CREATE TABLE `infoext` (
  `fid` int(5) unsigned zerofill NOT NULL,
  `ffname` varchar(32) NOT NULL,
  `fmname` varchar(32) NOT NULL,
  `fhobby` varchar(64) NOT NULL,
  PRIMARY KEY (`fid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
insert  into `infoext`(`fid`,`ffname`,`fmname`,`fhobby`) values (00001,'史蒂夫','斯密斯','吃饭'),(00002,'萧锋','阿朱','睡觉'),(00003,'杨过','小龙女','看书'),(00004,'韦小宝','双双','溜达'),(00005,'郭靖','黄蓉','练舞'),(00006,'欧阳锋','不祥','练武');


1、插入数据

>INSERT INTO tb_name(id,name,score)VALUES(NULL,'张三',140),(NULL,'张四',178),(NULL,'张五',134);    //插入多条数据直接在后边加上逗号,主键id是自增的列,可以不用写。
>INSERT INTO tb_name(name,score) SELECT name,score FROM tb_name2;

2、更新数据

>UPDATE tb_name SET score=89,age=11 WHERE id=2;    //修改多列使用”,”隔开
>UPDATE tablename SET columnName=NewValue [ WHERE condition ]

3、删除数据

>DELETE FROM tb_name WHERE id=3;
>DELETE FROM tb_name;        //不带条件,则删除整张表数据

 

4查询与条件控制
(1).WHERE 语句:

where的作用:在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,where条件中不能包含聚组函数。

>SELECT * FROM tb_name WHERE id=3;

(2).HAVING 语句:

having的作用:是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件过滤出特定的组,也可以使用多个分组标准进行分组。

>SELECT * FROM tb_name GROUP BY age HAVING count(*)>2  //按年龄分组,并筛选出同一年龄人数大于2的组数据

(3).相关条件控制符:
  =><<>IN(1,2,3......)BETWEEN a AND bNOTLIMIT
  AND OR
  Like()用法中      

      %:匹配任意个字符        _:匹配一个字符(可以是汉字)
  IS NULL 空值检测

>SELECT * FROM student WHERE fid >= 3 AND fid <= 5;
>SELECT * FROM student WHERE fid IN (2, 4, 5);
>SELECT * FROM student WHERE fid BETWEEN 2 AND 4;
>SELECT * FROM student WHERE fid = 3 OR fid = 4;
>SELECT * FROM student WHERE fname LIKE '%三'    //查找fname内容含有三的数据

 

5.功能函数

(a).DISTINCT:数据去重,返回指定字段内容不重复的记录

>SELECT DISTINCT `age` FROM student;             //返回学生年龄分布

(b).LIMIT:指定返回前几条或者中间某几行数据

>SELECT * FROM TABLE LIMIT [OFFSET,] ROWS | ROWS OFFSET OFFSET
LIMIT可以用于强制SELECT返回指定的记录数。接受一个或两个数字参数,参数必须是一个整数常量。如果给定两个参数,第一个参数指定返回记录行的偏移量,第二个参数指定返回记录行的最大数目。
初始记录行偏移量是0(而不是1):为了与PostgreSQL兼容,MySQL也支持句法:LIMIT #OFFSET #

> SELECT * FROM student LIMIT 5,10;   //检索记录行6-15 ,注意:10为偏移量
> SELECT * FROM student LIMIT 95,-1;  //检索记录行 96-last.
//如果只给定一个参数,它表示返回最大的记录行数目:
> SELECT * FROM student LIMIT 5;     //检索前 5 个记录行,也就是说,LIMIT n等价于 LIMIT 0,n。

如果你想得到最后几条数据可以多加个 ORDER BY id DESC

(c).as 别名

>SELECT fname AS "名字" FROM student;
>SELECT AVG(fchinese) AS "语文平均分" FROM score;

 

6GROUP BY分组查询

所谓的分组就是将指定符合条件的数据划分到一个组,最终得到一个分组汇总表
  (1).条件使用Having;
  (2).排序使用ORDER BY :
       ORDER BY DESC|ASC    =>按数据的降序/升序排列  

>SELECT COUNT(*) FROM student GROUP BY `age` HAVING COUNT(*) > 2;
>SELECT fname,COUNT(age) AS "人数" FROM student GROUP BY fname;

 

7联合查询用于把来自两个或多个表的行结合起来

(1).使用JOIN

JOIN 子句基于这些表之间的共同字段,把来自两个或多个表的行结合起来。

INNER JOIN

在表中存在至少一个匹配时返回行。

>SELECT student.fname,score.fchinese,score.english,score.fmatch FROM student INNER JOIN score ON student.fid = score.fid;

以上SQL等价于:
>SELECT a.fname,a.age,b.fchinese,b.english,b.fmatch FROM student a INNER JOIN score b WHERE a.fid = b.fid;
>SELECT a.fname,a.age,b.fchinese,b.english,b.fmatch FROM student a,score b WHERE a.fid = b.fid;

LEFT JOIN

从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。

>SELECT student.fname,score.fchinese,score.english,score.fmatch FROM student LEFT JOIN score ON student.fid = score.fid;

RIGHT JOIN

从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为 NULL。

>SELECT student.fname,score.fchinese,score.english,score.fmatch FROM student RIGHT JOIN score ON student.fid = score.fid;

(2)、使用UNION

UNION

UNION用于合并两个或多个SELECT语句的结果集,并消去表中任何重复行。UNION内部的SELECT 语句必须拥有相同数量的列,列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同.

>SELECT * FROM student UNION SELECT * FROM score;
>SELECT * FROM student UNION SELECT * FROM infoext; //报ERROR,列数量不一致

UNION ALL

ALL随UNION 一起使用时(UNION ALL),不消除重复行

>SELECT * FROM student UNION ALL SELECT * FROM score;

 

8MySQL的一些函数

(1)、字符串链接——CONCAT()

>SELECT CONCAT(fname, "==>", address) FROM student;

(2)、数学函数:AVGSUMMAXMINCOUNT;
(3)、文本处理函数:TRIMLOCATEUPPERLOWERSUBSTRING
(4)、运算符:+-*\
(5)、时间函数:DATE()CURTIME()DAY()YEAR()NOW().....

>UPDATE shop SET `fupdatetime` = NOW();    //更新shop表fupdatetime字段时间

(6)、空值处理

为了处理这种情况,MySQL提供了三大运算符:

  IS NULL: 当列的值是NULL,此运算符返回true

  IS NOT NULL: 当列的值不为NULL, 运算符返回true

  <=>: 比较操作符(不同于=运算符),当比较的的两个值为NULL时返回true

关于NULL的条件比较运算是比较特殊的.你不能使用= NULL!= NULL在列中查找NULL,MySQL,NULL值与任何其它值的比较(即使是NULL)永远返回false, NULL = NULL 返回false.

MySQL中处理NULL使用IS NULLIS NOT NULL运算符。

>SELECT * FROM student WHERE fname != NULL;         //返回NULL数据集
>SELECT * FROM student WHERE fname IS NOT NULL;     //返回想要的数据


9MySQL的正则表达式:
Mysql支持REGEXP的正则表达式:
>SELECT * FROM tb_name WHERE name REGEXP '^[A-D]'   //找出以A-D 为开头的name

模式

描述

^

匹配输入字符串的开始位置。例如’^sw’可匹配swxxs或sw24dsf等

$

匹配输入字符串的结束位置。例如‘duan$’可匹配swduan或sssssduan等

.

匹配除 "\n" 之外的任何单个字符。例如’swd.an’可匹配swduan或swddan等

[...]

字符集合。匹配所包含的任意一个字符。例如, '[a-z]' 可以匹配字符a-z,[0-9]可匹配0-9。

[^...]

非字符集合。匹配除[]中之外的的任意字符。例如, '[^abc]' 可以匹配 "def" 等。

p1|p2|p3

匹配 p1 或 p2 或 p3。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。

*

匹配前面的子表达式零次或多次。例如,sw* 能匹配 "sw" 以及 "swsw"。* 等价于{0,}。

+

匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zozo",但不能匹配 "z"。+ 等价于 {1,}。

{n}

n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。

{n,m}

m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。

注意,^有两个用法,一个是非,一个是文本的开始,用[]中表示非,否则是文本的开始。

使用的时候需要外面加一层[],例如[[:digit:]]

说明

[:alnum:]

任意字母和数字(同[a-zA-Z0-9])

[:alpha:]

任意字母(同[a-zA-Z])

[:blank:]

空格和制表(同[\\t])

[:cntrl:]

ASCII控制字符(ASCII0到31和127)

[:digit:]

任意数字(同[0-9])

[:graph:]

和[[:print:]]相同,但不包含空格

[:lower:]

任意小写字母(同[a-z])

[:print:]

任意可打印字符

[:punct:]

即不在[[:alnum:]]又不在[[:cntrl:]]中的字符

[:space:]

包括空格在内的任意空白字符(同[\\f\\n\\r\\t\\v])

[:upper:]

任意大写字母(同[A-Z])

[:xdigit:]

任意16进制数字(同[a-fA-F0-9])

>SELECT * FROM student Where fname REGEXP 'swduan[[:digit:]]';    //可匹配swduan0-9

 

posted @ 2017-01-01 10:47  滴水瓦  阅读(442)  评论(0编辑  收藏  举报