MySQL语句

库操作

创建数据库

create database <数据库名>;

查看已经创建的数据库信息

show create database oldboy\G;

创建数据库指定字符集

create database oldgirl CHARACTER SET gbk COLLATE gbk_chinese_ci;
create database abc character set utf8 collate utf8_general_ci;
create database xyz character set utf8mb4 collate utf8mb4_0900_ai_ci;

查看字符集和校对规则

show character set;

创建不同字符集格式的数据库命令

create database oldboy; 

create database oldboy_gbk DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci; #<==创建gbk字符集数据库

create database oldboy_utf8 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;<==创建utf8字符集数据库

查看数据库

show databases like '%boy%';

查看当前所在数据库

mysql> select database();
+------------+
| database() |
+------------+
| NULL       |
+------------+
1 row in set (0.02 sec)

进入某个库

mysql> use mysql;
Database changed

表结构操作

查看一个库中的表

mysql> show tables;
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
| columns_priv              |
| db                        |
| event                     |
| func                      |

创建表

create table 表名(
字段名1 类型,
字段名2 类型,
字段名3 类型
);
create table student(
id int(4) not null,
name char(20) not null,
age tinyint(2) NOT NULL default '0',
dept varchar(16) default NULL
);

CREATE TABLE `test` (
`id` int(4) NOT NULL AUTO_INCREMENT,
`name` char(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=UTF8;


CREATE TABLE `stu` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '学生学号',
`name` varchar(50) NOT NULL COMMENT '学生姓名',
`age` tinyint(3) unsigned DEFAULT NULL COMMENT '学生年龄',
`gender` enum('m','f') DEFAULT NULL COMMENT '性别',
`birthday` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '入学时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

创建一个表与之前的表结构相同

create table student_0 like student;

创建一个备份表

create table t1_1 as select * from t1;

查看已创建表的语句

mysql> show create table student\G; 
*************************** 1. row ***************************
       Table: student
Create Table: CREATE TABLE `student` (
  `id` int(4) NOT NULL,
  `name` char(20) NOT NULL,
  `age` tinyint(2) NOT NULL DEFAULT '0',
  `dept` varchar(16) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

查看表结构

mysql> desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(4)      | NO   |     | NULL    |       |
| name  | char(20)    | NO   |     | NULL    |       |
| age   | tinyint(2)  | NO   |     | 0       |       |
| dept  | varchar(16) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

生产场景创建的表

某sns产品生产正式建表语句

use sns;
set names gbk;
CREATE TABLE `subject_comment_manager` (
  `subject_comment_manager_id` bigint(12) NOT NULL auto_increment COMMENT '主键',
  `subject_type` tinyint(2) NOT NULL COMMENT '素材类型',
  `subject_primary_key` varchar(255) NOT NULL COMMENT '素材的主键',
  `subject_title` varchar(255) NOT NULL COMMENT '素材的名称',
  `edit_user_nick` varchar(64) default NULL COMMENT '修改人',
  `edit_user_time` timestamp NULL default NULL COMMENT '修改时间',
  `edit_comment` varchar(255) default NULL COMMENT '修改的理由',
  `state` tinyint(1) NOT NULL default '1' COMMENT '0代表关闭,1代表正常',
  PRIMARY KEY  (`subject_comment_manager_id`),
  KEY `IDX_PRIMARYKEY` (`subject_primary_key`(32)), #<==括号内的32表示对前32个字符做前缀索引。
  KEY `IDX_SUBJECT_TITLE` (`subject_title`(32))
  KEY `index_nick_type` (`edit_user_nick`(32),`subject_type`)#<==联合索引,此行为新加的,用于给大家讲解的。实际表语句内没有此行。
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

增加字段

alter table 表名 add字段 类型 其他;

CREATE TABLE `test` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `name` char(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;



CREATE TABLE `test` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `name` char(20) NOT NULL,
  PRIMARY KEY (`id`)
) engine=innodb default charset=utf8;



alter table test add sex char(4);    #←增加性别列sex


alter table test add age int(4) after name;   在name字段后面添加age字段

alter table test add qq varchar(15) first;    在表最前面

增加1个字段

ALTER TABLE `etiantian` ADD `FIRSTPHOTO_URL` varchar(255) default NULL COMMENT '第一张图片URL'

增2个字段

ALTER TABLE `basic` ADD `adhtml_top`  varchar(1024) default NULL COMMENT '顶部广告html' ,  ADD `adhtml_right` varchar(1024) default NULL COMMENT '右侧广告html' ;

修改字段属性

mysql> alter table test modify age char(4) after name;         
Query OK, 6 rows affected (0.00 sec)
Records: 6  Duplicates: 0  Warnings: 0

修改字段名称及属性

mysql> alter table test change age oldboyage char(4) after name;            
Query OK, 6 rows affected (0.01 sec)
Records: 6  Duplicates: 0  Warnings: 0

ALTER TABLE student CHANGE telnum tnum CHAR(11)

修改表名

mysql> rename table test to oldboy;
Query OK, 0 rows affected (0.00 sec)

mysql> show tables;                
+------------------+
| Tables_in_oldboy |
+------------------+
| course           |
| oldboy           |
| sc               |
| student          |
| test1            |
+------------------+
5 rows in set (0.00 sec)

mysql> alter table oldboy rename to test;
Query OK, 0 rows affected (0.00 sec)

mysql> show tables;                      
+------------------+
| Tables_in_oldboy |
+------------------+
| course           |
| sc               |
| student          |
| test             |
| test1            |
+------------------+
5 rows in set (0.00 sec)

复制表结构

create table stu like student;

复制表结构及数据(***)

CREATE TABLE city1 SELECT * FROM city;

表内容操作

插入数据

insert into 表名(字段名1,字段名2,...) values(值1,值2,...);

INSERT INTO student(name,age,gender,tnum) VALUES('alex',10,'f','110');


create table test(
id int(4) not null auto_increment,
name char(20) not null,
primary key(id)
);

mysql> insert into test(id,name) values(1,'oldboy');
Query OK, 1 row affected (0.00 sec)

mysql> select * from test;
+----+--------+
| id | name   |
+----+--------+
|  1 | oldboy |
+----+--------+
1 row in set (0.00 sec)

mysql> insert into test(name) values('oldgirl');
Query OK, 1 row affected (0.02 sec)

mysql> select * from test;                      
+----+---------+
| id | name    |
+----+---------+
|  1 | oldboy  |
|  2 | oldgirl |
+----+---------+
2 rows in set (0.00 sec)


mysql> insert into test values(3,'inca');       
Query OK, 1 row affected (0.00 sec)

mysql> select * from test;               
+----+---------+
| id | name    |
+----+---------+
|  1 | oldboy  |
|  2 | oldgirl |
|  3 | inca    |
+----+---------+
3 rows in set (0.00 sec)

批量插入数据

mysql> insert into test values(4,'zuma'),(5,'kaka');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from test;
+----+---------+
| id | name    |
+----+---------+
|  1 | oldboy  |
|  2 | oldgirl |
|  3 | inca    |
|  4 | zuma    |
|  5 | kaka    |
+----+---------+
5 rows in set (0.00 sec)


INSERT INTO `test` VALUES (1,'oldboy'),(2,'oldgirl'),(3,'inca'),(4,'zuma'),(5,'kaka');


INSERT INTO student(name,age,gender,tnum) VALUES('alex',15,'f','11634'),('alex1',16,'m','123425');

一个表中的数据插入另一个表

insert into student_0 select * from student;

清空表中所有数据

mysql> truncate table test;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from test; 
Empty set (0.00 sec)

mysql> insert into test values(1,'oldboy'),(2,'oldgirl'),(3,'inca'),(4,'zuma'),(5,'kaka');
Query OK, 5 rows affected (0.00 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> select * from test;
+----+---------+
| id | name    |
+----+---------+
|  1 | oldboy  |
|  2 | oldgirl |
|  3 | inca    |
|  4 | zuma    |
|  5 | kaka    |
+----+---------+
5 rows in set (0.00 sec)

补充强调:我们平时登录网站发帖子,发博文,实质上都是调用web网站的程序连接MySQL数据库,通过上述的insert语句把帖子博文数据存入数据库的。

查询

mysql> select id,name from oldboy.test;
+----+---------+
| id | name    |
+----+---------+
|  1 | oldboy  |
|  2 | oldgirl |
|  3 | inca    |
|  4 | zuma    |
|  5 | kaka    |
+----+---------+
mysql> select * from test limit 2;     
+----+---------+
| id | name    |
+----+---------+
|  1 | oldboy  |
|  2 | oldgirl |
+----+---------+
2 rows in set (0.00 sec)

mysql> select * from test limit 3;
+----+---------+
| id | name    |
+----+---------+
|  1 | oldboy  |
|  2 | oldgirl |
|  3 | inca    |
+----+---------+
3 rows in set (0.00 sec)

mysql> select * from test limit 1,3;
+----+---------+
| id | name    |
+----+---------+
|  2 | oldgirl |
|  3 | inca    |
|  4 | zuma    |
+----+---------+
3 rows in set (0.00 sec)
mysql> select * from test where name='oldboy';
+----+--------+
| id | name   |
+----+--------+
|  1 | oldboy |
+----+--------+


mysql> select * from test where id=5;
+----+------+
| id | name |
+----+------+
|  5 | kaka |
+----+------+
1 row in set (0.00 sec)

mysql> select * from test where name='oldgirl';
+----+---------+
| id | name    |
+----+---------+
|  2 | oldgirl |
+----+---------+
1 row in set (0.00 sec)

mysql> desc test;
+-------+----------+------+-----+---------+----------------+
| Field | Type     | Null | Key | Default | Extra          |
+-------+----------+------+-----+---------+----------------+
| id    | int(4)   | NO   | PRI | NULL    | auto_increment |
| name  | char(20) | NO   |     | NULL    |                |
+-------+----------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

mysql> select * from test where id>3 and name='oldgirl';
Empty set (0.00 sec)

mysql> select * from test where id<3 and name='oldgirl'; 
+----+---------+
| id | name    |
+----+---------+
|  2 | oldgirl |
+----+---------+
1 row in set (0.00 sec)

mysql> select * from test where id>3 or name='oldgirl'; 
+----+---------+
| id | name    |
+----+---------+
|  2 | oldgirl |
|  4 | zuma    |
|  5 | kaka    |
+----+---------+
3 rows in set (0.00 sec)


mysql> select * from test where id>3 or name='oldgirl' order by id desc;
+----+---------+
| id | name    |
+----+---------+
|  5 | kaka    |
|  4 | zuma    |
|  2 | oldgirl |
+----+---------+
3 rows in set (0.00 sec)

小结
一:查看表test中所有数据
(1)直接查询库下面表的数据
select * from oldboy.test; #方法1:没有进入oldboy数据库的情况
select id from oldboy.test; #查看id列的方法
select name from oldboy.test; #查看name列的方法
(2)进入指定库查询表的数据
use oldboy; #方法1:已经进入oldboy数据库的情况
select * from test;
(3)查看MySQL数据库的用户与主机
select user,host from mysql.user; #仅查看用户与主机
select user,host,password from mysql.user; #查看用户与主机与密码
二:根据指定条件查询表的部分信息
例子1:查看test表中的前2条信息
select * from test limit 2;
例子2:查看第1条记录后的两条记录
select * from test limit 1,2;
例子3:指定固定的条件查数据
select * from test where id = 1; #查看指定行的记录,整型一般不需要加引号,不然会导致不经过索引。
select * from test where name=‘oldgirl’; #查询字符串的话要加引号
select * from test where id=2 and name=‘oldgirl’; #多个条件查询
例子4:指定固定条件范围查数据
select * from test where id>2 and id<5; #多个条件,and取交集
select * from test where id>2 or id<5; #多个条件都成立,也就是显示id>2和id<5的所有条件都会显示出来
三:其他查询功能
(1)按照id号进行正向排序
select * from test order by id asc;
(2)按照id号进行倒序排序
select * from test order by id desc;

select count(name) from city where CountryCode=‘CHN’;

SELECT * FROM city;
SELECT NAME,Population FROM city;
SELECT * FROM city WHERE CountryCode='CHN';

SELECT * FROM city WHERE CountryCode='CHN' AND Population>5000000;

SELECT * FROM city WHERE CountryCode='CHN' ORDER BY Population DESC LIMIT 3 ;

SELECT * FROM city WHERE District='zhejiang' ORDER BY Population DESC LIMIT 3;

SELECT * FROM city WHERE CountryCode='CHN' AND District LIKE 'shan%';

SELECT * FROM city WHERE Population >5000000 OR Population<100;

SELECT * FROM city WHERE Population >5000000 
UNION
SELECT * FROM city WHERE Population <100;

多表联查

mysql> select country.name from city,country where city.population<100 and country.code=city.countrycode;
+----------+
| name     |
+----------+
| Pitcairn |
+----------+
1 row in set (0.00 sec)

mysql> select co.name from city as ci,country as co where ci.population<100 and co.code=ci.countrycode;
+----------+
| name     |
+----------+
| Pitcairn |
+----------+
1 row in set (0.00 sec)

排序

select * from city where countrycode='chn' order by population desc;

限制limit

mysql> select * from city where countrycode='chn' order by population desc limit 10;
+------+--------------------+-------------+--------------+------------+
| ID   | Name               | CountryCode | District     | Population |
+------+--------------------+-------------+--------------+------------+
| 1890 | Shanghai           | CHN         | Shanghai     |    9696300 |
| 1891 | Peking             | CHN         | Peking       |    7472000 |
| 1892 | Chongqing          | CHN         | Chongqing    |    6351600 |
| 1893 | Tianjin            | CHN         | Tianjin      |    5286800 |
| 1894 | Wuhan              | CHN         | Hubei        |    4344600 |
| 1895 | Harbin             | CHN         | Heilongjiang |    4289800 |
| 1896 | Shenyang           | CHN         | Liaoning     |    4265200 |
| 1897 | Kanton [Guangzhou] | CHN         | Guangdong    |    4256300 |
| 1898 | Chengdu            | CHN         | Sichuan      |    3361500 |
| 1899 | Nanking [Nanjing]  | CHN         | Jiangsu      |    2870300 |
+------+--------------------+-------------+--------------+------------+
10 rows in set (0.01 sec)


select * from city where countrycode='chn' order by population desc limit 10 offset 10;

SELECT * FROM city WHERE CountryCode='USA' ORDER BY Population;
SELECT * FROM city WHERE CountryCode='USA' ORDER BY Population DESC;



#跳过10行显示三行
SELECT * FROM city WHERE CountryCode='USA' ORDER BY Population DESC LIMIT 10,3;

SELECT * FROM city WHERE CountryCode='USA' ORDER BY Population DESC LIMIT 3 OFFSET 10;

in语句

select name,population,countrycode from city where population in (2000000,3000000,4000000);

between  and
select name,population,countrycode from city where population between 1000000 and 1000001;

分组聚合 group by

group by + 聚合函数(最大值、最小值等)

先分组聚合再筛选

select countrycode ,sum(population) from city group by countrycode having countrycode='CHN';

先筛选在分组聚合

select countrycode ,sum(population) from city where countrycode='CHN' group by countrycode;
SELECT CountryCode,SUM(Population) FROM city WHERE CountryCode='CHN' GROUP BY CountryCode


SELECT CountryCode,SUM(Population) FROM city GROUP BY CountryCode;

SELECT CountryCode,District,SUM(Population) AS sp FROM city 
WHERE CountryCode='CHN' 
GROUP BY District
ORDER BY sp DESC;

union 结果集合并 用来代替or

按行合并

union all 合并

CREATE TABLE ma(
maid INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
mname VARCHAR(30) NOT NULL, 
bumen VARCHAR(20) NOT NULL
);

INSERT INTO ma(mname,bumen) 
VALUES
('wuxingge','linux'),
('alexsb','python'),
('tanboyu','java'),
('qiangge','bdata');


#统计每个部门的员工+经理数量

SELECT t.bumen ,SUM(t.c) FROM 
(
SELECT  bumen, COUNT(NAME) AS c  FROM stu1 
GROUP BY bumen 
UNION ALL
SELECT bumen,COUNT(mname) AS c FROM ma
GROUP BY bumen
)t
GROUP BY t.bumen;

练习题

select name,population,countrycode from city where countrycode='CHN' union select name,population,countrycode from city where population >10000000;
#创建表
CREATE TABLE stu1(id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,name VARCHAR(20),age INT,gender ENUM('m','f'),xueke ENUM('linux','python','java','bdata'),telnum VARCHAR(10),gongzi int);

#插入数据
INSERT INTO 
stu1(id,name,age,gender,xueke,telnum,gongzi)
VALUES
(1,'guosiyu',10,'f','linux',110,10000),
(2,'yuhuafei',20,'m','linux',120,10010),
(3,'zhangjianfeng',19,'m','linux',119,10020),
(4,'lijiayang',18,'m','linux',123,10030),
(5,'changxueyuan',17,'m','linux',132,10040),
(6,'sunwukong',200,'m','python',211,1000),
(7,'zhubajie',201,'f','python',122,2000),
(8,'bailongma',123,'f','java',345,3000),
(9,'zhangfei',40,'m','java',456,5000),
(10,'guanyu',50,'m','bdata',789,6000);
#2、由于guosiyu表现不好,扣工资1000
update stu1 set gongzi=gongzi-1000 WHERE name='guosiyu';

#3、将yuhuafei姓名修改为yudaye
update stu1 set name='yudaye' WHERE name='yuhuafei';

#4、添加状态列state
ALTER TABLE stu1 ADD state ENUM('1','0') DEFAULT '1';

#5、查询所有员工的姓名及工资情况
select name,gongzi from stu1;

#6、查询年龄超过100岁的员工
select name from stu1 where age>100;

#7、查询工资低于5000的员工信息
select name,age from stu1 WHERE gongzi<5000;

#8、查询姓名以zhang开头的员工信息
SELECT * from stu1 where name like 'zhang%';

#9、查询linux学科中员工信息,并以工资升序排列
select * from stu1 WHERE xueke='linux' ORDER BY gongzi;


#10、统计不同学科的总工资(sum())
SELECT xueke,sum(gongzi) from stu1 GROUP BY xueke;


#----------扩展--------
#注:函数介绍
#avg()    求平均数
#max()    求最大值
#min()    求最小值
#count()  统计个数
#----------------

#11、统计不同学科的平均工资(avg())
SELECT xueke,AVG(gongzi) from stu1 GROUP BY xueke;


#12、统计不同学科的最高工资(max())
SELECT xueke,MAX(gongzi) from stu1 GROUP BY xueke;


#13、统计不同学科的最低工资(min())的员工
SELECT xueke,name,min(gongzi) from stu1  GROUP BY xueke;


#14、统计男、女性别的员工数量(count())
SELECT gender,count(gender) from stu1 GROUP BY gender;


#15、统计各个学科的员工数量(count())
SELECT xueke,count(xueke) from stu1 GROUP BY xueke;

多表连接查询

传统连接

where A.ID=B.ID
select ci.name,ci.countrycode,ci.population,co.name from city as ci,country as co where ci.countrycode=co.code and ci.population<100;

SELECT ma.`mname`,stu1.`name`,stu1.`gongzi` FROM stu1,ma WHERE stu1.`bumen`=ma.`bumen` AND stu1.`name`='guosiyu';
SELECT city.`Name`,country.`Name`,city.`Population` FROM city,country WHERE city.`CountryCode`=country.`Code` AND city.`Population`<100;

join 连接

SELECT ma.`mname`,stu1.`name`,stu1.`gongzi` FROM stu1 
JOIN ma
ON stu1.`bumen`=ma.`bumen`
WHERE stu1.`name`='guosiyu';
#查询人口数量最多的城市名、所在国家、大洲
SELECT city.`Name`,country.`Name`,country.`Continent`,
MAX(city.`Population`)
FROM city
JOIN country
ON city.`CountryCode`=country.`Code`;
#查询亚洲,人口数量超过500w的城市名,所在国家名字
SELECT country.`Name`,city.`Name`,city.`Population` AS cp
FROM city
JOIN country
ON city.`CountryCode`=country.`Code`
WHERE city.`Population`>5000000 AND country.`Continent`='asia'
ORDER BY cp DESC;
#统计亚洲,城市人口数量超过500w的城市的数量
SELECT country.name,COUNT(city.name)
FROM city
JOIN country
ON city.`CountryCode`=country.`Code`
WHERE city.`Population`>5000000 AND country.`Continent`='asia'
GROUP BY country.`Name`

Acc_bill:账单表
Acct_id bill_id bill_sts bill_mon

Acc_bill_dtl:账单明细表
Bill_id fee_item_id amount rax_rate

账单月是2018.4月的整月账单数据

Select  *   from  Acc_bill    where bill_mon=’2018-4’;

账单编号是2001020的账单总金额

select bill_id,sum(amount) from Acc_bill_dtl where Bill_id=’20010120’;

账单月是2018.4月的税率有几种类型,并按照税率大小倒序排列

select a. bill_mon,count(b.tax_rate) from a
Join b
On a.bill_id=b.bill_id
Where a.bill_mon=’2018-4’
Group by a.bill_mon
Order by b.tax_rate desc;

内连接

select A.xx ,B.xxxx from A join B on A.xxx=B.xxx where 

自动连接 (natural join)
两个表有相同的字段countrycode

select name,countrycode,language,population from city natural join countrylanguage where population > 1000000 order by population;
mysql> desc city;
+-------------+----------+------+-----+---------+----------------+
| Field       | Type     | Null | Key | Default | Extra          |
+-------------+----------+------+-----+---------+----------------+
| ID          | int(11)  | NO   | PRI | NULL    | auto_increment |
| Name        | char(35) | NO   |     |         |                |
| CountryCode | char(3)  | NO   | MUL |         |                |
| District    | char(20) | NO   |     |         |                |
| Population  | int(11)  | NO   |     | 0       |                |
+-------------+----------+------+-----+---------+----------------+
5 rows in set (0.01 sec)

mysql> desc countrylanguage;
+-------------+---------------+------+-----+---------+-------+
| Field       | Type          | Null | Key | Default | Extra |
+-------------+---------------+------+-----+---------+-------+
| CountryCode | char(3)       | NO   | PRI |         |       |
| Language    | char(30)      | NO   | PRI |         |       |
| IsOfficial  | enum('T','F') | NO   |     | F       |       |
| Percentage  | float(4,1)    | NO   |     | 0.0     |       |
+-------------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
Select s.snmae,c.cname,sc.score  from sJoin scOn s.sno=sc.snoJoin cOn sc.cno=c.cnoWhere c.cname=’xxxx’ and sc.score>85;

join
上海市属于哪个国家

select ci.name,ci.countrycode,co.name from city as ci,country as co where ci.countrycode=co.code and ci.name='shanghai';

select ci.name,ci.countrycode,co.name from city as ci join country as co on ci.countrycode=co.code and ci.name='shanghai';

外连接

left join

select A.xx ,B.xxxx from A left join B on A.xxx=B.xxx and xxx>60
select ci.name,ci.countrycode,co.name from city as ci left join country as co on ci.countrycode=co.code and ci.name='shanghai';

right join

子查询

# 查找linux部门低于平均工资的员工姓名

SELECT NAME,gongzi  FROM stu1
WHERE xueke='linux'
AND gongzi<(SELECT AVG(gongzi)
FROM stu1 
WHERE xueke='linux');
select name from country where code= (select countrycode from city where population > 10000000);

select chnt.name,chnt.population from (select name,countrycode,population from city where countrycode='CHN') chnt limit 10;

select chnt.name,chnt.population from (select name,countrycode,population from city where countrycode='CHN') chnt where chnt.population>5000000  limit 10;

使用explain查看select语句的执行计划

mysql> explain select * from test where name='oldboy'\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: test
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 5
        Extra: Using where
1 row in set (0.00 sec)

mysql> alter table test add index ind_name(name(8));
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> explain select * from test where name='oldboy'\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: test
         type: ref
possible_keys: ind_name
          key: ind_name
      key_len: 24
          ref: const
         rows: 1
        Extra: Using where
1 row in set (0.00 sec)

更新数据

update 表名 set 字段=新值,… where 条件(一定要注意条件)
mysql> select * from test;
+----+---------+
| id | name    |
+----+---------+
|  1 | oldboy  |
|  2 | oldgirl |
|  3 | inca    |
|  4 | zuma    |
|  5 | kaka    |
+----+---------+
5 rows in set (0.00 sec)

mysql> update test set name='gongli' where name='oldgirl';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from test;                                
+----+--------+
| id | name   |
+----+--------+
|  1 | oldboy |
|  2 | gongli |
|  3 | inca   |
|  4 | zuma   |
|  5 | kaka   |
+----+--------+
5 rows in set (0.00 sec)

防止误操作MySQL数据库一例

在mysql命令加上选项-U后,当发出没有WHERE或LIMIT关键字的UPDATE或DELETE时,mysql程序就会拒绝执行

mysql -S /data/3306/mysql.sock -uroot -poldboy -U

删除数据

一行一行的删除

mysql> delete from test where id=3;
Query OK, 1 row affected (0.00 sec)

mysql> select * from test;         
+----+--------+
| id | name   |
+----+--------+
|  1 | gongli |
|  2 | gongli |
|  4 | gongli |
|  5 | gongli |
+----+--------+
4 rows in set (0.00 sec)

全部删除数据

mysql> truncate table test;
Query OK, 0 rows affected (0.00 sec)

适用场景:drop table 可以先 truncate table ,然后 drop table

删除数据(2)

通过状态删除表中的数据(update代替delete)

alter table student add status int default 1;

mysql> select * from test where state=1;
+----+---------+-------+
| id | name    | state |
+----+---------+-------+
|  1 | oldboy  |     1 |
|  2 | oldgirl |     1 |
|  3 | inca    |     1 |
|  4 | zuma    |     1 |
|  5 | kaka    |     1 |
+----+---------+-------+
5 rows in set (0.00 sec)


mysql> update test set state=0 where id=2;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from test where state=1;
+----+--------+-------+
| id | name   | state |
+----+--------+-------+
|  1 | oldboy |     1 |
|  3 | inca   |     1 |
|  4 | zuma   |     1 |
|  5 | kaka   |     1 |
+----+--------+-------+
4 rows in set (0.00 sec)

逻辑删除数据实例

mysql> alter table test add state tinyint(2);
Query OK, 4 rows affected (0.03 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> select * from test where state=1;     
Empty set (0.00 sec)

mysql> desc test;
+-------+------------+------+-----+---------+----------------+
| Field | Type       | Null | Key | Default | Extra          |
+-------+------------+------+-----+---------+----------------+
| id    | int(4)     | NO   | PRI | NULL    | auto_increment |
| name  | char(20)   | NO   | MUL | NULL    |                |
| state | tinyint(2) | YES  |     | NULL    |                |
+-------+------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

mysql> select * from test;
+----+--------+-------+
| id | name   | state |
+----+--------+-------+
|  1 | gongli |  NULL |
|  2 | gongli |  NULL |
|  4 | gongli |  NULL |
|  5 | gongli |  NULL |
+----+--------+-------+
4 rows in set (0.00 sec)

mysql> update test set state='1';    
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4  Changed: 4  Warnings: 0

mysql> select * from test;       
+----+--------+-------+
| id | name   | state |
+----+--------+-------+
|  1 | gongli |     1 |
|  2 | gongli |     1 |
|  4 | gongli |     1 |
|  5 | gongli |     1 |
+----+--------+-------+
4 rows in set (0.00 sec)

mysql> select * from test where state=1;
+----+--------+-------+
| id | name   | state |
+----+--------+-------+
|  1 | gongli |     1 |
|  2 | gongli |     1 |
|  4 | gongli |     1 |
|  5 | gongli |     1 |
+----+--------+-------+
4 rows in set (0.00 sec)

mysql> update test set state='0' where id=4;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from test where state=1;    
+----+--------+-------+
| id | name   | state |
+----+--------+-------+
|  1 | gongli |     1 |
|  2 | gongli |     1 |
|  5 | gongli |     1 |
+----+--------+-------+
3 rows in set (0.00 sec)

用户相关


权限相关


索引

创建索引

ALTER TABLE student ADD INDEX idx_name(name);

CREATE INDEX idx_age ON student(age);

查看索引

SHOW INDEX FROM student;

删除索引

ALTER TABLE student drop INDEX idx_age;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wuxingge

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值