您的位置:首页 > 数据库 > MySQL

mysql常用命令(笔记)

2015-05-06 17:38 585 查看

win32-mysql配置
将win32-mysql放到某个目录下
在配置环境变量
C:\mysql\lib;C:\mysql\bin加入环境变量


远程连接ubuntu下mysql:
1、vim /etc/mysql/my.cnf找到bind-address = 127.0.0.1
注释掉这行,如:#bind-address = 127.0.0.1
或者改为: bind-address = 0.0.0.0
允许任意IP访问;
或者自己指定一个IP地址。
重启 MySQL:sudo /etc/init.d/mysql restart


2、要连接远端mysql,需要将端口3306可访问
安装ufw
sudo apt-get install ufw
添加规则
sudo ufw allow 3306/tcp

//设置数据库密码
set password=password('sysheng');

//创建新数据库
CREATE DATABASE [IF NOT EXISTS] db_name [CHARACTER SET charset_name];

//使用数据库
USE db_name;

//删除数据库
DROP DATABASE db_name;

//创建新用户
USE mysql;
GRANT ALL ON db_name.* TO user_name IDENTIFIED BY 'password';
例如
GRANT ALL ON db1.* TO dbuser1 IDENTIFIED BY 'sysheng';

//登录mysql后
SET NAMES utf8;
统一字符集:
1//首先操作系统的字符集为utf8
2//查看操作系统字符集命令 locale
3//创建数据库的时候使用CHARACTER SET utf8;指定字符集为utf8
4//设置mysql_client字符集为utf8

//SET NAMES命令为设置mysql环境的字符集
//常用的字符集有
--gbk,gb2312,big5,utf8,ascii

source script_name.sql //source命令为执行一个sql脚本

例子:
CREATE DATABASE db1 CHARACTER SET utf8;
USE db1;

//sql是面试的重点
//建表语句
CREATE TABLE table2
(
name varchar(20),
sex char(10),
age INT,
class varchar(20),
)

//查找表结构
desc tablename;

//插入数据
INSERT INTO table1 (name, sex, age, class) VALUES ('苏永胜0', '男', 12, '1214');
INSERT INTO table1 (name, sex, age, class) VALUES ('苏永胜1', '女', 12, '1214');
INSERT INTO table1 (name, sex, age, class) VALUES ('苏永胜2', '男', 12, '1214');

//查找语句
SELECT name FROM table1;
SELECT name FROM table1 LIMIT 0,5;
SELECT * FROM table1 WHERE age > 21 AND age < 30;
SELECT * FROM table1 WHERE age = 12;
SELECT * FROM table1 WHERE name LIKE '苏%';

*mysql查询百万级别的数据速度还行,达到亿级的数据可能有点吃力

对于SELECT语句中的逻辑判断操作符一定要灵活使用,熟练
SELECT * FROM table1 WHERE  age in (12, 118);
SELECT * FROM table1 WHERE  age  NOT IN (12, 118);
SELECT * FROM table1 WHERE  name NOT LIKE '苏%';

//window 访问远程mysql
window中加入path环境变量
C:\mysql\lib;C:\mysql\bin
mysql端口号3306, 要在linux中将3306添加到防火墙的信任端口列表中
登入远程mysql命令:
mysql -h IP -u 用户名 -p

列的别名
SELECT name 姓名, sex 性别, age 年龄 FROM table1;
表别名
SELECT a.name, a.sex FROM table1 a;

//聚合函数
//DISTINCT 去掉重复项
SUM([DISTINCT] FILE) //求指定列的和
MAX
MIN
AVG
COUNT
SELECT SUM(age) FROM table1;
SELECT SUM(DISTINCT age) FROM table1; //去掉重复值
SELECT MAX(age) FROM table1;
SELECT name FROM table1 WHERE age = (SELECT MAX(age) FROM table1);
SELECT name, MAX(age) FROM table1;
SELECT COUNT(*) from table1;
SELECT COUNT(DISTINCT *) FROM table1;

SELECT * FROM table1 GROUP BY age;
//聚合函数往往是和group by子句配合使用的
SELECT COUNT(class), class FROM table1 GROUP BY class;

//ORDER BY
SELECT * FROM table1 ORDER BY age, name desc;

//多表查询
SELECT * FROM table1, table2 WHERE table1.age = table2.age;

CREATE TABLE table3(
teacher varchar(100),
class varchar(100)
);
INSERT INTO table3 (teacher, class) VALUE ('aaa', '1214');

//创建索引
在不读取整个表的情况下,索引是数据库应用程序可以更快的查找数据
可以在表中创建索引,以便加快索引速度,数据库会自动用索引
//CREATE INDEX
CREATE INDEX index name ON table name (column name) //culumn name规定需要索引的列
//CREATE UNIQUE INDEX语法(唯一索引,保证字段没有重复)
CREATE UNIQUE INDEX index name ON table name (column name);
//例子
CREATE INDEX table1_age ON table1 (age);
//在select语句中where查询用到那个字段,这个字段就必须建立索引

