Mysql数据库常用sql语句及多表查询设计

一、sql语句

~~sql语句书写顺序: 

        select  from where  groupby  having  orderby

~~sql语句执行顺序:

        from  where  select  group by having order by

1.操作数据库

(1)创建数据库

CREATE  DATABASE  [IF NOT EXISTS] db_name [create_specification [, create_specification] ...]

create_specification:

[DEFAULT] CHARACTER SET charset_name  |  [DEFAULT] COLLATE collation_name

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

    create database mydb1;

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

    create database mydb2 character set gbk;

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

        create database mydb3 character set utf-8 collate utf8_bin;

(2)查看数据库

    > 显示数据库语句:

        SHOW DATABASES

    > 显示数据库创建语句:

        SHOW CREATE DATABASE db_name

    > 查看当前数据库服务器中的所有数据库

        show databases;

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

        show create database mydb3;

(3)修改数据库

ALTER  DATABASE  [IF NOT EXISTS] db_name  [alter_specification [, alter_specification] ...]

alter_specification:

[DEFAULT] CHARACTER SET charset_name  |  [DEFAULT] COLLATE collation_name

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

        alter database mydb2 character set utf8;

(4)删除数据库

DROP DATABASE  [IF EXISTS]  db_name

    ~删除前面创建的mydb1数据库 drop database mydb1;

        drop database mydb1;

(5)选择数据库

        进入数据库:use db_name;

        查看当前所选的数据库: select database();

2.操作表

(1)创建表

CREATE TABLE table_name

{

field1 datatype,

field2 datatype,

field3 datatype,

}[character set 字符集] [collate 校对规则]

field:指定列名  datatype:指定列类型

创建一个员工表employee

CREATE TABLE employee(

id INT PRIMARY KEY AUTO_INCREMENT,

NAME VARCHAR(20) UNIQUE,

gender BIT NOT NULL,

birthday DATE,

entry_date DATE,

job VARCHAR(40),

salary DOUBLE,

RESUME TEXT

);

(2)查看表

    查看表结构:desc tabName

    查看当前数据库中所有表: show tables;

    查看当前数据库表建表语句: show create table tabName;

(3)修改表

ALTER TABLE table ADD/MODIFY/DROP/CHARACTER SET/CHANGE (column datatype [DEFAULT expr][,column datatype]...);

*修改表名称:rename TABLE 表明 to  新表名;

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

    alter table employee add image blob;

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

    alter table employee modify job varchar(60);

~删除gender列

    alter table employee drop gender;

~表名改为user。

    rename table employee to user;

~修改表的字符集为gbk

    alter table user character set gbk;

~列明name修改为username

    alter table user change name username varchar(20);

(4)删除表

        DROP TABLE tab_name;

~删除user表

drop table user;

****3.操作表记录CRUD****

(1)INSERT

INSERT INTO table [(columen [,column...])] VALUES (value[,value])

插入的数据应与字段的数据类型相同。

数据的大小应在列的规定范围内,例如:不能将一个长度为80的字符串加入到长度为40的列中。

在values中列出的数据位置必须与被加入的列的排列位置相对应。

字符和日期型数据应包含在单引号中。

插入空值:不指定或insert into table value(null)

如果要插入所有字段可以省写列列表,直接按表中字段顺序写值列表

注:查看系统变量(系统编码如:character_set_client | utf8等) show  variables like 'character%';在win系统中cmd 连接数据库,在插入数据时,如果数据库都是utf8的那么会有问题,因为win系统的cmd是gbk编码,所以会有问题乱码。需要执行 set names;主要改变character_set_client 、character_set_connection 、character_set_results的编码。另外这个set names 只是告诉这个cmd窗口用gbk字符集插入数据。这个只是临时措施。

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

insert into employee (id,name,gender,birthday,entry_date,job,salary,resume)values (null,'张飞',1,'1999-09-09','1999-10-01','打手',998.0,'老大的三弟,真的很能打');

insert into employee values (null,'关羽',1,'1998-08-08','1998-10-01','财神爷',9999999.00,'老大的二弟,公司挣钱都指着他了');

insert into employee values (null,'刘备',0,'1990-01-01','1991-01-01','ceo',100000.0,'公司的老大'),(null,'赵云',1,'2000-01-01','2001-01-01','保镖',1000.0,'老大贴身人');

(2)UPDATE

UPDATE tbl_name SET col_name1=expr1 [, col_name2=expr2 ...] [WHERE where_definition]

UPDATE语法可以用新值更新原有表行中的各列。

SET子句指示要修改哪些列和要给予哪些值。

WHERE子句指定应更新哪些行。如没有WHERE子句,则更新所有的行

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

update employee set salary = 5000;

~将姓名为’张飞’的员工薪水修改为3000元。

update employee set salary = 3000 where name='张飞';

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

update employee set salary=4000,job='ccc' where name='关羽';

~将刘备的薪水在原有基础上增加1000元。

update employee set salary=salary+1000 where name='刘备';

(3)DELETE

如果不使用where子句,将删除表中所有数据。

Delete语句不能删除某一列的值(可使用update)

使用delete语句仅删除记录,不删除表本身。如要删除表,使用drop table语句。

同insert和update一样,从一个表中删除记录将引起其它表的参照完整性问题,在修改数据库数据时,头脑中应该始终不要忘记这个潜在的问题。

外键约束

删除表中数据也可使用TRUNCATE TABLE 语句,它和delete有所不同,参看mysql文档。

delete from tbl_name [WHERE where_definition]

~删除表中名称为’张飞’的记录。

delete from employee where name='张飞';

~删除表中所有记录。

delete from employee;

~使用truncate删除表中记录。

truncate table employee;

(4)SELECT

~1.基本查询

SELECT [DISTINCT] *|{column1, column2. column3..} FROM table;

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

select * from exam;

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

select name,english from exam;

~过滤表中重复数据

select distinct english from exam;

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

select name , math+10,english+10,chinese+10 from exam;

~统计每个学生的总分。

select name ,english+math+chinese from exam;

使用别名表示学生总分。

select name as 姓名 ,english+math+chinese as 总成绩 from exam;

select name 姓名 ,english+math+chinese 总成绩 from exam;

select name,english from exam;

~2.使用where子句进行过滤查询

~查询姓名为张飞的学生成绩

select * from exam where name='张飞';

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

select * from exam where english > 90;

~查询总分大于230分的所有同学

select name 姓名,math+english+chinese 总分 from exam where math+english+chinese>230;

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

select * from exam where english between 80 and 100;

~查询数学分数为75,76,77的同学。(math 代表数学,不是关键字)

select * from exam where math in(75,76,77);

~查询所有姓张的学生成绩。

select * from exam where name like '张%';

select * from exam where name like '张__';

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

select * from exam where math>70 and chinese>80;

~3.使用order by关键字对查询结果进行排序操作

SELECT column1, column2. column3.. FROM table where... order by column asc|desc;

asc 升序    **默认就是升序**

desc 降序

~对语文成绩排序后输出。

select name,chinese from exam order by chinese desc;

~对总分排序按从高到低的顺序输出

select name 姓名,chinese+math+english 总成绩 from exam order by 总成绩 desc;

~对姓张的学生成绩排序输出

select name 姓名,chinese+math+english 总成绩 from exam where name like '张%' order by 总成绩 desc;

~4.聚合函数

(1)Count -- 用来统计符合条件的行的个数

~统计一个班级共有多少学生?

select count(*) from exam;

~统计数学成绩大于90的学生有多少个?

select count(*) from exam where math>70;

~统计总分大于230的人数有多少?

select count(*)from exam where math+english+chinese > 230;

(2)SUM -- 用来将符合条件的记录的指定列进行求和操作

~统计一个班级数学总成绩?

select sum(math) from exam;

~统计一个班级语文、英语、数学各科的总成绩

select sum(math),sum(english),sum(chinese) from exam;

~统计一个班级语文、英语、数学的成绩总和

select sum(ifnull(chinese,0)+ifnull(english,0)+ifnull(math,0)) from exam;

在执行计算时,只要有null参与计算,整个计算的结构都是null

此时可以用ifnull函数进行处理,ifnull(chinese,0)表示如果语文这个字段是null 那么用0来代替。

~统计一个班级语文成绩平均分

select sum(chinese)/count(*) 语文平均分 from exam;

(3)AVG -- 用来计算符合条件的记录的指定列的值的平均值

~求一个班级数学平均分?

select avg(math) from exam;

~求一个班级总分平均分?

select avg(ifnull(chinese,0)+ifnull(english,0)+ifnull(math,0)) from exam;

(4)MAX/MIN -- 用来获取符合条件的所有记录指定列的最大值和最小值

~求班级最高分和最低分

select max(ifnull(chinese,0)+ifnull(english,0)+ifnull(math,0)) from exam;

select min(ifnull(chinese,0)+ifnull(english,0)+ifnull(math,0)) from exam;

~5.分组查询

~对订单表中商品归类后,显示每一类商品的总价

select product,sum(price) from orders group by product;

~询购买了几类商品,并且每类总价大于100的商品

select product 商品名,sum(price)商品总价 from orders group by product having sum(price)>100;

where子句和having子句的区别:

where子句在分组之前进行过滤having子句在分组之后进行过滤

having子句中可以使用聚合函数,where子句中不能使用

很多情况下使用where子句的地方可以使用having子句进行替代

~查询单价小于100而总价大于150的商品的名称

select product from orders where price<100 group by product having sum(price)>150;

~~sql语句书写顺序:

select from where groupby having orderby

~~sql语句执行顺序:

from where select group by having order by

~~备份恢复数据库

备份: 在cmd窗口下 mysqldump -u root -p dbName>c:/1.sql

恢复: 方式1:在cmd窗口下 mysql -u root -p dbName


还有些笔记详见笔记

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容