//SQL语句的重点是SELECT
WHERE条件和多表查询
对于SELECT后面的WHERE子句中用到的字段,原则是必须建相应的索引,索引不要乱建,精准,不能多
索引可以提高SELECT语句的速度,但代价是降低了INSERT,UPDATE和DELETE语句的速度

//修改数据语句
UPDATE TABLENAME SET CLA1=VAL WHERE CAL =;
//删除语句
DELETE FROM table1 where name=' ';

//数据库编程
#include <mysql/mysql.h>

数据库clinet与server也是采用TCP协议,
1、初始化client
2、建立连接
3、接收和发送(客户端向server发送SQL,server将执行SQL语句的结果返回给client)
4、断开连接

//数据库编程样例
#include <stdio.h>
#include <stdlib.h>
#include <mysql/mysql.h> //包含mysql头文件
#include <unistd.h>
#include <string.h>
#include <errno.h>

int main(void)
{

MYSQL mysql;
MYSQL *conn;
int status;
mysql_init(&mysql); //初始化mysql,相当于mysql内部初始化了一个TCP的socket
//连接到mysql server
conn = mysql_real_connect(&mysql, "127.0.0.1", "dbuser1", "sysheng", "db1", 0, 0, 0);
if(conn == NULL)
{
printf("connect error, %s\n", mysql_error(&mysql));
return -1;
}
status = mysql_query(conn, "SET NAMES utf8");
if(status != 0)
{
printf("query error.%s\n", mysql_error(&mysql));
return -1;
}

char SQL[1024];
char name[1024];
memset(SQL, 0, sizeof(SQL));
sprintf(SQL, "%s", "请输入要干掉的名字>:");
write(STDOUT_FILENO, SQL, strlen(SQL)); //这句话是替代printf函数的,这样不许
需要\n也可以向屏幕输出
memset(name, 0, sizeof(name));
read(STDIN_FILENO, name, sizeof(name)); //等待用户输入

memset(SQL, 0, sizeof(SQL));
name[strlen(name)-1] = 0; //将字符串最后一位\n替换为0
//等待用户输入要删除的名字,假设用户输入的
sprintf(SQL, "DELETE FROM table1 WHERE name = '%s';", name);
printf("%s\n", SQL);
status = mysql_query(conn, SQL);

mysql_close(conn);//关闭连接

puts("Hello World!!\n");
return EXIT_SUCCESS;
}

命令
stty erase ^H
按退格键不回显
////////////去掉退格键回显代码////////////////////
void strattr()
{
struct termios term; //定义一个temions结构
if(tcgetattr(STDIN_FILENO, &term) == -1)
{
printf("tcgetattr error is %s\n", strerror(errno));
return;
}
//oldterm = term //保留termios设置,以便程序退出时候可以恢复
/*
term.c_lflag &= ~ICANON; //取消ICANON选项(不规范输入)
term.c_lflag |= ICANON; //设置ICANON选项(规范输入)
term.c_cc //字段为要设置的具体特殊输入字符,如c_cc[VERASE]代表退格键
term.c_cc[VERASE] = '\b';意思为把退格键修改为'\b'
VERASE代表向前擦出一个字符,VINTR代表ctrl+C中断信号,ctrl+C的ASII码为3
例如:term_c_cc[VINTR] = '\t';意思为将tab键设置为终端信号
tcsetattr中,第二个参数说明,TCSAFLUSH:发送了所有输出后更改才生效,在更改发生时,未读取的所有输入数据都被删除
TCSANOW:更改立即生效
TCSADRAIN:发送了所有输出后更改才发生,如果更改输出参数则应该使用该选项
*/
term.c_cc[VERASE] = '\b'; //'\b'为退格键的ASCII码
if(tcsetattr(STDIN_FILENO, TCSANOW, &term) == -1)
{
printf("tcsetattr error is %s\n", strerror(errno));
}
return ;
}

//执行SELECT语句得到查询结果,成功返回一个查询结果指针,查询无结果或者错误返回NULL
MYSQL_RES result = *mysql_store_result(MYSQL *pmysql);
//调用完mysql_store_result,一定要用mysql_free_result释放相关的资源

//查看查询结果
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
//例子
MYSQL_ROW row;
while(row = mysql_fetch_row(result) != NULL)
{
printf("name:%s,sex:%s,age:%s,class:%s\n", row[0], row[1], row[2], row[3]);
}
//尽管在表中age是数字,但mysql返回的只不过是以NULL结尾的字符串

//查看查询中的字段信息
MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result);
//例子
while((sqlField = mysql_fetch_field(result)) != NULL)
{
printf("%s\n", sqlField->name);
}

mysql_fetch_row 返回的是记录(行)
mysql_fetch_field返回的是字段(列)

//心得
模块化的时候,如果写一个函数还没有具体思想的时候,函数可以没有返回值,也没有参数,逐步的完善
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: